TinyForge —— 单片机制作·仿真·调试一体化 IDE 可直接使用STC虚拟硬件
平时折腾单片机,顺手做了个绿色小工具 TinyForge——一个免安装的单片机 IDE,主要是想给刚入门的朋友省点事:不用买开发板、不用装一堆软件,电脑上就能写 8051 程序、直接仿真看效果。
它内置 C 编译器(TCC),PC 小程序直接写;外挂 SDCC/Keil 就能玩 8051。最有意思的是配合 STC 官方「虚拟调试器件」:程序里的数码管、LCD12864 显示,会实时显示在 STC-ISP 的面板上,还能用虚拟键盘按键跟你的程序互动——没有硬件也能体验点灯、按键、显示的乐趣,学会了再上真机,代码不用改。
解压即用,整包丢一个文件夹里就行。下面是用法,欢迎老手多提意见,新手有问题尽管问。
绿色单文件版:整个界面(web)内嵌在 exe 里,无需安装、免注册,解压即用。内置 Tiny C Compiler(TCC)编译器,可直接写 PC 控制台/窗口程序;通过外挂 SDCC / Keil 支持 8051 单片机开发,配自带的 8051 模拟器(TinySim51)实现实时串口交互仿真。
一、目录结构
TinyForge\
├─ TinyForge.exe # 主程序(界面内嵌,绿色单文件)
├─ examples\ # 示例代码(TCC 控制台 / 8051 串口等)
└─ data\ # 数据目录(配置、工具链、模拟器)
├─ config.json # 软件配置(设置里改,会自动保存到这里)
├─ lib\ # TCC 运行库(libtcc1-64.a 等,内置编译器依赖,勿删)
├─ RealSim\ # 8051 模拟器 TinySim51.exe(自带,勿删)
├─ sdcc\ # SDCC 工具链(可选,放这里自动识别,见下)
├─ completion\ # 代码补全库(自动生成/重建)
└─ tmp\ # 编译临时目录(自动清理)
WebView2 的用户数据与临时文件放在系统 %TEMP%\TinyForgeWebView2\,不占用程序目录,删除程序不留残留。
二、快速开始
- 双击
TinyForge.exe 启动(Windows 10/11 自带 WebView2 Runtime)。
- 左侧
examples\ 里点开一个示例,右侧编辑。
- 工具栏会出现对应平台的按钮组(自动识别代码用的工具链):
| 平台 |
按钮 |
说明 |
| TCC(PC 程序) |
编译 F5 |
内存编译 → 落盘 exe → 运行,printf 回流输出面板 |
|
调试 F6 |
内存编译运行,支持断点 / 步入 / 变量监视 |
|
文件夹编译 / 文件夹调试 |
编译左侧选中的整个文件夹 |
| SDCC(8051) |
编译 |
SDCC 编译出 .hex 文件 |
|
调试 |
编译 → 进 8051 模拟器实时仿真(串口交互) |
|
文件夹编译 / 文件夹模拟 |
整个文件夹编译出 hex / 模拟运行 |
| Keil(8051) |
编译 |
调用 UV4 批处理编译 .uvproj 工程 |
|
调试 |
工程 hex 进 8051 模拟器 |
文件夹编译 —— 免工程文件(特色)
TinyForge 没有「工程文件」:一个文件夹就是一个工程。左侧文件树选中文件夹 → 「文件夹编译 / 文件夹调试 / 文件夹模拟」一键处理:
- 自动递归收集子目录所有
.c / .h,无需手工添加文件;
- 自动找 main:多文件编译由链接器判定入口,无 main 或多个 main 会明确报错到面板;
- 产物以文件夹名命名:TCC 出
文件夹名.exe、SDCC 出 文件夹名.hex,落在文件夹根目录,点「打开位置」直接定位;
- TCC / SDCC 通用;只有 Keil 才需要
.uvproj 工程(调用 UV4 批处理)。
试试:打开左侧 examples\tcc_控制台\multi_工程\(hello.c + util.c + util.h 三文件),选中文件夹点「文件夹编译」——不用建工程,直接出 exe 并运行。
- 编译成功后,输出面板会出现 「打开位置: <路径>(点击打开并定位)」 —— 点击即可在资源管理器中定位生成的 exe / hex 文件。
三、8051 开发(SDCC 与 Keil)
SDCC(推荐,免费开源)
TinyForge 不打包 SDCC(体积大、客户需求各异),请自行下载:
- 官方下载页:
https://sdcc.sourceforge.net/(Windows 版,如 sdcc-4.x.x-x64-setup.exe 或解压版)
- 安装/解压后,目录应包含
bin\sdcc.exe 和 include\(必须完整,否则 #include <8051.h> 会找不到)。
两种接法,任选其一:
① 放到 data\sdcc(推荐,零配置)
把整个 SDCC 目录放进 data\sdcc\,使结构为 data\sdcc\bin\sdcc.exe。启动软件即自动识别。
② 放在任意位置,手动指定
在 ⚙ 设置 → SDCC 路径 中填写,三种填法都认:
D:\sdcc ← 根目录(推荐)
D:\sdcc\bin ← bin 目录(自动归一)
D:\sdcc\bin\sdcc.exe ← exe 完整路径(自动归一)
填完保存后,若识别成功,「平台」下拉里 SDCC 变为可选;识别失败会自动禁止选择。
Keil(工程化,可选)
在 ⚙ 设置 → Keil 路径 填写 UV4.EXE 完整路径(如 C:\Keil_v5\UV4\UV4.EXE)。Keil 只能按工程(.uvproj)编译:打开工程源文件或选中工程目录后,点「编译」出 hex、「调试」进模拟器。
四、vSTC 虚拟调试器件库(STC 虚拟器件组帧)
vSTC 是什么:STC-ISP 的「虚拟调试器件」面板(SEG7 数码管、LCD12864、虚拟键盘等)内容经 8051 串口以二进制帧上报。TinyForge 的 vSTC 库把「组帧」封装成一个个 vSTC_* 函数——用户程序只管调用,不碰任何帧字节。真机环境换成 STC 官方 USB-HID/USB-CDC 库即可(帧格式完全一致,代码不用改)。
- 单头文件库:
examples\vSTC\vSTC.h(#define VSTC_IMPLEMENTATION + #include 即用,无需额外 .c)
- 纯协议组帧,不碰硬件:不含初始化代码、不直接写 SFR、不含中断函数
- 串口发送走客户实现的钩子
vSTC_SendByte(ch);业务 .c 里先包含器件头(SDCC #include <8051.h>,Keil #include <STC8.H> 等)再包含 vSTC.h
当前支持的器件
| 器件 |
vSTC 函数 |
| SEG7 数码管(8 位) |
vSTC_Seg7ShowString(fmt,...) / ShowLong(n,radix) / ShowFloat(f) / ShowCode(cod) |
| LCD12864(128×64,ST7920 自带 GB2312 字库) |
vSTC_Lcd12864DisplayOn/Off/Clear / CursorOn/Off / ShowString(x,y,str) / ReverseLine(line) 等 |
| 虚拟键盘(接收方向) |
vSTC_KeyFeed(ch):主循环喂串口字节,完整按键帧到达返回键值(ASCII),未组完返回 0 |
其他 STC 虚拟器件(LED、按键、更多外设)在后续版本陆续补充。
快速上手(完整可编译示例)
#define VSTC_IMPLEMENTATION /* 单文件库:实现编进本文件 */
#include <8051.h> /* 器件头:提供 SFR(SBUF/RI/TI/SCON...),必须先包含 */
#include "..\..\vSTC\vSTC.h" /* 共享库相对路径 */
static void uart_init(void) { SCON = 0x50; TMOD = 0x20; TH1 = TL1 = 0xFD; TR1 = 1; TI = 0; } /* 9600 @ 11.0592MHz */
void vSTC_SendByte(unsigned char ch) { SBUF = ch; while (!TI); TI = 0; } /* 库要求的发送钩子(客户实现) */
void main(void) {
uart_init();
vSTC_Lcd12864DisplayOn();
vSTC_Lcd12864DisplayClear();
vSTC_Lcd12864ShowString(0, 0, "Hello!");
for (;;) {
if (RI) {
unsigned char ch = SBUF, k;
RI = 0;
k = vSTC_KeyFeed(ch); /* 组帧:完整按键到达返回键值 */
if (k) vSTC_Seg7ShowString("%02X", k);
}
}
}
怎么跑起来(模拟运行 + STC-ISP 面板实时交互)
- 装虚拟串口对(如 com0com),得到相连的两个端口
COM3 ↔ COM2;
- TinyForge 工具栏「模拟串口」下拉选一端(如 COM3);
- STC-ISP → 串口监控选另一端(COM2),波特率选 9600(与示例一致),打开串口;
- STC-ISP → 「虚拟调试器件」→ 打开 LCD12864 和 虚拟键盘 面板;
- TinyForge 打开
examples\sdcc\02.vSTC\01.kbd_lcd12864.c → 点「8051 模拟运行」;
- 在虚拟键盘上点键 → LCD 面板与调试台实时响应(每按一键出现
APP: key=41 'A' 行)。
面板没反应:先看 TinyForge 调试台有没有 APP: key=XX 实时行(有 = 链路通,只是面板没开/没选中)。
注意事项
- 中文乱码:TinyForge 源码是 UTF-8,ST7920 字库按 GB2312 解析 → 模拟运行里显示内容请用 ASCII;真机 Keil(GB2312 源码)里中文字符串可直接用。
- 波特率:对模拟器执行速度无影响(虚拟串口只管透传字节);只有接真实物理串口/下载器才需与对端一致。
- 文件夹运行:
02.vSTC 目录有多个示例并存(都内联同一实现)→ 文件夹编译会 Multiple definition,请用单文件模式(打开示例 .c → 点「8051 模拟运行」)。
- 完整键值表、段码表、帧协议见
!src\stc\虚拟调试器件\说明.html。
五、8051 模拟器(TinySim51)
TinyForge 自带自编译的 8051 模拟器 data\RealSim\TinySim51.exe:
- 编译出的
.ihx(SDCC)或 .hex(Keil)直接进模拟器仿真;
- 串口实时交互:调试台输入直接进程序(标准 UART,
REN=1 + RI/SBUF 轮询即收),程序 printf 输出实时回调试区;
- 支持波特率选择、本地操作串口(COM 口透传)、寄存器/器件面板(LCD1602 等虚拟器件)。
五、常用配置(⚙ 设置)
| 配置 |
说明 |
| 编译选项 |
TCC 的 -Wall / -W / 优化 / 标准 / 额外参数 |
| 平台 |
SDCC 目标(当前 8051/mcs51);存储模式 small/medium/large;晶振;波特率 |
| SDCC 路径 |
留空自动探测 data\sdcc;否则按上文三种填法指定 |
| Keil 路径 |
UV4.EXE 完整路径 |
| 串口 |
8051 模拟器对外透传的本地 COM 口 |
七、常见问题
Q:平台下拉里 SDCC/Keil 是灰的选不了?
说明没有找到对应的编译器。SDCC:确认 data\sdcc\bin\sdcc.exe 存在,或到 ⚙ 设置里正确指定路径;Keil:确认 UV4.EXE 路径填写正确。
Q:#include <8051.h> 编译报错「cannot open file」?
SDCC 目录不完整——缺少 include\mcs51\ 头文件目录。请使用完整安装版 SDCC(解压版要整个目录一起拷,不能只拷 bin)。
Q:编译出的 hex / exe 在哪?
编译成功后,点输出面板里的「打开位置」即自动打开所在文件夹并选中文件。
Q:调试/编译过程中工具栏按钮变灰点不了?
极少数情况下按钮状态未自动复位(旧版已知问题,新版已加自动复位机制)。若遇到:按 Ctrl+F5 强制刷新界面即恢复(不影响已保存的源码与配置);仍不行就关闭 TinyForge 重新打开。
Q:被杀毒软件误报?
程序是绿色单文件,运行时不释放可执行文件(模拟器/编译器均为静态落盘),临时文件仅写系统 %TEMP%。如遇个别启发式误报,添加信任即可。
Q:8051 程序怎么收发串口?
标准 8051 UART:REN=1 使能接收,RI 标志查询/中断接收,TI 查询发送。模拟器与调试台输入实时互通(参考 examples\sdcc\01.uart_echo)。
八、示例目录
examples\tcc_控制台\ —— PC 控制台程序示例(含 __tf_dbg 调试头、多文件工程)
examples\tcc_窗口\ —— PC 窗口程序示例(WinMain)
examples\tcc_Dll\ —— DLL 编译示例
examples\sdcc\ —— 8051 示例(01.uart_echo 串口回显、02.vSTC 虚拟调试器件交互:虚拟键盘→LCD12864/SEG7)
examples\keil\ —— Keil 工程示例(seg7 数码管、UART)
examples\vSTC\ —— 共享 vSTC 库(8051 常用头,SDCC/Keil 均可 include)