文章目录
0. 速记口诀
寄存器功能口诀
TCON 管定时和中断,TMOD 管方式门控门。
IE 总开关 EA 加子开关,IP 管优先级高低分。
SCON 串口方式收发位,PSW 管标志和寄存器组。
中断优先级口诀(由高到低)
外0 → T0 → 外1 → T1 → 串口
P3 口第二功能
串行收发外中断,定时计数读写存。
1. 基本概念
1.1 时钟与时序
| 概念 | 含义 | 计算 |
|---|
| 振荡周期 | 晶振振荡一次的时间 | T_osc = 1/fosc |
| 时钟周期 | 振荡周期的 2 分频(状态周期) | T = 2T_osc |
| 机器周期 | CPU 完成一个基本操作的时间 | 1 机器周期 = 12 振荡周期 = 6 时钟周期 |
| 指令周期 | 执行一条指令所需时间 | 1~4 个机器周期 |
重要结论:fosc = 12 MHz 时,1 机器周期 = 1 μs
1.2 复位状态
- 复位条件:RST 引脚保持 2 个机器周期 以上的高电平
- 复位入口地址:0000H
- 复位后 SFR 初始值:
| 寄存器 | 初值 | 寄存器 | 初值 |
|---|
| PC | 0000H | ACC | 00H |
| SP | 07H(指向 08H) | PSW | 00H |
| P0-P3 | FFH | DPTR | 0000H |
| TCON | 00H | TMOD | 00H |
| SCON | 00H | IE | 00H(中断全关) |
| IP | 00H | PCON | 0xxx0000B |
复位后各 I/O 口为高电平,SP=07H(栈底在 08H,使用前需重设 SP)
2. 寄存器总结
2.1 常用 SFR 一览
| SFR 类别 | 寄存器 | 功能 | 地址 |
|---|
| 定时器 | TCON / TMOD | 定时控制 / 模式 | 88H / 89H |
| 定时器 | TH0/TL0 / TH1/TL1 | T0、T1 高/低字节 | 8CH/8AH / 8DH/8BH |
| 中断 | IE / IP | 允许 / 优先级 | A8H / B8H |
| 串口 | SCON / SBUF | 控制 / 数据缓冲 | 98H / 99H |
| I/O | P0 / P1 / P2 / P3 | 4 个 8 位并行口 | 80H / 90H / A0H / B0H |
| 状态 | PSW / A / B | 标志 / 累加器 / 辅存 | D0H / E0H / F0H |
| 指针 | SP / DPTR | 栈指针 / 数据指针 | 81H / 82H-83H |
2.2 TCON(88H)
| 位 | 名称 | 功能 |
|---|
| D7 | TF1 | T1 溢出标志(硬件置 1,自动清 0) |
| D6 | TR1 | T1 运行控制(软件置位) |
| D5 | TF0 | T0 溢出标志 |
| D4 | TR0 | T0 运行控制 |
| D3 | IE1 | 外中断 1 请求标志 |
| D2 | IT1 | 外中断 1 触发方式(0=低电平,1=下降沿) |
| D1 | IE0 | 外中断 0 请求标志 |
| D0 | IT0 | 外中断 0 触发方式 |
⚠️ TF0/TF1、IE0/IE1 响应中断后硬件自动清 0;TI/RI 必须软件清 0。
2.3 TMOD(89H,高 4 位 T1,低 4 位 T0)
| D7/D3 | D6/D2 | D5/D4 / D1/D0 | 含义 |
|---|
| GATE | C/T | M1 M0 | 见下表 |
| M1 | M0 | 方式 | 功能 |
|---|
| 0 | 0 | 方式 0 | 13 位定时器(兼容 8048) |
| 0 | 1 | 方式 1 | 16 位定时器(最常用) |
| 1 | 0 | 方式 2 | 8 位自动重装(波特率专用) |
| 1 | 1 | 方式 3 | T0 拆为两个 8 位定时器 |
常用 TMOD 值:
| TMOD | 含义 |
|---|
| 0x01 | T0 方式 1(16 位定时) |
| 0x02 | T0 方式 2(8 位自动重装) |
| 0x10 | T1 方式 1 |
| 0x20 | T1 方式 2(波特率发生器) |
2.4 IE(A8H)
| 位 | 名称 | 功能 |
|---|
| D7 | EA | 总中断允许 |
| D6 | - | 保留 |
| D5 | ET2 | T2 中断允许(8052 才有) |
| D4 | ES | 串口中断允许 |
| D3 | ET1 | T1 中断允许 |
| D2 | EX1 | 外中断 1 允许 |
| D1 | ET0 | T0 中断允许 |
| D0 | EX0 | 外中断 0 允许 |
中断开放条件:EA = 1 且 对应中断允许位 = 1
2.5 IP(B8H)
| 位 | 名称 | 功能 |
|---|
| D4 | PS | 串口优先级 |
| D3 | PT1 | T1 优先级 |
| D2 | PX1 | 外中断 1 优先级 |
| D1 | PT0 | T0 优先级 |
| D0 | PX0 | 外中断 0 优先级 |
1=高优先级;同优先级按自然顺序:外0 > T0 > 外1 > T1 > 串口
2.6 SCON(98H)
| 位 | 名称 | 功能 |
|---|
| D7/D6 | SM0/SM1 | 工作方式选择 |
| D5 | SM2 | 多机通信控制 |
| D4 | REN | 允许接收 |
| D3/D2 | TB8/RB8 | 方式 2/3 第 9 位数据 |
| D1 | TI | 发送中断标志(软件清 0) |
| D0 | RI | 接收中断标志(软件清 0) |
| SM0 SM1 | 方式 | 功能 | 波特率 |
|---|
| 0 0 | 方式 0 | 8 位同步移位 | fosc/12 |
| 0 1 | 方式 1 | 8 位 UART | 可变(T1 溢出率) |
| 1 0 | 方式 2 | 9 位 UART | fosc/32 或 fosc/64 |
| 1 1 | 方式 3 | 9 位 UART | 可变 |
2.7 PSW(D0H)
| 位 | 名称 | 功能 |
|---|
| D7 | CY | 进位标志 |
| D6 | AC | 辅助进位(BCD 调整用) |
| D5 | F0 | 用户自定义标志 |
| D4/D3 | RS1/RS0 | 工作寄存器区选择 |
| D2 | OV | 溢出标志 |
| D0 | P | 奇偶标志(A 中 1 的个数为奇→P=0,偶→P=1) |
工作寄存器区:
| RS1 | RS0 | 区 | 地址 |
|---|
| 0 | 0 | 0 区 | 00H-07H |
| 0 | 1 | 1 区 | 08H-0FH |
| 1 | 0 | 2 区 | 10H-17H |
| 1 | 1 | 3 区 | 18H-1FH |
3. 寻址方式(7 种)
| 序号 | 寻址方式 | 示例 | 说明 |
|---|
| ① | 立即寻址 | MOV A, #30H | 操作数在指令中 |
| ② | 直接寻址 | MOV A, 30H | 操作数在 RAM/SFR 地址中 |
| ③ | 寄存器寻址 | MOV A, R0 | 操作数在 R0-R7 中 |
| ④ | 寄存器间接寻址 | MOV A, @R0 | 操作数在 @R0/@R1/@DPTR 所指单元 |
| ⑤ | 变址寻址 | MOVC A, @A+DPTR | 常用于查表(DPTR 或 PC 作基址) |
| ⑥ | 相对寻址 | SJMP rel | 以 PC 当前值为基准的跳转 |
| ⑦ | 位寻址 | ANL C, P1.0 | 对可位寻址位操作 |
可位寻址区:RAM 20H-2FH(128 位)+ SFR 字节地址能被 8 整除的寄存器
4. 中断系统
4.1 中断源与入口地址
| 中断源 | 符号 | 中断号 | 入口地址 | 自然优先级 |
|---|
| 外部中断 0 | INT0(P3.2) | 0 | 0003H | 最高 |
| 定时器 0 | T0 | 1 | 000BH | ↑ |
| 外部中断 1 | INT1(P3.3) | 2 | 0013H | ↓ |
| 定时器 1 | T1 | 3 | 001BH | ↓ |
| 串行口 | TI/RI | 4 | 0023H | 最低 |
4.2 外部中断
- 触发方式由 IT0/IT1 决定:
ITx = 0:低电平触发(低电平期间须保持)ITx = 1:下降沿触发(更常用)
- 中断请求标志:
IE0/IE1(TCON 中) - 响应条件:
EA=1、EXx=1、无同级/高优先级中断
4.3 定时器中断
- 请求标志:
TF0/TF1(溢出时硬件置 1) - 初始化步骤:TMOD → 初值 → ETx → EA → TRx
4.4 串口中断
- 请求标志:TI(发送完成)、RI(接收完成)
- ⚠️ TI 和 RI 必须软件清 0(与外中断/TF 不同!)
- 初始化步骤:SCON → PCON(SMOD) → TMOD → TH1 → ES → EA → TR1
5. I/O 端口
5.1 四端口对比
| 端口 | 地址 | 类型 | 上拉电阻 | 第二功能 | 驱动能力 |
|---|
| P0 | 80H | 漏极开路 | 必须外接 | 数据/地址低 8 位复用 | 8 个 TTL |
| P1 | 90H | 准双向 | 内部有 | 无 | 4 个 TTL |
| P2 | A0H | 准双向 | 内部有 | 高 8 位地址 | 4 个 TTL |
| P3 | B0H | 准双向 | 内部有 | 见下表 | 4 个 TTL |
⚠️ P0 口唯一必须外接上拉电阻(4.7kΩ~10kΩ)
5.2 P3 口第二功能
| 引脚 | 第二功能 | 引脚 | 第二功能 |
|---|
| P3.0 | RXD(串行输入) | P3.4 | T0(定时器 0 外部输入) |
| P3.1 | TXD(串行输出) | P3.5 | T1(定时器 1 外部输入) |
| P3.2 | INT0(外中断 0) | P3.6 | WR(外部写) |
| P3.3 | INT1(外中断 1) | P3.7 | RD(外部读) |
6. 定时器/计数器
6.1 定时 vs 计数
| 模式 | 信号源 | C/T 位 | 典型用途 |
|---|
| 定时 | 内部机器周期 (fosc/12) | C/T = 0 | 定时、波特率 |
| 计数 | 外部脉冲 (T0/T1 引脚) | C/T = 1 | 计外部事件 |
6.2 四种工作方式
| 方式 | 位数 | 初值范围 | 特点 |
|---|
| 0 | 13 位 | 0-8191 | 兼容 8048,少用 |
| 1 | 16 位 | 0-65535 | 最常用,需手动重装初值 |
| 2 | 8 位自动重装 | 0-255 | 波特率发生器专用 |
| 3 | 两个 8 位 | 0-255 | 仅 T0 有效,TL0/TH0 独立 |
6.3 初值计算
定时时间公式:
- 方式 1:
T = (65536 - X) × 12 / fosc → X = 65536 - T × fosc/12 - 方式 2:
T = (256 - X) × 12 / fosc → X = 256 - T × fosc/12
经典例题(fosc = 12 MHz):定时 50 ms
X = 65536 - 50000 = 15536 = 3CB0HTH0 = 3CH,TL0 = B0H
7. 串行通信
7.1 四种工作方式
| 方式 | 帧格式 | 用途 | 波特率 |
|---|
| 0 | 8 位数据 | 扩展 I/O(74HC164/165) | fosc/12 |
| 1 | 10 位(1 起始+8 数据+1 停止) | 异步通信(最常用) | T1 溢出率 |
| 2 | 11 位(含可编程第 9 位) | 多机通信 | fosc/32 或 64 |
| 3 | 11 位 | 多机通信 | T1 溢出率 |
7.2 方式 1 波特率
公式:
波特率 = (2^SMOD / 32) × (fosc / (12 × (256 - X)))
常用初值表(fosc = 11.0592 MHz):
| 波特率 | SMOD | TH1 初值 |
|---|
| 2400 | 0 | F4H |
| 4800 | 0 | FAH |
| 9600 | 0 | FDH |
| 19200 | 1 | FDH |
11.0592 MHz 的好处:能整除常用波特率,误差为 0
8. 存储器结构
8.1 三存储空间
| 空间 | 容量 | 地址 | 用途 |
|---|
| 程序存储器 ROM | 4KB(8051) | 0000H-0FFFH | 存程序代码、表格常量 |
| 内部 RAM | 128B | 00H-7FH | 工作寄存器、位寻址、用户 RAM |
| 外部 RAM | 64KB | 0000H-FFFFH | 外扩数据存储 |
特殊地址:
0000H:复位入口0003H-002AH:5 个中断入口(每个占 8 字节)
8.2 RAM 分区
| 地址范围 | 功能 |
|---|
| 00H-1FH | 工作寄存器区(4 组 × 8 字节) |
| 20H-2FH | 位寻址区(16 字节 = 128 位,对应位地址 00H-7FH) |
| 30H-7FH | 用户数据缓冲区 |
| 80H-FFH | SFR 区(仅 21 个字节有定义) |
8.3 SFR 特点
- 地址范围:
80H-FFH - 仅 21 个字节有定义(8051)
- 可位寻址的 SFR:字节地址能被 8 整除(A、B、PSW、IP、P3、IE、SCON、TCON、P0、P1、P2)
9. C51 编程要点
9.1 C51 扩充数据类型
| 类型 | 长度 | 说明 |
|---|
bit | 1 位 | 位变量(0 或 1) |
sfr | 8 位 | 特殊功能寄存器声明 |
sfr16 | 16 位 | 16 位 SFR(如 DPTR) |
sbit | 1 位 | 特殊位声明(可寻址位) |
idata | 8 位 | 间接寻址内部 RAM |
pdata | 8 位 | 分页外部 RAM(MOVX @R0) |
xdata | 16 位 | 外部 RAM(MOVX @DPTR) |
code | 16 位 | 程序存储器(ROM,查表用) |
9.2 常用声明示例
sfr P0 = 0x80;
sfr SCON = 0x98;
sbit LED = P1^0; // P1.0
sbit TI = SCON^1; // SCON.1
unsigned char code table[] = {0x3F, 0x06, 0x5B, 0x4F}; // 存 ROM
unsigned char xdata buf[100]; // 存外 RAM
9.3 中断函数
void Timer0_ISR(void) interrupt 1 { // 1 = 中断号
// 函数体
}
| 中断号 | 中断源 | 函数名(自定义) |
|---|
| 0 | 外中断 0 | interrupt 0 |
| 1 | 定时器 0 | interrupt 1 |
| 2 | 外中断 1 | interrupt 2 |
| 3 | 定时器 1 | interrupt 3 |
| 4 | 串口 | interrupt 4 |
中断函数默认使用寄存器组 3(如需切换在 using n)
10. 总线扩展与接口
10.1 系统扩展三总线
| 总线 | 来源 | 作用 |
|---|
| 地址总线 AB | 由 P0(低 8 位)+ P2(高 8 位)组成 | 16 位,寻址 64KB |
| 数据总线 DB | P0 口 | 8 位双向 |
| 控制总线 CB | RD(P3.7)、WR(P3.6)、ALE、PSEN | 读/写控制 |
ALE:地址锁存使能(P0 低 8 位地址需经 74HC373 锁存)
10.2 扩展外设时 P0/P2 的角色
- 扩展 ROM(如 2764):P0 分时复用低 8 位地址/数据,P2 输出高 8 位地址,PSEN 选通
- 扩展 RAM(如 6264):同上,但用 RD/WR 选通
- P2 口 在扩展时一般作为高 8 位地址口,不再作普通 I/O
10.3 常用接口芯片
- 74HC373:地址锁存器(接 ALE)
- 74HC138:3-8 译码器(片选)
- 74HC164/165:串入并出/并入串出(接串口方式 0)
- 8255A:可编程并行 I/O 扩展
- 8155/8156:RAM+IO+定时器
11. 常用程序模板
11.1 定时器初始化
void Timer0_Init(void) {
TMOD &= 0xF0; // 清 T0 控制位
TMOD |= 0x01; // T0 方式 1
TH0 = 0x3C; // 50ms @ 12MHz
TL0 = 0xB0;
ET0 = 1; // 允许 T0 中断
EA = 1; // 开总中断
TR0 = 1; // 启动 T0
}
void UART_Init(void) {
SCON = 0x50; // 方式 1,REN=1
PCON = 0x00; // SMOD = 0
TMOD &= 0x0F;
TMOD |= 0x20; // T1 方式 2
TH1 = 0xFD; // 9600bps
TL1 = 0xFD;
ES = 1; EA = 1; // 开串口中断
TR1 = 1; // 启动 T1
}
11.3 中断服务程序
void Timer0_ISR(void) interrupt 1 {
TH0 = 0x3C; // 方式 1 必须手动重装
TL0 = 0xB0;
// 用户逻辑
}
void UART_ISR(void) interrupt 4 {
if (RI) { RI = 0; /* 处理接收 */ }
if (TI) { TI = 0; /* 处理发送 */ }
}
11.4 LED 闪烁 / 按键扫描关键代码
// LED 闪烁(查询法)
P1 = 0xFE; // P1.0 亮
delay_ms(500);
P1 = 0xFF; // 全灭
// 按键去抖
if (KEY == 0) {
delay_ms(10);
if (KEY == 0) { /* 确认按下 */ }
while (KEY == 0); // 等待释放
}
12. 易混淆点对比
| 易错点 | 正确 | 错误理解 |
|---|
| SP 复位值 | 07H(栈底 08H) | 00H |
| TI/RI 清零 | 必须软件清 0 | 认为硬件自动清 0 |
| P0 口上拉 | 必须外接 | 内部有上拉 |
| 方式 1 重装 | 必须手动重装初值 | 自动重装 |
| 中断入口地址 | 0003H-002AH(8 字节间隔) | 以为 64K 任意 |
| 定时器初值单位 | 机器周期数(μs 级) | 振荡周期数 |
| 方式 2 是几位的 | 8 位自动重装 | 16 位 |
| 扩展 RAM 用什么指令 | MOVX | MOV 或 MOVC |
| 查表用 | MOVC A,@A+DPTR | MOVX |
| 中断函数关键字 | interrupt n | void timer0() interrupt 0 |
| 晶振 11.0592MHz 原因 | 整除标准波特率误差为 0 | 以为只是常用值 |
13. 期末必背 20 条
- 51 单片机是 8 位机,16 位地址总线
- 1 机器周期 = 12 振荡周期
- 复位后 PC=0000H,SP=07H,P0~P3=FFH
- P0 必须外接上拉电阻;P1/P2/P3 内部有上拉
- TMOD 89H、TCON 88H、IE A8H、IP B8H、SCON 98H、PSW D0H
- 中断入口:
0003H 000BH 0013H 001BH 0023H - 自然优先级:外0 > T0 > 外1 > T1 > 串口
- 定时器初值公式:
X = 2^n - T × fosc / 12(n=13/16/8) - 方式 1 是 16 位,需手动重装
- 方式 2 是 8 位自动重装,专用于波特率
- 串口方式 1 是 10 位帧(1 起始+8 数据+1 停止)
- TI、RI 必须软件清 0(其他中断标志硬件自动清 0)
- 位寻址区:
20H~2FH(共 128 位) - SFR 地址范围:
80H~FFH,可位寻址须被 8 整除 - 工作寄存器 4 组,由 PSW 的 RS1、RS0 选
- C51 查表关键字
code,中断关键字 interrupt n - 扩展总线时 P0 分时复用地址/数据,经 74HC373 锁存
- 读外 RAM 用 RD(P3.7),写外 RAM 用 WR(P3.6)
- 11.0592MHz 晶振 → 9600bps → TH1=FDH
- C51 中断函数:
void Func(void) interrupt n [using m]
复习建议:先背会「速记口诀」和「必背 20 条」,再做 2~3 套历年真题即可覆盖 90% 考点。