背景
之前接触了一下摄像头的开发,突然对单片机开发产生了兴趣,最近弄了一个51单片机自己研究。几经折腾,最小系统焊了一个,买了一个。现在到了自己烧程序这步,发现很多都是使用Keil uVision
开发,使用STC-ISP
烧入,还需要CH340
驱动。但是这都是Windows
平台的,不想换电脑,也不行使用虚拟机,就找了一下再macOS
上搭建开发环境,还真的很简单。
设备
Macbook Pro ( Intel ),如果其他版本可能需要实测
STC89C52RC 单片机及开发板
软件
CH340/CH341 的 USB 转串口驱动程序
交叉编译器 sdcc
程序下载器 stcgal
一个趁手的代码编辑器,如:vscode
驱动安装
沁恒微电子提供了 CH340/CH341 的 USB 转串口驱动程序。
解压后运行 pkg 文件,按照提示即可简单的完成安装。
软件安装
1
2
3
4
5
# 交叉编译器 sdcc 安装
brew install sdcc
# stcgal 安装
pip install stcgal
测试
下面将写一个代码让单片机控制一个 LED 灯闪烁。
电路说明
使用焊好的 51 单片机最小系统:
连接LED:将 LED 灯的正极连接到单片机的 P25 针脚,LED 负极连接 GUN 针脚
连接下载器:将下载器的 GUN 连接到单片机的 GUN,下载器的 RXD(Receive接收) 连接到单片机的 TXD(Transmit发射),下载器的 TXD 连接到单片机的 RXD,下载器的 VCC 连接到单片机的 VCC。
代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <8051.h>
#define LED P2_5
// sbit LED = P1_0; // 定义LED灯连接到P1.0引脚
void Delay(unsigned int ms) { // 延时函数
unsigned int i, j;
for (i = ms; i > 0; i--)
for (j = 110; j > 0; j--); // 简单的延时循环
}
void main() {
while (1) {
LED = 0; // 点亮LED灯(低电平有效)
Delay(500); // 延时500毫秒
LED = 1; // 熄灭LED灯(高电平)
Delay(500); // 延时500毫秒
}
}
注意:
macOS 环境下的代码和 Windows 环境下的代码有略有区别:
区别 | Windows | macOS |
---|---|---|
头文件 | reg51.h/reg52.h | 8051.h/8052.h |
IO端口 | P2^5 | P2_5 |
IO端口定义 | sbit LED = P1_0; | #define LED P2_5 |
中断函数 | void INTO_ISR() interrupt 0 | void INTO_ISR() __interrupt 0 |
编译
1
2
# 编译
sdcc main.c
编译完成后会在目录下生成好几个文件,这里面的 .ihx
就是我们最终要烧入的程序。
注意:这个 .ihx
是 macOS 系统下生成的文件,如果是Windows生成的是 .hex
文件。
烧入
1
2
# 查找串口设备
ll /dev/tty.*
1
2
# 烧入
stcgal -P stc89 -p /dev/tty.wchusbserial-1410 main.ihx
注意:执行完烧入命令后,会返回Waiting for MCU, please cycle power:
,然后一直等着,这个时候需要断电一下再上电(断开 VCC 的连接线,再插上即可)。
注意
下载器的 RXD(Receive接收) 连接到单片机的 TXD(Transmit发射),下载器的 TXD 连接到单片机的 RXD,是交叉连接而不是对应连接,不要接错了。
为了保护 LED 不会被烧坏,可以连接一个电阻。
如果是买的现成的最小系统,可能晶振是没有焊接一起的,需要手动插上。
这个过程中不需要另外接电源,因为下载器已经供电了(通过 VCC 和 GUN 供电)。
单片机不要插反了,对好缺口。
代码控制的是 P25 针脚,LED 插到其他针脚不会闪烁,只会常亮。