单片机原理与应用复习资料

0. 使用说明

本文根据当前文件夹中的随堂测试、阶段测验、历年 A/B 卷、参考答案、课后习题答案整理,重点围绕 AT89S51/MCS-51、C51 编程、中断、定时器/计数器、串行通信、并行 I/O、键盘显示、A/D 与 D/A 转换。

复习时按下面顺序推进:

  1. 先背“必须掌握表”:机器周期、I/O 口、寄存器、定时器方式、中断入口、串口方式。

  2. 再练“高频计算”:定时器初值、串口波特率、A/D 与 D/A 分辨率。

  3. 最后套“程序题模板”:定时中断闪灯、PWM、外部中断 LED、串口收发字符串。

资料中的期末卷结构高度稳定:选择题、判断题、简答题、程序填空题、程序设计题反复出现。选择判断考概念辨析,简答考原理表述,程序题主要考寄存器初始化和中断服务函数。

1. 高频考点总览

模块 高频内容 常见题型
单片机基础 CPU、RAM、ROM、ALU、PC、SP、PSW、机器周期、哈佛结构 选择、判断、填空
存储器与 C51 dataidataxdatapdatacodebitsbitsfr 选择、填空、简答
并行 I/O P0 无内部上拉、P1-P3 准双向口、输入前写 1、P0/P2 外扩地址总线 选择、判断、程序
中断系统 5 个中断源、入口地址、C51 interrupt 编号、IE/IP/TCON/SCON 选择、判断、简答、程序
定时器/计数器 方式 0/1/2/3、TMOD、TCON、初值计算、软件计数扩展定时 计算、程序填空、程序设计
串行通信 方式 0/1/2/3、SCON、PCON、SBUF、波特率、RI/TI 清零 选择、计算、程序设计
键盘显示 LED 数码管、动态/静态显示、按键抖动、矩阵键盘扫描 简答、程序
A/D 与 D/A ADC0809、DAC0832、分辨率、量化误差、转换时间/速率 选择、判断、简答、计算

2. 单片机基础知识

2.1 单片机是什么

单片机也称微控制器、嵌入式控制器。它把 CPU、存储器、I/O 口等部件通过内部总线集成在一块芯片上,适合测量、控制类应用。

AT89S51 片内典型资源:

  • 1 个 CPU。

  • 128 B 片内 RAM。

  • 4 KB Flash 程序存储器。

  • 4 个 8 位并行 I/O 口:P0、P1、P2、P3。

  • 1 个全双工串行口。

  • 2 个 16 位定时器/计数器:T0、T1。

  • 中断系统:5 个中断源、2 个优先级。

  • 26 个特殊功能寄存器 SFR。

2.2 机器周期与时间换算

AT89S51 的 1 个机器周期等于 12 个振荡周期。

公式:

1
机器周期 Tcy = 12 / fosc

常用换算:

晶振频率 机器周期
3 MHz 4 us
6 MHz 2 us
11.0592 MHz 1.085 us
12 MHz 1 us
24 MHz 0.5 us

资料中反复考:

  • 12 MHz 时,1 个机器周期为 1 us。

  • 6 MHz 时,1 个机器周期为 2 us。

  • 指令周期是执行一条指令所需时间;一个指令周期不等于一个机器周期。

2.3 PC、SP、PSW、A、ALU

名称 含义 高频考法
A 累加器 CPU 组成部分
ALU 算术逻辑单元 CPU 组成部分
PSW 程序状态字 CPU 相关寄存器,复位后 PSW=00H
PC 程序计数器 指向下一条将要执行指令的首地址
SP 堆栈指针 复位后 SP=07H
RAM 随机存储器 不属于 CPU 的组成部分

易错点:

  • “下面不属于 CPU 的部分”常选 RAM。

  • PC 是程序存储器地址指针;PC 不可直接寻址。

  • 程序运行时,PC 的值为当前正在执行指令的下一条指令的首地址。

  • 子程序调用或中断响应时,要把 PC 内容压入堆栈,以保护断点。

2.4 存储结构与寻址

AT89S51 采用哈佛结构,程序存储器和数据存储器空间相互独立。

