最近想学习一下比较底层一点的东西,一方面是出于爱好,另一方面是想在掌握一门新的技术,自己手头上的单片机是STC89C52R。于是网上的一些相关资料进行了整理。
一,相关学习教程
文字学习内容
https://www.dotcpp.com/course/scm/
视频学习内容
https://www.bilibili.com/video/BV1Jb411p74g?p=1
二,编译环境搭建
受陈同学的启发为避免重复的环境搭建,以及能在多个平台中进行无缝开发,于是在购买的liunx服务器上搭建ssdc进行编译,通过ssh进行编辑。搭建步骤如下
1)安装sdcc
sudo apt-get install sdcc
sudo apt-get install libvte-dev
2)安装gSTC-ISP
下载地址:http://sourceforge.net/projects/gstcisp/files/
1:解压 tar -zxvf gSTC-ISP_v1.0.tar.gz
2: 进入目录 gSTC-ISP
3:运行 ./configure
4: 进入到src目录下,打开 makefile 把CFLAGS = -g -O2修改为CFLAGS = -g -O2 -I/usr/include/vte-0.0/
5:编译安装 :make; make install
6:运行 可用命令 gSTCISP
环境搭建特别鸣谢:https://blog.csdn.net/weixin_33694620/article/details/85852123
三.编程上ssdc与keil的区别
SSDC | keil | |
---|---|---|
头文件 | 8051.h/8052.h |
reg51.h/reg52.h |
IO口 | P1_0 |
P1^0 |
IO口定义 | #define LED P1_0 |
sbit LED = P1^0 |
中断函数 | void INT0_ISR() __interrupt 0 |
void INT0_ISR() interrupt 0 |
编程区别特别鸣谢:
https://tylinux.com/post/develop-mcs51-on-macOS/
四.引脚功能图
五.学习过程中掌握到的源码
https://github.com/JunjieHuang945/helloSTC.git
1)Makefile文件
CC =sdcc
all : main.bin
main.bin : main.hex
objcopy -I ihex -O binary main.hex main.bin
main.hex : main.ihx
packihx main.ihx > main.hex
main.ihx : main.rel delay.rel
$(CC) main.rel delay.rel
main.rel : main.c delay.h
$(CC) -c main.c
delay.rel : delay.c
$(CC) -c delay.c
cleanall:
rm -rf *.lk *.bin *.asm *.lst *.mem *.rst *.lnk *.rel *.sym *.ihx *.hex *.map
clean:
rm -rf *.asm *.lst *.mem *.rst *.lnk *.rel *.sym *.ihx *.map *.lk *.bin
Makefile主要定义了多文件的使用,通过该示例可以将一部分代码抽离使得代码保持美观。
2)main.c文件
#include<8052.h>
#include "delay.h"
//通过宏形式定义寄存器名称
#define LED P1_1
unsigned int j;
//时间控制
unsigned int ONOFFSET[24]={1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
/**
*初始化中断函数
**/
void Ini1init(){
IT1=1;
EX1=1;
EA=1;
}
int main(){
unsigned int i;
LED = 0;//初始化
Ini1init();
//通断测试
for(i=0;i<3;i++){
LED = 1;
delay_s(1);
LED = 0;
}
while (1)
{
if (j=24)
{
j=0;
}
LED = ONOFFSET[j];
delay_h(1);
j++;
}
return 0;
}
void Int1() __interrupt 2{
j = 0;
LED = ONOFFSET[j];
}
main.c文件定义了中断函数,引脚控制等功能。
3)delay.h与delay.c
delay.h
#ifndef DELAY_H
#define DELAY_H
void delay_ms(unsigned int i);
void delay_s(unsigned int i);
void delay_m(unsigned int i);
void delay_h(unsigned int i);
#endif
delay.c
#include "delay.h"
void delay_ms(unsigned int i){
unsigned char j;
for(i; i > 0; i--)
for(j = 255; j > 0; j--);
}
void delay_s(unsigned int i){
delay_ms(i*1000);
}
void delay_m(unsigned int i){
delay_s(i*60);
}
void delay_h(unsigned int i){
delay_m(i*60);
}