搭建51单片机开发环境 
效果展示 
点亮D2LED灯 
前提条件 
- 已学习微机原理
- 了解如何在终端中运行指令
- 一块51单片机开发板(本文采用了普中A2开发板, MCU为STC89C52RC)
- 下载开发板原理图. 普中科技-各型号产品资料下载链接
- 下载STC89C52RC数据手册. STC 技术支持 数据手册
原理解析 
- 打开开发板原理图, 找到D2LED灯. 发现其一端连着VCC, 另一端连着P2.1引脚.
- 打开STC89C52RC数据手册, 找到管脚说明章节. 发现P2.1引脚内部有上拉电阻, 未使用时为高电平, 故D2LED灯默认不亮, 需要单片机将P2.1引脚设置为低电平才会亮. 这一步需要修改单片机中的程序才能实现.
- 修改单片机中的程序总共需要3步. main.c-编译->firmware.hex-烧录->MCU ROM- 使用c语言编写一个文本文件main.c
- 使用编译器将main.c文件转换为一个机器码文件firmware.hex(当然也可以叫其它名字)
- 使用烧录器将firmware.hex文件烧录到单片机ROM中
 
- 使用c语言编写一个文本文件
实现 
安装编译器 SDCC 
本文使用的编译器是SDCC.
- Window: 打开上述网站下载并安装
- Linux: 使用包管理工具安装
- macOS: 使用 Homebrew 安装bashbrew install sdcc
安装完成后, 查看SDCC版本, 如果有输出说明安装成功.
bash
sdcc -v编写源码 
示例代码 codes/demo200-51-led
- 打开STC89C52RC数据手册, 找到P2寄存器的地址为0xA0(3.3特殊功能寄存器), 寄存器默认值为0b11111111. 如果需要将P2.1引脚设置为低电平, 则需要将改寄存器的值修改为0b10111111
- 打开SDCC 用户手册. 发现存在两个关键字__sfr和__sbit. 它们的作用分别为:- __sfr(Special Function Register)关键字用于声明 8051 微控制器中的特殊功能寄存器, 这些寄存器与微控制器的特定硬件功能(如端口、定时器、串口等)直接相关. __sfr 允许程序员通过变量名直接访问这些寄存器.
 c__sfr __at (0x80) P0; // P0 被声明为一个特殊功能寄存器, 地址为 0x80 P0 = 0b00001111; // 将 P0 寄存器的值设置为 0b00001111- __sbit(Special Bit)关键字用于声明和访问特殊功能寄存器中的单个位, 通常用于直接控制或读取某个位的状态, 比如控制引脚的高低电平
 c__sbit __at (0x90) P0_0; // P0_0 被声明为一个特殊位, 对应 P0 端口的第 0 位 P1_0 = 0; // 将 P1.0 设为低电平
- 创建文件夹demo200-51-led
- 创建文件demo200-51-led/src/main.cc__sbit __at (0xA1) P2_1 ; void main() { P2_1 = 0; // 将 P2.1 设为低电平 while (1) {} }
编译 
- 使用编译器将main.c文件转换为一个机器码文件firmware.hexbashmkdir build # 如需 sdcc -o build/firmware.hex src/main.c
- 打开firmware.hex文件, 发现内容物是一堆机器码.txt:03000000020006F5 ... :00000001FF
烧录 
我们打开STC89C52RC数据手册, 10.1.1 在系统可编程(ISP)原理使用说明. 了解到给STC89C52RC微控制器烧录程序有 5 个步骤, 其中前两个步骤需要程序员来进行操作. 
- 程序员使用PC端烧录软件向单片机传输命令流
- 程序员手动给单片机上电复位
- 单片机复位后检测RxD是否有合法下载命令流
- 单片机下载用户程序
- 单片机进入用户程序区
了解了基本流程后, 我们开始实现这个流程.
- 查看开发板原理图得知该开发板使用CH340芯片, 通过该芯片USB信号转换为TTL(Transistor-Transistor Logic)电平信号, 进而将程序从PC下载到单片机. 为此我们将需要安装CH340芯片的驱动, 使得PC能够将开发板识别为一个普普通通的USB设备.
- 在 Linux, macOS上你可以通过查看/dev/文件夹的文件列表来查看操作系统设备到的设备.bashls /dev/cu* # 使用CH340芯片的USB设备一般是cu开头
- (如需)根据你的PC的操作系统安装对于的驱动 wch CH341 驱动下载. 安装完成后再次列出设备, 看看PC是否已经设备到开发板. 我的设备路径是/dev/cu.usbserial-140
- (如需)本次我们将使用stcgal 烧录器进行烧录. 请根据文档要求进行安装bashpip3 install stcgal stcgal -V # 验证安装, 成功会返回版本号
- 将开发板连接到PC, 按下开发板电源开关, 使得开发板通上电.
- 运行烧录指令, 获得提示 "Waiting for MCU, please cycle power".bashsdcc -o build/firmware.hex src/main.c
- 根据提醒, 按下开发板电源开关, 开发板断电. 再次按下开发板电源开关, 开发板通电. 如果一切运行良好, 终端中会打印出一些文字, 类似"Writing flash: 640 Bytes [00:00, 7483.63 Bytes/s]". 显示出PC正在向单片机传输程序.
- 传输完成后, 单片机会自动开始运行收到的用户程序. 也就是我此时我们应该能看到D2LED灯被点亮.
额外练习:
- 通过修改P2寄存器的值来控制LED灯的亮灭.
(可选)安装 PlatformIO 
尽管我们在命令行中手动完成整个流程, 但是使用安装PlatformIO可以一些额外的好处. 比如说, 自动找到开发板的设备名称.
示例代码 codes/demo201-51-platformio-led
- 下载VS Code
- 在VS Code中安装PlatformIO插件
- 创建PlatformIO工程, 开发板型号选择STC89C52RC
- 编写main.c
- 编译工程以生成机器码文件 .pio/build/STC89C52RC/firmware.hex- 选项1: 使用PlatformIO插件的Build按钮
- 选择2: PlatformIO CLI(需要手动安装, 然后把路径添加到环境变量中)bashpio run
 
- 选项1: 使用
- 将机器码文件烧录进MCU中.Platform IO自带烧录器, 但是我实际操作没有成功过, 所以我采用的都是手动模式bash# 使用 pio pio run --target upload # 使用 stcgal stcgal -P stc89 -p /dev/cu.usbserial-140 ./.pio/build/STC89C52RC/firmware.hex