5.1 中断概述
5.1.1 中断的定义
中断是指CPU在执行程序的过程中,遇到突发事件时,暂停当前程序的执行,转去处理突发事件,处理完毕后,再回到原来被暂停的程序继续执行的过程。
中断机制是单片机系统中非常重要的组成部分,它使得单片机能够实时响应外部事件,提高了系统的处理能力和灵活性。
5.1.2 中断的作用
提高CPU工作效率
CPU可以在没有中断请求时执行主程序,有中断请求时才去处理中断,避免了CPU的空转等待。
实时处理
能够及时响应外部事件,满足实时控制系统的要求。
故障处理
可以及时处理系统中的故障,如电源掉电、数据错误等。
实现多任务
通过中断机制,可以实现单片机的多任务处理。
5.1.3 中断的基本概念
中断响应
CPU暂停当前程序,转去执行中断服务程序
中断服务程序
处理中断事件的程序代码
中断返回
中断服务程序执行完毕后返回主程序
断点保护
保存主程序的执行位置,以便中断返回后继续执行
5.1.4 中断系统的组成
硬件组成
- 中断源:产生中断请求的设备或事件
- 中断控制器:管理和处理中断请求
- CPU:执行中断响应和处理
软件组成
- 中断服务程序:处理中断事件的程序
- 中断初始化程序:设置中断参数
- 中断向量表:存储中断服务程序的入口地址
5.1.5 8051单片机的中断系统
8051单片机有5个中断源(基本型),分别是:外部中断0(INT0)、定时器/计数器0溢出中断(TF0)、外部中断1(INT1)、定时器/计数器1溢出中断(TF1)和串行口中断(RI/TI)。
| 中断源 | 中断请求标志 | 中断向量地址 | 默认优先级 |
|---|---|---|---|
| 外部中断0(INT0) | IE0 | 0003H | 最高 |
| 定时器/计数器0溢出中断(TF0) | TF0 | 000BH | 次高 |
| 外部中断1(INT1) | IE1 | 0013H | 中 |
| 定时器/计数器1溢出中断(TF1) | TF1 | 001BH | 次低 |
| 串行口中断(RI/TI) | RI/TI | 0023H | 最低 |
知识扩展
8052单片机在8051的基础上增加了一个定时器/计数器2中断,中断请求标志为TF2/EXF2,中断向量地址为002BH。
5.2 中断产生、响应与撤除
5.2.1 中断源分类
外部中断
由外部设备产生的中断请求,用于响应外部事件。
- 外部中断0(INT0):由P3.2引脚输入
- 外部中断1(INT1):由P3.3引脚输入
- 触发方式可设置为电平触发或边沿触发
内部中断
由单片机内部事件产生的中断请求,用于处理内部事务。
- 定时器/计数器溢出中断:TF0、TF1
- 串行口发送/接收中断:RI/TI
- 其他内部中断(如8052的定时器2中断)
5.2.2 中断请求标志
每个中断源都有一个中断请求标志位,用于标志该中断源是否有中断请求。这些标志位通常位于特殊功能寄存器中。
| 中断源 | 请求标志 | 所在寄存器 | 标志置位条件 |
|---|---|---|---|
| 外部中断0(INT0) | IE0 | TCON | 外部信号触发(电平或边沿) |
| 定时器/计数器0溢出中断 | TF0 | TCON | 定时器/计数器0溢出 |
| 外部中断1(INT1) | IE1 | TCON | 外部信号触发(电平或边沿) |
| 定时器/计数器1溢出中断 | TF1 | TCON | 定时器/计数器1溢出 |
| 串行口中断 | RI/TI | SCON | 串行口接收完成(RI)/发送完成(TI) |
5.2.3 中断响应条件
必要条件
- 1 中断源有中断请求(相应的中断请求标志置1)
- 2 此中断源的中断允许位为1(IE寄存器相应位为1)
- 3 CPU开中断(总中断允许位EA=1)
附加条件
- 1 无同级或更高级中断正在被服务
- 2 当前执行的指令不是RETI或访问IE、IP的指令
- 3 若为上述指令,则需等待该指令执行完毕且再执行一条指令后
5.2.4 中断响应过程
1. 检测中断请求
CPU在每个机器周期的S5P2时刻检测各中断源的中断请求标志位。
2. 判断响应条件
检查是否满足中断响应的所有条件,若满足则响应中断,否则忽略。
3. 保护断点
将当前PC值(断点地址)压入堆栈,以便中断返回后能继续执行主程序。
4. 关中断(部分情况)
对于外部中断0和外部中断1,响应后会自动关闭同级中断;其他中断不会自动关闭。
5. 转去执行中断服务程序
根据中断源的向量地址,将对应的中断服务程序入口地址装入PC,开始执行中断服务程序。
5.2.5 中断撤除
中断撤除是指清除中断请求标志,以免重复响应同一中断请求。不同中断源的撤除方式不同:
自动撤除
- 定时器溢出中断:CPU响应中断后自动清除TF0/TF1
- 边沿触发的外部中断:CPU响应中断后自动清除IE0/IE1
手动撤除
- 电平触发的外部中断:需外部电路配合清除
- 串行口中断:需在中断服务程序中手动清除RI/TI
注意事项
对于电平触发的外部中断,如果中断请求信号不能及时撤除,可能会导致中断服务程序执行完毕后再次响应同一中断请求,造成重复中断。
5.3 中断初始化
5.3.1 中断初始化的步骤
设置中断请求触发方式
对于外部中断,需要设置其触发方式:电平触发或边沿触发。这通过TCON寄存器中的IT0和IT1位来实现。
设置中断优先级
根据需要设置各中断源的优先级,通过IP寄存器实现。8051支持两级优先级:高优先级和低优先级。
开中断
打开总中断允许位EA,并允许相应中断源的中断请求。这通过IE寄存器实现。
5.3.2 中断控制寄存器
IE寄存器(中断允许寄存器)
用于控制各中断源的中断允许或禁止
| 位 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
|---|---|---|---|---|---|---|---|---|
| 位名 | EA | — | — | ES | ET1 | EX1 | ET0 | EX0 |
| 功能 | 总中断 允许 |
保留 | 保留 | 串行口 允许 |
定时器1 允许 |
外部中断1 允许 |
定时器0 允许 |
外部中断0 允许 |
| 取值 | 1=开/0=关 | × | × | 1=允许中断 / 0=禁止中断 | ||||
IP寄存器(中断优先级寄存器)
用于设置各中断源的优先级
| 位 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
|---|---|---|---|---|---|---|---|---|
| 位名 | — | — | — | PS | PT1 | PX1 | PT0 | PX0 |
| 功能 | 保留 | 保留 | 保留 | 串行口 优先级 |
定时器1 优先级 |
外部中断1 优先级 |
定时器0 优先级 |
外部中断0 优先级 |
| 取值 | × | × | × | 1=高优先级 / 0=低优先级 | ||||
TCON寄存器(定时器/计数器控制寄存器)
用于控制定时器的运行和外部中断的触发方式
| 位 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
|---|---|---|---|---|---|---|---|---|
| 位名 | TF1 | TR1 | TF0 | TR0 | IE1 | IT1 | IE0 | IT0 |
| 功能 | 定时器1 溢出标志 |
定时器1 运行控制 |
定时器0 溢出标志 |
定时器0 运行控制 |
外部中断1 请求标志 |
外部中断1 触发方式 |
外部中断0 请求标志 |
外部中断0 触发方式 |
| 取值 | 1=溢出 | 1=启动 | 1=溢出 | 1=启动 | 1=有请求 | 1=边沿 0=电平 |
1=有请求 | 1=边沿 0=电平 |
SCON寄存器(串行口控制寄存器)
用于控制串行口的工作模式和中断标志
| 位 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
|---|---|---|---|---|---|---|---|---|
| 位名 | SM0 SM1 | SM2 | REN | TB8 | RB8 | TI | RI | |
| 功能 | 串行口模式选择 | 多机通信 控制 |
接收允许 | 发送数据 第9位 |
接收数据 第9位 |
发送中断 标志 |
接收中断 标志 |
|
| 取值 | 00=模式0 01=模式1 10=模式2 11=模式3 |
1=多机 | 1=允许 接收 |
发送第9位 | 接收第9位 | 1=发送完 须软件清0 |
1=接收完 须软件清0 |
|
5.3.3 中断初始化实例
实例一:外部中断0初始化
设置外部中断0为边沿触发方式,高优先级:
实例二:定时器0中断初始化
设置定时器0为模式1,低优先级,定时50ms:
实例三:外部中断1初始化
设置外部中断1为电平触发方式,低优先级:
实例四:串行口中断初始化
设置串行口为模式1,允许接收,高优先级:
初始化注意事项
- 初始化顺序一般为:先设置触发方式,再设置优先级,最后开中断
- 高优先级中断可以打断低优先级中断,形成中断嵌套
- 同级中断按固定顺序查询响应:INT0 → TF0 → INT1 → TF1 → RI/TI
5.4 堆栈
5.4.1 堆栈的基本概念
堆栈是单片机内存中的一个特殊区域,用于临时存放数据和地址。它遵循"后进先出"(LIFO)的原则,类似于一摞盘子,最后放上去的盘子总是最先被拿走。
堆栈的主要作用
-
断点保护
在中断或子程序调用时保存返回地址
-
现场保护
保存寄存器内容,确保中断返回后原程序能继续正确执行
-
参数传递
在子程序调用时传递参数和返回结果
堆栈操作指令
-
PUSH
将数据压入堆栈,SP指针加1
-
POP
从堆栈弹出数据,SP指针减1
-
MOV SP, #data
设置堆栈指针初值
5.4.2 堆栈指针(SP)
堆栈指针(SP)是一个8位寄存器,用于指示堆栈的栈顶位置。8051单片机复位后,SP的初始值为07H,即堆栈从08H地址开始。
堆栈操作示例
初始状态
PUSH ACC
PUSH B
5.4.3 堆栈在中断处理中的作用
在中断处理过程中,堆栈主要用于保存断点地址和现场数据:
断点保护
当CPU响应中断时,会自动将当前PC值(断点地址)压入堆栈,以便中断返回时能回到原程序继续执行。
现场保护
在中断服务程序中,通常需要保护现场,即将中断服务程序中要使用的寄存器内容压入堆栈,以免破坏主程序的运行环境。
5.4.4 堆栈的设置与使用注意事项
- 堆栈空间设置:8051复位后SP初值为07H,堆栈从08H开始。由于08H-1FH是工作寄存器区,20H-2FH是位寻址区,建议将SP值初始化为60H或更大值,避免堆栈覆盖这些区域。
- 堆栈深度:堆栈空间有限,避免过深的中断嵌套或子程序调用,防止堆栈溢出。
- PUSH与POP配对:在中断服务程序中,PUSH和POP指令必须配对使用,确保堆栈平衡。
- 中断嵌套:高优先级中断可以打断低优先级中断,此时堆栈需要保存多个断点和现场数据。
5.5 中断控制案例
5.5.1 案例一:外部中断控制LED闪烁
案例描述:利用外部中断0控制LED灯的闪烁。当按键按下时触发外部中断,在中断服务程序中实现LED灯的状态切换。
硬件连接
- LED灯 → P1.0引脚
- 按键 → INT0引脚(P3.2)
- 按键另一端接GND
设计思路
- 1. 初始化外部中断0为边沿触发方式
- 2. 使能外部中断0和总中断
- 3. 在中断服务程序中切换LED状态
;外部中断0控制LED闪烁
ORG 0000H
LJMP MAIN ;跳转到主程序
ORG 0003H ;外部中断0入口地址
LJMP INT0_ISR ;跳转到中断服务程序
ORG 0030H ;主程序起始地址
MAIN:
MOV SP, #60H ;设置堆栈指针
SETB IT0 ;外部中断0边沿触发
SETB EX0 ;使能外部中断0
SETB EA ;开总中断
MOV P1, #0FEH ;P1.0置0,LED点亮
LOOP:
SJMP LOOP ;主程序循环
INT0_ISR:
PUSH ACC ;保护现场
PUSH PSW
CPL P1.0 ;LED状态取反
POP PSW ;恢复现场
POP ACC
RETI ;中断返回
END
5.5.2 案例二:定时器中断实现LED闪烁
案例描述:利用定时器0的中断功能实现LED灯的定时闪烁,每隔500ms闪烁一次。
硬件连接
- LED灯 → P1.0引脚
设计思路
- 1. 设置定时器0为模式1(16位)
- 2. 设置定时初值(50ms)
- 3. 使能定时器中断和总中断
- 4. 在中断服务程序中计数,每10次中断(500ms)切换LED状态
;定时器0中断实现LED闪烁(500ms)
ORG 0000H
LJMP MAIN ;跳转到主程序
ORG 000BH ;定时器0中断入口地址
LJMP T0_ISR ;跳转到中断服务程序
ORG 0030H ;主程序起始地址
MAIN:
MOV SP, #60H ;设置堆栈指针
MOV TMOD, #01H ;定时器0模式1,16位定时
MOV TH0, #3CH ;定时50ms初值
MOV TL0, #0B0H
SETB ET0 ;使能定时器0中断
SETB EA ;开总中断
SETB TR0 ;启动定时器0
MOV R0, #0AH ;计数10次,共500ms
LOOP:
SJMP LOOP ;主程序循环
T0_ISR:
PUSH ACC ;保护现场
PUSH PSW
MOV TH0, #3CH ;重新设置初值
MOV TL0, #0B0H
DJNZ R0, T0_EXIT ;未到500ms则退出
MOV R0, #0AH ;重新计数
CPL P1.0 ;LED状态取反
T0_EXIT:
POP PSW ;恢复现场
POP ACC
RETI ;中断返回
END
5.5.3 案例三:中断嵌套实验
案例描述:演示中断嵌套功能。定时器0为低优先级中断,控制LED1闪烁;外部中断0为高优先级中断,控制LED2闪烁。当外部中断0发生时,应能打断定时器0的中断服务。
硬件连接
- LED1 → P1.0引脚
- LED2 → P1.1引脚
- 按键 → INT0引脚(P3.2)
设计思路
- 1. 设置外部中断0为高优先级(PX0=1)
- 2. 设置定时器0为低优先级(PT0=0)
- 3. 低优先级中断服务程序中加入长延时
- 4. 高优先级中断应能打断低优先级中断
;中断嵌套实验
ORG 0000H
LJMP MAIN ;跳转到主程序
ORG 0003H ;外部中断0入口地址
LJMP INT0_ISR ;跳转到中断服务程序
ORG 000BH ;定时器0中断入口地址
LJMP T0_ISR ;跳转到中断服务程序
ORG 0030H ;主程序起始地址
MAIN:
MOV SP, #60H ;设置堆栈指针
MOV TMOD, #01H ;定时器0模式1
MOV TH0, #3CH ;定时50ms初值
MOV TL0, #0B0H
SETB IT0 ;外部中断0边沿触发
SETB PX0 ;外部中断0高优先级
CLR PT0 ;定时器0低优先级
SETB EX0 ;使能外部中断0
SETB ET0 ;使能定时器0中断
SETB EA ;开总中断
SETB TR0 ;启动定时器0
LOOP:
SJMP LOOP ;主程序循环
T0_ISR:
PUSH ACC ;保护现场
PUSH PSW
MOV TH0, #3CH ;重新设置初值
MOV TL0, #0B0H
CPL P1.0 ;LED1状态取反
;延时一段时间,模拟耗时操作
MOV R1, #0FFH
DELAY1:
MOV R2, #0FFH
DELAY2:
DJNZ R2, DELAY2
DJNZ R1, DELAY1
POP PSW ;恢复现场
POP ACC
RETI ;中断返回
INT0_ISR:
PUSH ACC ;保护现场
PUSH PSW
CPL P1.1 ;LED2状态取反
;延时一段时间,模拟耗时操作
MOV R1, #0FFH
DELAY3:
MOV R2, #0FFH
DELAY4:
DJNZ R2, DELAY4
DJNZ R1, DELAY3
POP PSW ;恢复现场
POP ACC
RETI ;中断返回
END
5.6 本章总结
核心知识点回顾
CPU暂停当前程序转而去处理紧急事件,处理完后返回原程序继续执行
8051有5个中断源:外部中断0/1、定时器中断0/1、串行口中断
IE寄存器控制中断允许,IP寄存器控制中断优先级
LIFO原则,用于断点保护和现场保护,SP指示栈顶位置
学习要点
理解中断的概念和作用
中断是单片机实现实时控制的关键技术
掌握5个中断源的特点和应用场景
外部中断用于处理外部事件,定时器中断用于定时控制
熟悉中断控制寄存器的设置
IE、IP、TCON寄存器的位定义和使用方法
掌握中断服务程序的编写方法
包括现场保护、中断服务主体、现场恢复和RETI指令
理解堆栈的工作原理
PUSH/POP指令、SP指针、断点保护和现场保护
掌握中断嵌套的概念和实现
高优先级中断可以打断低优先级中断的执行
5.7 课后练习题
1 填空题
1. 8051单片机有____个中断源,分为____个优先级。
2. 外部中断0的中断入口地址是____H,定时器T0的中断入口地址是____H。
3. IE寄存器中的EA位是____位,置____表示CPU开放中断。
4. 中断响应的三个必要条件是____、____、____。
5. 8051的堆栈是向____方向生长的,SP是____位寄存器。
6. 中断服务程序返回指令是____,普通子程序返回指令是____。
7. 外部中断的触发方式有____和____两种,由TCON寄存器的____位控制。
8. 中断嵌套的原则是:____优先级的中断可以打断____优先级的中断。
9. 现场保护的内容通常包括____、____、PSW等关键寄存器。
10. 5个中断源中,自然优先级最高的是____,最低的是____。
2 单选题
1. 8051单片机有几个中断源?
A. 3个 B. 5个 C. 6个 D. 8个
2. 当CPU响应中断时,会自动将什么压入堆栈?
A. 累加器A B. 程序计数器PC C. 寄存器B D. SP指针
3. 中断服务程序与普通子程序最显著的区别是?
A. 执行速度快 B. 能实现中断嵌套 C. 代码长 D. 参数多
4. 外部中断0的入口地址是?
A. 0003H B. 000BH C. 0013H D. 001BH
5. IE寄存器中,ET0位置1表示?
A. 开放总中断 B. 允许定时器T0中断 C. 启动T0 D. 清零T0标志
6. 堆栈指针SP复位后的初值是?
A. 00H B. 07H C. 30H D. FFH
7. TCON寄存器中IT0=1时,外部中断0的触发方式是?
A. 低电平 B. 下降沿 C. 高电平 D. 上升沿
8. PUSH指令和POP指令必须成对使用,且顺序是?
A. 后进先出 B. 先进先出 C. 任意顺序 D. 同时进行
9. 同一优先级的中断源同时请求时,按什么顺序响应?
A. 查询顺序 B. 自然优先级 C. 随机 D. 由硬件决定
10. 中断服务程序中保护现场,一般使用什么指令?
A. MOV B. PUSH C. LCALL D. AJMP
3 编程题
1. 编写程序:利用外部中断0控制P1.0口的LED,按一次按键LED状态取反(要求包含完整初始化)。
2. 编写程序:利用定时器T0中断实现P1.0口LED以500ms为周期闪烁(晶振12MHz,使用模式1)。
3. 编写程序:使用两个外部中断(INT0、INT1)分别控制P1.0和P1.1两个LED的亮灭,画出电路连接图并写出程序。
4. 编写程序:使用定时器T1中断实现秒表计时功能,用P1口显示秒数的BCD码。
5. 编写程序:实现P1.0连接的LED在外部中断0触发时点亮,5秒后自动熄灭(使用定时器T0定时)。