文章目录
- 51单片机期末复习知识点总结
- [0. 速记口诀](#0. 速记口诀)
- [1. 基本概念](#1. 基本概念)
- [1.1 时钟与时序](#1.1 时钟与时序)
- [1.2 复位状态](#1.2 复位状态)
- [2. 寄存器总结](#2. 寄存器总结)
- [2.1 常用 SFR 一览](#2.1 常用 SFR 一览)
- [2.2 TCON(88H)](#2.2 TCON(88H))
- [2.3 TMOD(89H)](#2.3 TMOD(89H))
- [2.4 IE(A8H)](#2.4 IE(A8H))
- [2.5 IP(B8H)](#2.5 IP(B8H))
- [2.6 SCON(98H)](#2.6 SCON(98H))
- [2.7 PSW(D0H)](#2.7 PSW(D0H))
- [3. 寻址方式(7种)](#3. 寻址方式(7种))
- [4. 中断系统](#4. 中断系统)
- [4.1 中断源与入口地址](#4.1 中断源与入口地址)
- [4.2 外部中断](#4.2 外部中断)
- [4.3 定时器中断](#4.3 定时器中断)
- [4.4 串口中断](#4.4 串口中断)
- [5. I/O 端口](#5. I/O 端口)
- [5.1 四端口对比](#5.1 四端口对比)
- [5.2 P3 口第二功能](#5.2 P3 口第二功能)
- [6. 定时器/计数器](#6. 定时器/计数器)
- [6.1 定时 vs 计数](#6.1 定时 vs 计数)
- [6.2 四种工作方式](#6.2 四种工作方式)
- [6.3 初值计算](#6.3 初值计算)
- [7. 串行通信](#7. 串行通信)
- [7.1 四种工作方式](#7.1 四种工作方式)
- [7.2 方式1 波特率](#7.2 方式1 波特率)
- [8. 存储器结构](#8. 存储器结构)
- [8.1 三存储空间](#8.1 三存储空间)
- [8.2 RAM 分区](#8.2 RAM 分区)
- [8.3 SFR 特点](#8.3 SFR 特点)
- [9. C51 编程要点](#9. C51 编程要点)
- [10. 总线扩展与接口](#10. 总线扩展与接口)
- [11. 常用程序模板](#11. 常用程序模板)
- [12. 易混淆点对比](#12. 易混淆点对比)
- [13. 期末必背 20 条](#13. 期末必背 20 条)
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 = 3CB0H
TH0 = 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% 考点。