常考容量:

  • PC 为 16 位,程序存储器寻址范围为 64 KB。

  • 片内 Flash 为 4 KB,地址范围 0000H-0FFFH。

  • 当 EA 接高电平:优先访问片内程序存储器;PC 超过 0FFFH 后访问片外程序存储器。

  • 当 EA 接低电平:只访问片外程序存储器 0000H-FFFFH。

  • 外扩存储器时,P0 可作低 8 位地址/数据复用总线,P2 可作高 8 位地址总线。

内部 RAM 常考分区:

地址范围 作用
00H-1FH 4 组工作寄存器区
20H-2FH 位寻址区,也可按字节访问
30H-7FH 一般数据区,可作堆栈区
80H-FFH SFR 空间

易错判断:

  • “位寻址区只能位寻址,不能字节寻址”是错的。

  • 区分片外程序存储器和片外数据存储器,不能只看地址高低,要看控制信号。

3. C51 语言基础

3.1 C51 扩展数据类型

资料中明确列出的 C51 扩展类型:

  • bit

  • sbit

  • sfr

常见定义:

1
2
3
4
#include <reg51.h>

sbit led = P2^0;
sbit wave = P1^0;

区别:

  • bit 是 C51 位变量类型,由编译器分配位空间。

  • sbit 用来定义可位寻址 SFR 的某一位,通常写在函数外作为全局定义。

  • sfr 用来定义特殊功能寄存器。

3.2 C51 存储类型

存储类型 对应空间 复习要点
data 片内 RAM 直接寻址区 访问快,空间小
idata 片内 RAM 间接寻址区 通过间接方式访问
bdata 可位寻址数据区 可字节访问,也可位访问
xdata 片外 RAM 64 KB 常用于外部数据存储器
pdata 片外 RAM 低 256 B 分页访问
code 程序存储器 存放常量、表格

高频填空:

  • C51 内部数据存储区可分为 dataidatabdata

  • C51 访问片外数据存储区可用 xdatapdata

  • C51 访问程序存储区用 code

4. 并行 I/O 与接口

4.1 P0-P3 端口

端口 高频特性
P0 作总线端口时为双向口;作普通 I/O 时无内部上拉,外部必须接上拉电阻
P1 准双向 I/O 口
P2 准双向 I/O 口;外扩存储器时常作高 8 位地址总线
P3 准双向 I/O 口;具有第二功能

P3 第二功能:

引脚 第二功能
P3.0 RXD
P3.1 TXD
P3.2 INT0
P3.3 INT1
P3.4 T0
P3.5 T1
P3.6 WR
P3.7 RD

必背判断:

  • P1-P3 作输入端口使用时,必须先向端口寄存器写入 1。

  • P0 口作普通 I/O 使用时,外部要接上拉电阻。

  • P0-P3 的驱动能力不同。

4.2 LED 与按键

LED 常见接法:

  • 共阳极 LED:低电平点亮。

  • 共阴极 LED:高电平点亮。

程序题里要先看题目说明。资料中出现过:

  • P1 = 0xff; 表示开始时 LED 全灭,随后逐级将单个位清 0 点亮。

  • P1 = 0x00; 表示 P1 口 8 只 LED 全亮,具体取决于题目给出的共阳/共阴连接。

按键抖动:

  • 原因:机械弹簧效应、金属触点弹跳、外部振动。

  • 消抖方法:软件延时/滤波/状态稳定检测;硬件 RC 或专用消抖电路。

独立键盘与矩阵键盘:

  • 按键少于 8 个时,常用独立式键盘。

  • 按键数量较多时,常用矩阵式键盘。

  • 8 根 I/O 线用于独立键盘最多接 8 个键;用于矩阵键盘按 4 行 4 列可接 16 个键。

4.3 LED 数码管

数码管分共阳极、共阴极。

静态显示:

  • 每位数码管有独立段码输出。

  • 显示稳定、亮度高、程序简单。

  • 占用 I/O 线多。

动态显示:

  • 多位数码管轮流点亮。

  • 利用 LED 余辉和人眼视觉暂留形成多位同时亮的效果。

  • 占用 I/O 线少,程序要不断扫描刷新。

判断题高频:

  • 动态显示任一时刻只有一个数码管处于点亮状态。

  • LED 数码管动态扫描不是所有位真正同时点亮。

5. 中断系统

