前几天脑袋一热,买了个STC89C52RC芯片的单片机,打算点个灯。
又在wzt的影响下使用vsc和sdcc的编写模式。
2025-09更新
sdcc版本4.4.0似乎默认不输出ihx格式了,需要编译时指定参数--out-fmt-ihx
2024-08更新
犯蠢了,直到今天重新拿起来单片机学习才发现,下文中的代码和8052.h的头文件是sdcc提供的,不需要从stc-isp里下载头文件再手动转换,可以直接写。但是可能只有比较基础的定义,缺少一些stc89c52的特殊功能,所以还是保留转换的方式了。
2022-08更新
有大佬实现了将c51和头直接转换为sdcc代码的网页,这是链接在网页中,把你的 Keil C51 C 代码转换成 SDCC 格式 - VeriMake
需要好好打出来分隔符,不然没法转换不带分隔符的例如A=B这种格式
所以我自己写了个自己使用的
SDCC
sdcc Windows amd64 mingw32环境安装包下载地址。
同样,你可以在这里查询所有供windows下载的版本。SDCC - Snapshot Builds (sourceforge.net)
启动安装包,随后一路next安装即可。
安装成功后在命令行输入sdcc以验证是否安装成功。
vsc配置
安装vsc
为vsc安装插件
- 安装
C/C++插件 - Chinese (Simplified) Language Pack for Visual Studio Code(可选)
 
获取sdcc适用的STC89C52RC头文件
实际上,STC89C52RC可以使用8052.h头文件(位于include/mcs51/,该头文件内include了8051头文件,这个头文件是定义的主体),简单检查后发现寄存器等的定义几乎相同,但是对寄存器的使用语法和定义风格发生了变化。
由于stc-isp软件导出的该芯片的头文件不被sdcc识别,所以我们也可自行转换导出的头文件。
突然要用 STC 写个东西,但是发现没有SDCC头文件,写个工具转… (amobbs.com 阿莫电子论坛)
9楼以将转换器封装为exe可执行文件,可以根据层主使用方法直接使用。
但是可能会在编译步骤在此头文件中报错,可将报错行注释掉。也可自行尝试解决
程序编写之前
为了让vsc能够识别并辅助编写代码,需要对vsc进行配置。
在vsc界面按下Ctrl+Shift+P,选择c/c++编辑配置
包含路径项(includePath)
在此项中填写SDCC安装路径\include\msc51来让vsc可以查找到8052.h
例:C:\Program Files\SDCC\include\mcs51
lint.h
这是一个位于SDCC\include\mcs51\lint.h的兼容头,写在文件中可以让vsc识别sdcc的语法。
第一个程序
新建一个名为helloworld.c的文件。输入
1  |  | 
保存。
在vsc中输入sdcc helloworld.c来编译它,随后会生成一堆文件。随后使用packihx .\helloworld.ihx >.\helloworld.hex将ihx文件转化为hex文件。然后在stc-isp中选中STC89C52RC/LE52RC芯片,在安装驱动情况下选中串口,点击打开程序文件,随后点击下载/编程。开始需要检测mcu选项,需要冷启动。我购买的是完整的开发板,按下开关重启即可。正常来说,05口已经可以持续输出低电平,连接一个led到vcc和05口,可以发现正常使用。
踩坑
2024年更新:现在的stc-isp已经支持intel hex格式的文件了,直接选择.ihx就行
我通过packihx生成的hex在下载到单片机上后无法发挥作用,检查后发现packihx打包的hex文件不是标准二进制格式,而是intel hex的文本描述格式,因而无法正常烧录。查阅资料后发现可以通过sdobjcopy打包生成的bin文件可正常通过stc-isp下载,这是指令:sdobjcopy.exe -I ihex -O binary .\helloworld.ihx .\helloworld.bin