第二十九章 51单片机最小系统
1. 导入
"最小系统"指能让 MCU 稳定上电、复位、跑程序、与外界基本交互(LED、串口)的最小硬件集合。本章给出典型 8051 内核(AT89S52/AT89C52/STC89C52 等)的最小系统电路、BOM、布局要点与上电自检固件,帮助你快速从原理图到点灯、串口"Hello"。
推荐器件:
- 初学者优先 STC89C52RC(自带串口 ISP,下载最方便)或 AT89S52(SPI ISP)。
- 若用老款 AT89C52(并口编程),下载器较难获得,建议避免。
2. 核心引脚与原理
- 电源:
VCC(40),GND(20) - 时钟:
XTAL1(19),XTAL2(18)(外接晶振或部分 STC 支持内部振荡) - 复位:
RST(9)(高有效,上电需产生一定宽度高脉冲) - 串口:
P3.0/RXD(10),P3.1/TXD(11)(下载/调试最常用) - I/O:P0/P1/P2/P3 共 32 根(P0 口为漏极开路,直连外设需上拉)
推荐系统时钟:11.0592MHz(适配标准波特率),或 12/22.1184MHz。
3. 典型最小系统电路
-
供电模块
- 5V 方案:USB 5V 或 AMS1117-5.0/7805 稳压;靠近 MCU 放 0.1µF 去耦(VCC-GND 每个电源脚各一枚)+ 10µF 钽/电解做缓冲。
- 3.3V 方案(少见于经典 8051):请确认芯片是否支持 3.3V。
- TVS/反接保护(可选):电源入口串肖特基或加 TVS 抑制浪涌。
-
时钟电路(外部晶振)
- 晶振:11.0592MHz(推荐)接
XTAL1/XTAL2 - 负载电容:各 22pF~33pF 到 GND(常用 30pF)
- 走线要短、对称,靠近芯片;参考地良好
- 晶振:11.0592MHz(推荐)接
-
复位电路(上电自动复位 + 手动按钮)
- RST 高有效,上电需>2个机器周期的高脉冲
- 典型RC:
RST --- 电阻(10kΩ) → GND;RST --- 电容(10µF) → VCC - 手动复位:
RST --- 轻触按键 → VCC - 快速放电二极管(可选,提高复位可靠性):在 R(10k)两端并联 1N4148,方向为 RST→|---|<---GND(使 RST 由高回落时快速放电)
-
下载/串口接口
TXD(P3.1)→ USB-TTL 模块 RXDRXD(P3.0)← USB-TTL 模块 TXD- 共地;默认 5V TTL 电平
- STC 系列下载:上电/复位时自动进入 ISP
-
基本 I/O
- LED:
P1.0 → 限流电阻(330~1k) → LED → VCC(低电平点亮,或按需反向) - 按键(可选):
键一端接 P3.2/INT0,另一端接 GND,P3 口内部上拉;若接 P1 需外部上拉 10k
- LED:
-
P0 口上拉(如需用 P0 接外设)
- P0.x → 上拉 10k 到 VCC,或经 74HC/HCT 系列/集成上拉阵列
-
BOM(核心)
- MCU:STC89C52RC 或 AT89S52/AT89C52(DIP40)
- 晶振 11.0592MHz ×1;30pF 电容 ×2
- 10kΩ ×2(RST 下拉、按键上拉/可选)
- 10µF 电解 ×1(RST RC);0.1µF 去耦 ×若干
- 1N4148 ×1(RST 快放/可选)
- 轻触按键 ×1(复位)
- LED ×1 + 330~1kΩ ×1
- USB-TTL 模块(CH340/CP2102)×1
4. PCB 布局要点
- 晶振与负载电容紧贴
XTAL1/2,等长短线,远离高噪声导线(SCK、LED 大电流等) - VCC 每个侧边靠近引脚布 0.1µF 去耦;电源入口并 10µF
- RST RC 靠近 RST 引脚;复位按钮回路短且远离噪声
- 串口与下载口引出 4 针:
VCC/GND/TXD/RXD;标注清晰避免接反 - 走线优先 GND 完整参考面;避免长回路
5. 上电自检固件(点灯 + 串口 Hello + 1ms 系统节拍)
默认外部晶振 11.0592MHz。若你使用 12MHz,仅需调整定时器/波特率装载值。
c
#include <reg52.h>
/* 硬件映射 */
sbit LED = P1^0; // 低电平点亮(按接法决定)
/* 串口:P3.1 TXD, P3.0 RXD */
/* 简易延时(粗略) */
void delay_ms(unsigned int ms){
unsigned int i,j;
for(i=0;i<ms;i++) for(j=0;j<125;j++);
}
/* UART 9600bps @11.0592MHz */
void uart_init(void){
TMOD |= 0x20; // T1方式2自动重装
TH1 = 0xFD; TL1 = 0xFD; // 9600
TR1 = 1;
SCON = 0x50; // 8N1,可收
ES = 0; EA = 1;
}
void uart_putc(char c){ SBUF = c; while(!TI); TI = 0; }
void uart_puts(const char* s){ while(*s) uart_putc(*s++); }
/* T0 1ms 节拍(方式1 16位)@11.0592MHz:重装 FC66 */
volatile unsigned long sys_ms = 0;
void t0_init_1ms(void){
TMOD = (TMOD & 0xF0) | 0x01; // T0 方式1
TH0 = 0xFC; TL0 = 0x66; // 1ms
ET0 = 1; EA = 1; TR0 = 1;
}
void t0_isr(void) interrupt 1{
TH0 = 0xFC; TL0 = 0x66;
sys_ms++;
}
/* 串口接收回显(可选中断方式;此处简单轮询演示) */
bit uart_read_char_nonblk(char* ch){
if(RI){ RI = 0; *ch = SBUF; return 1; }
return 0;
}
int main(void){
char ch;
LED = 1; // 默认灭(按接法调整)
uart_init();
t0_init_1ms();
uart_puts("Hello, 51 Minimal System!\r\n");
while(1){
// 每500ms 翻转LED,且打印计数
static unsigned long t_prev = 0, cnt = 0;
if(sys_ms - t_prev >= 500){
t_prev += 500;
LED = !LED;
uart_puts("Tick ");
uart_putc('0' + (cnt%10));
uart_puts("\r\n");
cnt++;
}
// 串口回显(键盘输入→回显)
if(uart_read_char_nonblk(&ch)){
uart_putc(ch);
}
}
// return 0;
}
- 11.0592MHz 下,
T01ms 装载为TH0/TL0=0xFC66。若为 12MHz,则改为0xFC18。 - 串口 9600bps 下,
TH1=TL1=0xFD(模式2)。12MHz 时TH1≈0xFD亦可,误差略有不同。
6. 串口波特率与定时器速算
- 标准 8051 机器周期
Tmc = 12 / Fosc - T0 1ms 重装值(方式1):
Reload = 65536 - 1ms/Tmc- Fosc=11.0592MHz →
Tmc≈1.085µs→ 1ms≈922 →65536-922=64614≈0xFC66
- Fosc=11.0592MHz →
- 串口 9600(T1 方式2自动重装):
TH1 = 256 - (Fosc / (12*32*9600))- 11.0592MHz →
TH1=0xFD
- 11.0592MHz →
7. 下载与上电验证
- STC 系列(UART ISP)
- 连接
VCC/GND/TXD/RXD(注意 TXD↔RXD 交叉) - 打开 STC-ISP 工具,选择串口与波特率,载入 Hex
- 断电→点"下载"→上电或按复位,观察进度条完成
- 连接
- AT89S52(SPI ISP)
- 使用 USBasp/AVRISP 等工具与 SCK/MOSI/MISO/RESET 接口,配套 Hex 下载
- AT89C52(并口编程)
- 需并口高压编程器,不推荐入门使用
验证步骤:
- 上电/复位,LED 每 500ms 闪烁
- 串口助手 9600-8N1,看到"Hello, 51 Minimal System!"与"Tick x"输出;输入字符可回显
8. 常见问题与排查
- 无法运行(LED 不闪、串口无输出)
- 晶振未起振:焊接、负载电容太大/太小、走线过长
- 复位波形不对:RC 数值不当、RST 有毛刺;加 1N4148 快速放电
- 供电不稳/无去耦:VCC 波动、地回路噪声
- 源程序频率配置与硬件不一致(11.0592 vs 12MHz)
- 串口乱码/无回显
- 波特率不一致;TXD/RXD 接反;GND 未共地
- 5V TTL 与 3.3V 模块电平不匹配
- 下载失败
- STC:需"先点下载后上电/复位"进入 ISP;串口占用冲突
- AT89S52:ISP 线序错误或时钟频率不匹配;检查编程器驱动
9. 扩展与建议
- 电源完善:加 USB 口/保险丝/ESD/TVS;LDO 换低噪声型号
- 调试接口:引出
RST/TXD/RXD/VCC/GND2.54mm 排针;标注丝印 - 资源扩展:I²C(EEPROM、RTC、OLED)、SPI(Flash、TFT、触摸)、外部中断(按键)
- 固件结构:保留 1ms SysTick、串口日志、模块化外设驱动,便于后续章节无缝集成