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

参考资源


相关推荐
Tipriest_1 天前
Debian 系与 RPM 系常用软件包查询命令/信息/列出已安装包/模糊查找等命令
运维·debian·rpm
周周记笔记1 天前
ESP32 初识:WiFi MCU 新时代与国产芯片生态(一)
单片机·嵌入式硬件
驴友花雕1 天前
【花雕学编程】Arduino BLDC 之群体机器人协同探索
c++·单片机·嵌入式硬件·arduino bldc·群体机器人协同探索
驴友花雕1 天前
【花雕学编程】Arduino BLDC 之仿人机器人膝关节稳定系统
c++·单片机·嵌入式硬件·arduino bldc·仿人机器人膝关节稳定系统
linweidong2 天前
嵌入式电机:如何在低速和高负载状态下保持FOC(Field-Oriented Control)算法的电流控制稳定?
stm32·单片机·算法
oMcLin2 天前
如何在 Debian 10 上配置并优化 Redis 集群,确保低延迟高并发的实时数据缓存与查询
redis·缓存·debian
Zero_Era2 天前
高性价比安全MCU——LKT6830C
单片机·嵌入式硬件·安全
国科安芯2 天前
卫星通讯导航FPGA供电单元DCDC芯片ASP4644S2B可靠性分析
单片机·嵌入式硬件·fpga开发·架构·安全性测试
夜流冰2 天前
VSCode - 显示EOL字符的插件
ide·vscode·编辑器
易水寒陈2 天前
单片机实现的工厂模式
单片机