Debian 12/13 下使用 SDCC + VSCode 开发 51 单片机完整教程(环境配置)

适用对象 :Linux 新手、嵌入式初学者、想用开源工具开发 STC89C52/AT89S51 等 8051 单片机的爱好者
系统环境 :Debian 12 或 Debian 13(也适用于 Ubuntu 22.04+)
目标 :从零搭建一个 免费、开源、命令行友好 的 51 单片机开发环境


为什么选择 SDCC + VSCode?

  • 完全免费开源:无需 Keil C51 的 2KB 代码限制
  • 跨平台:Linux / Windows / macOS 均可使用
  • 轻量高效:命令行编译 + VSCode 智能提示,无臃肿 IDE
  • 适合学习:理解编译、链接、烧录全过程

第一步:安装开发工具链

1. 安装 SDCC(Small Device C Compiler)

SDCC 是专为 8 位 MCU(如 8051、Z80)设计的 C 编译器。

bash 复制代码
sudo apt update
sudo apt install sdcc sdcc-libraries

sdcc-libraries 包含 8051.hreg51.h 等关键头文件!

验证安装:

bash 复制代码
sdcc --version
# 应输出类似:SDCC 4.2.0 ...

2. 安装 VSCode

bash 复制代码
sudo apt install wget gpg
wget -qO- https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > packages.microsoft.gpg
sudo install -D -o root -g root -m 644 packages.microsoft.gpg /etc/apt/keyrings/packages.microsoft.gpg
sudo sh -c 'echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/packages.microsoft.gpg] https://packages.microsoft.com/repos/code stable main" > /etc/apt/sources.list.d/vscode.list'
sudo apt update
sudo apt install code

3. 安装烧录工具 stcgal(用于 STC 系列单片机)

由于 Debian 12/13 默认禁止 pip 修改系统 Python,我们使用 pipx 安全安装:

bash 复制代码
# 安装 pipx
sudo apt install pipx

# 配置 PATH
pipx ensurepath

# 重新加载 shell 配置(或关闭终端重开)
source ~/.profile

# 安装 stcgal
pipx install stcgal

验证:

bash 复制代码
stcgal --version
# 应输出:stcgal 1.7.0 或更高

🔌 注意:如果你用的是非 STC 芯片(如 AT89S51),需使用其他烧录工具(如 USBasp + avrdude),本教程以 STC 为例。


第二步:配置串口权限

Linux 默认禁止普通用户访问串口设备。运行以下命令将当前用户加入 dialout 组:

bash 复制代码
sudo usermod -aG dialout $USER

重要-aG 中的 -a 表示"追加",不能省略!否则会移除你所有其他用户组!

然后注销系统并重新登录(或重启),使权限生效。

验证:

bash 复制代码
groups
# 输出中应包含 "dialout"

第三步:创建项目结构

在任意目录创建你的项目,例如:

bash 复制代码
mkdir ~/my-8051-project && cd ~/my-8051-project
mkdir src

项目结构如下:

复制代码
my-8051-project/
├── src/
│   └── main.c
├── Makefile
└── .vscode/
    └── c_cpp_properties.json

第四步:编写示例代码

创建 src/main.c

c 复制代码
#include <8051.h>

void delay_ms(unsigned int ms) {
    unsigned int i, j;
    for (i = 0; i < ms; i++)
        for (j = 0; j < 114; j++);
}

void main(void) {
    P1 = 0x00;  // 初始化 P1 口
    while (1) {
        P1 = ~P1;      // 翻转 P1(如接 LED 会闪烁)
        delay_ms(500);
    }
}

使用 #include <8051.h>(SDCC 官方头文件),也可用 #include <reg51.h>(Keil 兼容)


第五步:配置 VSCode 智能提示(关键!)

在项目根目录创建 .vscode/c_cpp_properties.json

