前言
网上大多数 51 单片机教程都基于 Keil C51,但 Keil 是商业软件,评估版有 2KB 代码限制,公司电脑用还有合规风险。我用SDCC(开源免费)+ Notepad++ + STC-ISP/普中ISP这套完全免费、合法的工具链,跑通了 51 单片机点灯,记录一下完整步骤。
工具链
| 工具 | 作用 |
|---|---|
| SDCC | 开源 8051 C 编译器,免费、跨平台 |
| Notepad++ | 轻量级文本编辑器,写代码用 |
| objcopy | 把 SDCC 的 .ihx 转成标准 Intel HEX |
| STC-ISP / 普中ISP | 烧录软件,通过串口下载程序 |
SDCC安装
下载安装包
- 访问官网:https://sdcc.sourceforge.net/
- 或GitHub Releases:https://github.com/sdcc/sdcc/releases
下载 sdcc-x.x.x-x64-setup.exe 2. 运行安装向导
一直下一步就行了,应用会自动配置环境变量sdcc -v打印如下说明安装成功
第一步:写代码
目录: D:\project\STC51\01_led_test Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 2026-09-28 18:29 149 led.c <-用 Notepad++ 新建 led.c:
#include<mcs51/8051.h>// 引入 8051 寄存器定义,P0~P3 都在这里voidmain(void)// 主函数,程序从这里开始执行{while(1)// 死循环,让程序一直运行不退出{P2=0xFE;// 往 P2 寄存器写 0xFE(二进制 11111110)// P2.0 输出低电平,点亮接在 P2.0 的 LED// 其他 P2.1~P2.7 输出高电平,对应的 LED 灭}}为什么是 0xFE?
0xFE = 二进制 11111110,最低位(P2.0)是 0,其余是 1。
51 单片机的 LED 通常是低电平点亮,所以 P2.0 输出低电平,灯亮。
第二步:编译
在代码目录下打开命令行(PowerShell 或 CMD),执行:
sdcc-mmcs51--model-small--iram-size 256--xram-size 0--code-size 8192 led.c命令参数解释:
| 参数 | 含义 |
|---|---|
| -mmcs51 | 编译目标为 8051 架构 |
| –model-small | 使用小内存模型(默认,适合大多数 51 芯片) |
| –iram-size 256 | 内部 RAM 大小 256 字节 |
| –xram-size 0 | 外部 RAM 大小 0(没有外扩 RAM) |
| –code-size 8192 | 程序代码最大 8192 字节(8KB) |
| led.c | 要编译的源文件 |
执行成功后,目录下会生成 led.ihx 文件。
目录: D:\project\STC51\01_led_test Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 2026-10-08 18:42 8769 led.asm -a---- 2026-09-28 18:29 149 led.c -a---- 2026-10-08 18:42 543 led.ihx <- -a---- 2026-10-08 18:42 253 led.lk -a---- 2026-10-08 18:42 23979 led.lst -a---- 2026-10-08 18:42 17101 led.map -a---- 2026-10-08 18:42 1192 led.mem -a---- 2026-10-08 18:42 4167 led.rel -a---- 2026-10-08 18:42 24369 led.rst -a---- 2026-10-08 18:42 39624 led.sym第三步:转标准 HEX
SDCC 默认输出的 .ihx 格式,很多烧录软件(尤其是普中 ISP)不认。用 objcopy 转成标准 Intel HEX:
objcopy-I ihex-O ihex led.ihx led_std.hex命令参数解释:
| 参数 | 含义 |
|---|---|
| -I ihex | 输入格式为 Intel HEX(SDCC 的 .ihx 属于此类) |
| -O ihex | 输出格式为标准 Intel HEX |
| led.ihx | 输入文件 |
| led_std.hex | 输出文件(标准 HEX,烧录软件能识别) |
如果普中 ISP 报“传入的 hex 文件格式错误”,就是这一步没做,或者用了 packihx 但格式仍不标准。
目录: D:\project\STC51\01_led_test Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 2026-10-08 18:42 8769 led.asm -a---- 2026-09-28 18:29 149 led.c -a---- 2026-10-08 18:42 543 led.ihx -a---- 2026-10-08 18:42 253 led.lk -a---- 2026-10-08 18:42 23979 led.lst -a---- 2026-10-08 18:42 17101 led.map -a---- 2026-10-08 18:42 1192 led.mem -a---- 2026-10-08 18:42 4167 led.rel -a---- 2026-10-08 18:42 24369 led.rst -a---- 2026-10-08 18:42 39624 led.sym -a---- 2026-10-08 18:47 595 led_std.hex <-第四步:烧录
方式一:STC-ISP
用 USB 线连接开发板,确认设备管理器里能看到串口(CH340 或 CP2102)。
打开 STC-ISP,选择:
- 芯片型号:如 STC89C52RC(和芯片丝印一致)
- 串口号:设备管理器里看到的 COM 口
- 程序文件:选中
led.ihx或者led_std.hex
冷启动:
- 点击“下载/编程”按钮
- 看到“正在检测目标单片机…”
- 给板子断电再上电(用电源开关,不是拔 USB 线)
等待下载完成,板子上的 LED 就会亮起。
方式二:普中 ISP
操作流程基本一致,同样需要:
- 选对芯片型号
- 选对 COM 口
- 加载
led_std.hex - 冷启动(先点下载,再断电上电)
普中 ISP 和 STC-ISP 我都用过,感觉都还可以。 两者功能相近,选哪个看个人习惯。普中 ISP 是开发板配套的,界面可能更贴合普中的板子;STC-ISP 是 STC 官方的,更新更及时。
踩坑记录
| 问题 | 原因 | 解决 |
|---|---|---|
| 卡在“正在检测目标单片机” | 芯片被锁死(程序关闭了下载功能) | 换新芯片(网上单买芯片挺便宜的) |
| HEX 格式错误 | SDCC 的 .ihx 不被 ISP 识别 | 用 objcopy 转标准 HEX |
| 灯不亮 | LED 接在别的端口 | 查看端口原理图 |
| 串口回环测试只收到 . | 跳线帽没接对 | 检查 P3.0/P3.1 短接(芯片坏导致) |
| 拔掉芯片串口还在 | CH340 独立于芯片,只证明串口芯片正常 | 不能用来判断 51 芯片好坏 |
| P1.0/P1.1 焊盘有 1.5V/2V | 板载 LED/数码管/74HC595 分压 | 正常现象,不是短路 |
| ALE 测到 5V | 万用表测脉冲信号不准 | 或许可以用示波器或 LED 串电阻测 |
总结
这套流程完全免费、合法,不依赖 Keil。核心就是:
SDCC 编译 → objcopy 转格式 → STC-ISP/普中ISP 烧录第一次配置稍微麻烦,但跑通之后,以后每次点灯就是三步:写代码 → 编译 → 烧录。