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

参考资源


相关推荐
欧云服务器4 天前
怎么让脚本命令可以同时在centos、debian、ubuntu执行?
ubuntu·centos·debian
悠哉悠哉愿意4 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
Lester_11014 天前
STM32霍尔传感器输入口设置为复用功能输入口时,还能用GPIO函数直接读取IO的状态吗
stm32·单片机·嵌入式硬件·电机控制
三佛科技-187366133974 天前
120W小体积碳化硅电源方案(LP8841SC极简方案12V10A/24V5A输出)
单片机·嵌入式硬件
z20348315204 天前
STM32F103系列单片机定时器介绍(二)
stm32·单片机·嵌入式硬件
~远在太平洋~4 天前
Debian系统如何删除多余的kernel
linux·网络·debian
Alaso_shuang4 天前
STM32 核心输入、输出模式
stm32·单片机·嵌入式硬件
2501_918126914 天前
stm32死锁是怎么实现的
stm32·单片机·嵌入式硬件·学习·个人开发
z20348315204 天前
STM32F103系列单片机定时器介绍(一)
stm32·单片机
星马梦缘4 天前
驱动层开发——蜂鸣器驱动
stm32·单片机·嵌入式硬件·hal·驱动