json 复制代码
{
    "configurations": [
        {
            "name": "8051 (SDCC)",
            "includePath": [
                "${workspaceFolder}/**",
                "/usr/share/sdcc/include/mcs51",
                "/usr/share/sdcc/include"
            ],
            "defines": [
                "__SDCC__",
                "__SDCC_mcs51",
                "__sfr=volatile unsigned char",
                "__sbit=volatile unsigned char",
                "__at(x)=",
                "__bit=volatile unsigned char"
            ],
            "compilerPath": "/usr/bin/sdcc",
            "cStandard": "c99",
            "intelliSenseMode": "linux-gcc-x86"
        }
    ],
    "version": 4
}

作用 :让 VSCode 认识 P1__sfr__sbit 等 8051 特有语法,消除"未定义标识符"错误。

保存后,在 VSCode 中按 Ctrl+Shift+P → 输入 "Reload IntelliSense" 刷新。


第六步:编写 Makefile(自动化编译)

在项目根目录创建 Makefile

makefile 复制代码
# Makefile for 8051 with SDCC

TARGET = main
SRC_DIR = src
BUILD_DIR = build
CFLAGS = --model-small --opt-code-speed

$(BUILD_DIR)/$(TARGET).ihx: $(SRC_DIR)/$(TARGET).c
	@mkdir -p $(BUILD_DIR)
	sdcc $(CFLAGS) -o $(BUILD_DIR)/$(TARGET).ihx $<

flash: $(BUILD_DIR)/$(TARGET).ihx
	stcgal -P stc89 -p /dev/ttyUSB0 $(BUILD_DIR)/$(TARGET).ihx

clean:
	rm -rf $(BUILD_DIR)

.PHONY: clean flash

⚙️ 根据你的芯片型号调整 -P 参数:

  • STC89C52 → -P stc89
  • STC12C5A60S2 → -P stc12
  • STC15 系列 → -P stc15

查看所有支持型号:stcgal -L


第七步:编译与烧录

1. 编译项目

bash 复制代码
make

生成文件位于 build/ 目录,主文件为 main.ihx

2. 烧录到单片机

bash 复制代码
make flash

烧录操作流程

  1. 运行 make flash
  2. 终端显示 Waiting for MCU...
  3. 此时给单片机断电 → 再上电(触发 STC ISP 下载模式)
  4. 等待自动烧录完成

硬件连接:

  • USB-TTL 模块 TX → 单片机 RXD (P3.0)
  • USB-TTL 模块 RX → 单片机 TXD (P3.1)
  • 共地(GND 接 GND)

常见问题

如何生成 .hex 文件?

bash 复制代码
packihx build/main.ihx > build/main.hex

参考资源


相关推荐
我是一棵无人问荆的小草1 天前
STM32标准库与HAL库编程差异分析
stm32·单片机·嵌入式硬件
LingLong_roar1 天前
手搓温湿度传感器(单片机普冉PY32F002AF15P6TU + 温湿度传感器 SHT40-AD1B-R2 + 0.96寸TFT IPS 显示屏)
单片机·嵌入式硬件
~光~~1 天前
【嵌入式linux学习】06_中断子系统
linux·单片机·学习
意法半导体STM321 天前
【官方原创】FDCAN数据段波特率增加后发送失败的问题分析 LAT1617
javascript·网络·stm32·单片机·嵌入式硬件·安全
zhanglianzhao1 天前
Win 11 WSL 配置Claude code 并在VsCode中使用
ide·vscode·编辑器·claude·cladue code
Keying,,,,1 天前
VScode中终端闪退问题
ide·vscode·编辑器
热爱生活的五柒1 天前
如何在vscode中使用Claude code以及插件中配置setting.json无效的解决方法
ide·vscode·编辑器
想放学的刺客1 天前
单片机嵌入式试题(第30期)全局变量“满天飞“!!!局限性和影响有哪些,什么情况下才不得不使用?
单片机·嵌入式硬件·mcu·物联网·51单片机
jl48638211 天前
【选型指南】气密性检测仪显示屏如何兼顾IP65防护、-40℃~85℃宽温与快速交付?
大数据·人工智能·stm32·单片机·物联网
恶魔泡泡糖1 天前
51单片机I2C-EEPROM
c语言·单片机·嵌入式硬件·51单片机