5.1 中断源、入口地址、C51 编号

中断源 请求标志 允许位 优先级位 入口地址 C51 编号
外部中断 0 IE0 EX0 PX0 0003H interrupt 0
定时器 T0 TF0 ET0 PT0 000BH interrupt 1
外部中断 1 IE1 EX1 PX1 0013H interrupt 2
定时器 T1 TF1 ET1 PT1 001BH interrupt 3
串行口 RI/TI ES PS 0023H interrupt 4

C51 中断函数写法:

1
2
3
4
5
6
7
8
9
void timer0_isr(void) interrupt 1
{
/* T0 中断服务程序 */
}

void uart_isr(void) interrupt 4
{
/* 串口中断服务程序 */
}

5.2 IE、IP、TCON、SCON

IE 是中断允许寄存器:

名称 含义
IE.7 EA 总中断允许
IE.4 ES 串行口中断允许
IE.3 ET1 T1 中断允许
IE.2 EX1 外部中断 1 允许
IE.1 ET0 T0 中断允许
IE.0 EX0 外部中断 0 允许

IP 是中断优先级寄存器:

名称 含义
IP.4 PS 串行口优先级
IP.3 PT1 T1 优先级
IP.2 PX1 外部中断 1 优先级
IP.1 PT0 T0 优先级
IP.0 PX0 外部中断 0 优先级

TCON 与中断/定时器都有关:

名称 含义
TCON.7 TF1 T1 溢出标志
TCON.6 TR1 T1 启动控制
TCON.5 TF0 T0 溢出标志
TCON.4 TR0 T0 启动控制
TCON.3 IE1 外部中断 1 请求标志
TCON.2 IT1 外部中断 1 触发方式
TCON.1 IE0 外部中断 0 请求标志
TCON.0 IT0 外部中断 0 触发方式

外部中断触发方式:

  • ITx = 0:低电平触发。

  • ITx = 1:负跳沿触发。

5.3 中断响应条件

一个中断源的请求被响应,必须同时满足:

  1. 总中断允许位 EA = 1

  2. 该中断源发出请求,对应请求标志为 1。

  3. 该中断源允许位为 1。

  4. 当前没有同级或更高级中断正在服务。

中断嵌套原则:

  • 高优先级中断能中断低优先级中断。

  • 低优先级中断不能中断高优先级中断。

  • 同级中断不能嵌套。

  • 同一优先级同时请求时,按自然优先级顺序响应:外部中断 0、T0、外部中断 1、T1、串行口。

高频判断:

  • “同为高中断优先级,外部中断 0 能打断正在执行的外部中断 1 服务程序”是错的。

  • “必须有中断源发出请求,并且 CPU 开中断,CPU 才可能响应中断”是对的。

  • “只要开中断且中断源请求,CPU 就立刻响应”是错的,还要看优先级和当前服务状态。

5.4 常用初始化模板

外部中断 0,负跳沿触发:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <reg51.h>

void main(void)
{
EA = 1;
EX0 = 1;
IT0 = 1;
while (1) {
;
}
}

void int0_isr(void) interrupt 0
{
/* 外部中断 0 服务 */
}

只允许 T0、T1 中断:

1
2
3
4
5
6
EA = 1;
ET0 = 1;
ET1 = 1;
EX0 = 0;
EX1 = 0;
ES = 0;

字节方式可写:

1
IE = 0x8A;  /* EA=1, ET1=1, ET0=1 */

6. 定时器/计数器

6.1 TMOD 格式

TMOD 高 4 位控制 T1,低 4 位控制 T0。

1
2
TMOD: GATE C/T M1 M0 | GATE C/T M1 M0
T1 | T0
含义
GATE 门控位。0 时由 TRx 控制启动;1 时由 TRx 和 INTx 引脚共同控制
C/T 0 为定时器,1 为计数器
M1 M0 工作方式选择

工作方式:

M1 M0 方式 含义 最大计数值
00 方式 0 13 位定时/计数器 8192
01 方式 1 16 位定时/计数器 65536
10 方式 2 8 位自动重装 256
11 方式 3 T0 分成两个 8 位计数器 按题目分析

常用 TMOD 值:

