单片机开发入门学习

最近想学习一下比较底层一点的东西,一方面是出于爱好,另一方面是想在掌握一门新的技术,自己手头上的单片机是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);
}

发表评论

CAPTCHAis initialing...