需求 TMOD
T0 定时方式 1 0x01
T0 计数方式 2 0x06
T0 定时方式 2 0x02
T1 定时方式 1 0x10
T1 定时方式 2 0x20

6.2 初值计算

定时器方式 1 的初值公式:

1
2
3
4
计数次数 N = 定时时间 / 机器周期
初值 X = 65536 - N
THx = X / 256
TLx = X % 256

若 fosc 用 MHz,定时时间用 us:

1
定时时间(us) = (65536 - X) * 12 / fosc(MHz)

方式 2 的初值公式:

1
2
3
初值 X = 256 - N
THx = X
TLx = X

方式 2 中,TLx 溢出时 TFx 置 1,同时 THx 的内容自动重装到 TLx。它适合循环定时、循环计数、串口波特率发生器。

6.3 常考计算样例

样例 1:12 MHz,方式 1 定时 1 ms

1
2
3
4
5
Tcy = 1 us
N = 1000 / 1 = 1000
X = 65536 - 1000 = 64536 = FC18H
TH0 = FCH
TL0 = 18H

样例 2:6 MHz,T1 方式 1 定时 50 ms

1
2
3
4
5
6
7
8
9
Tcy = 2 us
N = 50000 / 2 = 25000
X = 65536 - 25000 = 40536 = 9E58H
TMOD = 0x10
TH1 = 0x9E
TL1 = 0x58
ET1 = 1
EA = 1
TR1 = 1

样例 3:T0 方式 2 计数 100 个脉冲中断

1
2
3
4
5
6
7
8
9
方式 2 最大计数 256
N = 100
X = 256 - 100 = 156
TMOD = 0x06
TH0 = 156
TL0 = 156
ET0 = 1
EA = 1
TR0 = 1

6.4 最大定时时间表

按 12T 传统 51 核计算:

fosc Tcy 方式 0 最大 方式 1 最大 方式 2 最大
3 MHz 4 us 32.768 ms 262.144 ms 1.024 ms
6 MHz 2 us 16.384 ms 131.072 ms 512 us
12 MHz 1 us 8.192 ms 65.536 ms 256 us
24 MHz 0.5 us 4.096 ms 32.768 ms 128 us

期末卷喜欢问“12 MHz 下哪种方式一次可定时 5 ms”:方式 0 和方式 1 都可以,因为方式 0 最大 8.192 ms,方式 1 最大 65.536 ms,方式 2 最大 256 us。

6.5 长时间定时

单个定时器最大定时时间有限。要实现 0.5 s、1 s、30 s 等长定时,常用两种方法:

  1. 定时器中断加软件计数。例如 12 MHz 下 T0 每 5 ms 中断一次,软件计数 100 次得到 0.5 s。

  2. T0、T1 级联。例如 T0 溢出后输出脉冲给 T1 外部计数输入端,再结合软件计数得到更长时间。

6.6 定时中断闪灯模板

以 T0 方式 1 周期性中断为例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <reg51.h>

unsigned char cnt = 100;

void main(void)
{
TMOD = 0x01; /* T0 方式 1 */
TH0 = 0xEE;
TL0 = 0x00;
P1 = 0x00;
ET0 = 1;
EA = 1;
TR0 = 1;
while (1) {
;
}
}

void timer0_isr(void) interrupt 1
{
TH0 = 0xEE;
TL0 = 0x00;
cnt--;
if (cnt == 0) {
P1 = ~P1;
cnt = 100;
}
}

程序填空题常填:

  • TMOD = 0x01;

  • TH0 = 初值高 8 位;

  • TL0 = 初值低 8 位;

  • ET0 = 1;

  • TR0 = 1;

  • interrupt 1

7. 串行通信

7.1 串口基础

AT89S51 串行口是全双工串行口。发送时把并行数据转换成串行数据,接收时把串行数据转换成并行数据。

SBUF 用于存放待发送或已接收到的数据。发送缓冲器和接收缓冲器共用同一个 SBUF 地址,但硬件上是两个不同寄存器。

7.2 SCON 格式

1
SCON: SM0 SM1 SM2 REN TB8 RB8 TI RI
含义
SM0, SM1 串口工作方式选择
SM2 多机通信控制位
REN 允许接收
TB8 发送第 9 位
RB8 接收第 9 位
TI 发送中断标志
RI 接收中断标志

常用设置:

1
SCON = 0x50;  /* 方式 1,允许接收 */

0x50 = 0101 0000B,即 SM0=0SM1=1REN=1

PCON 常考:

1
PCON: SMOD - - - GF1 GF0 PD IDL
  • SMOD = 0:波特率不倍速。

  • SMOD = 1:波特率倍速。

7.3 串口工作方式

方式 帧格式/用途 波特率
方式 0 同步移位寄存器,常用于扩展并行 I/O 固定,fosc/12
方式 1 1 起始位、8 数据位、1 停止位 可变,由 T1 溢出率设定
方式 2 1 起始位、8 数据位、第 9 位、1 停止位 固定,fosc/64 或 fosc/32
方式 3 1 起始位、8 数据位、第 9 位、1 停止位 可变,由 T1 溢出率设定

高频判断:

  • 串行口方式 1 的波特率是可变的,通过 T1 溢出率设定。

  • 方式 0 没有起始位和停止位,因为它是同步移位寄存器方式。

  • 第 9 位功能可由用户定义;发送第 9 位放在 TB8,接收第 9 位保存到 RB8。

  • 串口中断服务程序中,RI 和 TI 要由软件清零。

7.4 波特率计算

T1 方式 2 作波特率发生器时:

1
2
波特率 = 2^SMOD * fosc / [384 * (256 - X)]
X = 256 - 2^SMOD * fosc / (384 * 波特率)

其中 X 是 TH1/TL1 装入的初值。

常用结果,fosc=11.0592 MHz,T1 方式 2,SMOD=0:

波特率 初值 X 十六进制
2400 bps 244 F4H
4800 bps 250 FAH
9600 bps 253 FDH

资料冲突核对:

  • 部分答案文件给出 11.0592 MHz、方式 1、T1 方式 2、9600 bps 时 TH1=0xFDTL1=0xFD

  • 2024单片机考试A卷答案.docx2023_2024(A卷)答案.docx 的串口初始化示例中写有 TL1 = 0xDC; TH1 = 0xDC;

  • 按上面的波特率公式,11.0592 MHz、SMOD=0、T1 方式 2、9600 bps 的计算结果为 FDH。考试中遇到计算题,写公式、代入过程和 FDH

7.5 串口初始化模板

9600 bps,11.0592 MHz,方式 1,T1 方式 2:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <reg51.h>

void uart_init(void)
{
PCON &= 0x7F; /* SMOD=0 */
SCON = 0x50; /* 串口方式 1,允许接收 */
TMOD &= 0x0F; /* 清 T1 控制位 */
TMOD |= 0x20; /* T1 方式 2 */
TH1 = 0xFD;
TL1 = 0xFD;
ET1 = 0;
TR1 = 1;
ES = 1;
EA = 1;
}

void send_char(char dat)
{
SBUF = dat;
while (TI == 0) {
;
}
TI = 0;
}

void send_string(char *s)
{
while (*s) {
send_char(*s);
s++;
}
}

void uart_isr(void) interrupt 4
{
if (RI == 1) {
char dat = SBUF;
RI = 0;
/* 处理 dat */
}
if (TI == 1) {
TI = 0;
}
}

串口程序设计题常见要求:

  • PC 发送 "Start",单片机返回 "110592"

  • PC 发送 "NUM",单片机返回 "123456"

  • PC 分两次发送 0-9 的数字,单片机计算和后返回。

答题步骤:

  1. uart_init()SCON=0x50TMOD|=0x20、装入 TH1/TL1TR1=1ES=1EA=1

  2. 写发送字符函数。

  3. 写发送字符串函数。

  4. 在串口中断中读取 SBUF,判断接收到的字符序列,清 RI

  5. 主函数保持 while(1);

8. A/D 与 D/A 转换

8.1 DAC

D/A 转换器主要技术指标:

  • 分辨率:输入数字量变化 1 个单位时,输出模拟量的最小变化。

  • 建立时间:从输入数字量变化到输出达到终值误差范围所需时间。

  • 转换精度:实际输出与理想输出的接近程度。

n 位 DAC,满量程电压为 VFS:

1
分辨率 = VFS / 2^n

例:12 位 DAC,满量程 5 V:

1
分辨率 = 5 / 4096 = 1.22 mV

DAC0832 常用转换关系:

1
Vout = - Vref * B / 256

B 为 8 位输入数字量的十进制值。负号来自后级反相运放。

8.2 ADC

A/D 转换器主要技术指标:

  • 转换时间或转换速率。

  • 分辨率。

  • 转换精度。

ADC 分辨率表示输出数字量变化一个相邻数码所需输入模拟电压的变化量。

量化误差:

1
最大量化误差 = ± 1/2 LSB

例:8 位 ADC,输入范围 0-5 V:

1
2
1 LSB = 5 / 256 = 19.53 mV
最大量化误差 = ±9.77 mV

ADC0809 常用关系:

1
B = Vin / Vref * 256

计算后取整数并限制在 0-255 范围。

资料中反复出现的判断:

  • ADC0809 可利用转换结束信号 EOC 向 AT89S51 发出中断请求。

  • 输出模拟量的最小变化量称为 DAC 的分辨率,不是 ADC 的分辨率。

  • 双积分型 ADC 抗干扰能力好,转换速度慢。

  • 逐次逼近型 ADC 精度、速度、价格适中,应用广。

  • Sigma-Delta ADC 分辨率高、线性度好、抗干扰能力强。

9. 高频简答题整理

9.1 外部中断有哪两种触发方式

外部中断有低电平触发和负跳沿触发两种方式。

  • 低电平触发:当 INTx 引脚保持低电平时产生中断请求。

  • 负跳沿触发:当 INTx 引脚由高电平变为低电平时产生中断请求。

9.2 中断嵌套的基本原理

中断系统按优先级管理多个中断请求。高优先级中断可以打断正在执行的低优先级中断服务程序;低优先级中断不能打断高优先级中断;同级中断不能相互嵌套。同级多个中断同时请求时,按自然优先级顺序响应。

9.3 查询方式与中断方式区别

查询方式需要 CPU 不断检查外设状态,查询期间 CPU 难以执行其他任务。中断方式下,外设事件发生时才请求 CPU 响应,CPU 平时可执行其他任务。

中断方式优点:

  • 实时响应外部事件。

  • 节省 CPU 时间。

  • 等待事件时可进入低功耗状态。

9.4 定时器方式 2 的特点和用途

方式 2 是 8 位自动重装载方式。TLx 用作 8 位计数器,THx 保存初值。TLx 溢出时 TFx 置 1,同时 THx 自动重装到 TLx。

用途:

  • 串口波特率发生器。

  • 周期性定时。

  • 周期性计数。

  • 对定时精度要求高的循环定时任务。

9.5 按键抖动原因与消抖方法

抖动原因:

  • 按键机械弹簧效应。

  • 金属触点闭合或断开瞬间弹跳。

  • 外部机械振动。

消抖方法:

  • 软件消抖:延时、滤波、状态稳定检测。

  • 硬件消抖:RC 电路、施密特触发器或专用消抖电路。

9.6 单片机应用举例

工业应用:

  • 温度、压力、速度等检测与控制。

  • 工业生产线控制。

  • 电机控制。

日常生活应用:

  • 洗衣机、电饭煲、空调控制。

  • 汽车电子设备。

  • 智能门锁、家电遥控。

10. 高频程序题模板

10.1 流水灯

题目特征:8 个 LED 接 P1 或 P2,要求从某一位到另一位依次点亮。

模板:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <reg51.h>

void delay(void)
{
unsigned int i, j;
for (i = 0; i < 500; i++) {
for (j = 0; j < 120; j++) {
;
}
}
}

void main(void)
{
unsigned char led = 0x01;
while (1) {
P2 = led;
delay();
led <<= 1;
if (led == 0x00) {
led = 0x01;
}
}
}

若题目要求 P2.7 到 P2.0 依次点亮,把初值和移位方向改为:

1
2
3
4
5
6
unsigned char led = 0x80;
P2 = led;
led >>= 1;
if (led == 0x00) {
led = 0x80;
}

10.2 外部中断 LED 交替闪烁

题目特征:P1 接 8 个 LED,P3.2/INT0 接按键,负跳沿触发,中断中低 4 位和高 4 位交替闪烁。

模板:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <reg51.h>

void delay_ms(unsigned int ms)
{
unsigned int i, j;
for (i = 0; i < ms; i++) {
for (j = 0; j < 120; j++) {
;
}
}
}

void main(void)
{
EA = 1;
EX0 = 1;
IT0 = 1;
P1 = 0x00;
while (1) {
;
}
}

void int0_isr(void) interrupt 0
{
EX0 = 0;
P1 = 0x0F;
delay_ms(500);
P1 = 0xF0;
delay_ms(500);
EX0 = 1;
}

答题时要说明:

  • 主程序完成中断初始化和 LED 初始状态设置。

  • 中断服务程序完成 LED 模式切换。

  • 按键电阻用于上拉,使未按下时 INT0 保持高电平,按下时形成负跳沿。

10.3 T0 定时中断产生方波

题目特征:用 T0 方式 1,在 P1.0 或 P2.0 输出固定周期、固定占空比方波。

50% 占空比模板:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <reg51.h>

sbit wave = P1^0;

void main(void)
{
wave = 0;
TMOD = 0x01;
TH0 = 0xFC;
TL0 = 0x18;
ET0 = 1;
EA = 1;
TR0 = 1;
while (1) {
;
}
}

void timer0_isr(void) interrupt 1
{
TH0 = 0xFC;
TL0 = 0x18;
wave = ~wave;
}

分析方法:

  1. 周期为 T,占空比 50%,中断间隔取 T/2。

  2. 按 T/2 计算初值。

  3. 中断中重新装初值并翻转引脚。

10.4 非 50% 占空比 PWM

题目特征:周期 500 ms,占空比 4:1;或周期 600 us,占空比 5:1。

答题思路:

  1. 把周期分成高电平时间和低电平时间。

  2. 用一个状态变量记录当前输出高电平还是低电平。

  3. 每次中断按当前状态装入不同初值。

  4. 翻转输出状态。

示意代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <reg51.h>

sbit wave = P1^0;
bit state = 0;

void load_high_time(void)
{
TH0 = 0x00;
TL0 = 0x00;
}

void load_low_time(void)
{
TH0 = 0x00;
TL0 = 0x00;
}

void main(void)
{
TMOD = 0x01;
wave = 1;
load_high_time();
ET0 = 1;
EA = 1;
TR0 = 1;
while (1) {
;
}
}

void timer0_isr(void) interrupt 1
{
if (state == 0) {
wave = 0;
load_low_time();
state = 1;
} else {
wave = 1;
load_high_time();
state = 0;
}
}

考试时必须把 load_high_time()load_low_time() 中的 TH/TL 换成按题目计算出的精确初值。

10.5 串口接收命令并返回字符串

题目特征:P3.0 为 RXD,P3.1 为 TXD,11.0592 MHz,9600 bps,方式 1,接收字符串后返回指定字符串。

核心模板见第 7.5 节。程序题评分点通常是:

  • 串口初始化正确。

  • SBUF 发送与 TI 清零正确。

  • SBUF 接收与 RI 清零正确。

  • 字符串比较逻辑清楚。

  • 主函数保持循环等待。

11. 选择判断易错点速记

  1. RAM 不属于 CPU 的组成部分。

  2. AT89S51 的串行口是全双工的。

  3. 控制串行口工作方式的寄存器是 SCON。

  4. 控制定时器工作方式的寄存器是 TMOD。

  5. 控制中断允许的寄存器是 IE。

  6. 设置中断优先级的寄存器是 IP。

  7. SCON 与定时器/计数器控制无关。

  8. IE 与定时器/计数器中断允许有关,所以题目说“IE 与定时器/计数器控制无关”要看语境;它不设定工作方式,但可允许定时器中断。

  9. P0 作普通 I/O 没有内部上拉。

  10. P1-P3 作输入前要写 1。

  11. 串口方式 1 波特率可变,不是固定 fosc/32。

  12. 串口方式 2 波特率固定,为 fosc/64 或 fosc/32。

  13. 串口方式 0 常用于扩展并行 I/O。

  14. 方式 1 定时器是 16 位。

  15. 方式 2 定时器是 8 位自动重装。

  16. 12 MHz 下方式 2 一次最大定时 256 us,不能一次定时 5 ms。

  17. 高优先级中断能中断低优先级中断,同级不能嵌套。

  18. 串口 RI/TI 要软件清零。

  19. ADC0809 的 EOC 可作为中断请求信号。

  20. DAC 的分辨率是输出模拟量的最小变化量。

12. 考前公式表

12.1 时间

1
2
Tcy = 12 / fosc
N = 定时时间 / Tcy

12.2 定时器方式 1

1
2
3
X = 65536 - N
THx = X / 256
TLx = X % 256

12.3 定时器方式 2

1
2
3
X = 256 - N
THx = X
TLx = X

12.4 串口方式 1/3,T1 方式 2

1
2
波特率 = 2^SMOD * fosc / [384 * (256 - X)]
X = 256 - 2^SMOD * fosc / (384 * 波特率)

12.5 DAC 分辨率

1
分辨率 = VFS / 2^n

12.6 ADC 量化误差

1
2
最大量化误差 = ± 1/2 LSB
1 LSB = 满量程输入电压 / 2^n

13. 一页背诵清单

中断入口与编号:

1
2
3
4
5
INT0: 0003H, interrupt 0
T0: 000BH, interrupt 1
INT1: 0013H, interrupt 2
T1: 001BH, interrupt 3
串口: 0023H, interrupt 4

常用寄存器:

1
2
3
4
5
6
IE:   EA ES ET1 EX1 ET0 EX0
IP: PS PT1 PX1 PT0 PX0
TCON: TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
TMOD: GATE C/T M1 M0 | GATE C/T M1 M0
SCON: SM0 SM1 SM2 REN TB8 RB8 TI RI
PCON: SMOD ... PD IDL

常用初始化:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/* T0 方式 1 */
TMOD = 0x01;
ET0 = 1;
EA = 1;
TR0 = 1;

/* T1 方式 2 作串口波特率发生器 */
SCON = 0x50;
TMOD &= 0x0F;
TMOD |= 0x20;
TH1 = 0xFD;
TL1 = 0xFD;
TR1 = 1;
ES = 1;
EA = 1;

/* 外部中断 0 负跳沿 */
EA = 1;
EX0 = 1;
IT0 = 1;

常用结论:

  • AT89S51:12 个振荡周期为 1 个机器周期。

  • 12 MHz:1 个机器周期为 1 us。

  • P0 普通 I/O 需要外接上拉。

  • P1-P3 输入前先写 1。

  • 串口方式 1:起始位 + 8 数据位 + 停止位。

  • 串口方式 1 波特率由 T1 溢出率设定。

  • 定时器方式 2 自动重装,适合串口波特率发生器。

  • 中断服务函数不能按普通函数方式直接调用。

14. 期末卷答题策略

选择题:

  • 看到 CPU 组成,排除 RAM。

  • 看到串口工作方式,找 SCON。

  • 看到定时器工作方式,找 TMOD。

  • 看到中断允许,找 IE。

  • 看到优先级,找 IP。

  • 看到 P0 普通 I/O,想到外接上拉。

判断题:

  • “同级中断能嵌套”相关说法为错。

  • “方式 1 波特率固定”相关说法为错。

  • “位寻址区不能字节寻址”相关说法为错。

  • “动态显示同一时刻所有数码管都亮”相关说法为错。

简答题:

  • 先写定义,再写工作过程,最后写用途。

  • 定时器方式 2、中断响应条件、按键消抖、查询与中断区别属于必背题。

程序填空:

  • 先确定用 T0 还是 T1。

  • 再确定 TMOD。

  • 再算 TH/TL。

  • 最后补 ETx=1EA=1TRx=1interrupt 编号

程序设计:

  • 先写头文件和 sbit

  • 写初始化。

  • 写延时或定时器中断。

  • 写主循环。

  • 写中断函数。

  • 串口题必须清 RI/TI

15. 资料来源范围

本文整理时读取了根目录下的全部 Word/PPT 资料,包括:

  • 单片机复习资料汇总 中的历年 A/B 卷、测验题、答案、课后习题。

  • 根目录中的 单片机第一次随堂测试空白版 (1).docx

  • 根目录中的 单片机随堂测试第二次.docx

整理中保留了资料中反复出现的考试口径,并对串口 9600 bps 初值这类资料内冲突点作了单独标注。