5.1 中断系统概述
基本概念 ❗
- 中断 (Interrupt): 程序执行过程中, 允许外部或内部事件通过硬件打断程序的执行, 使其转向为处理外部或内部事件的中断服务程序中去; 完成中断服务程序后, CPU继续原来被打断的程序, 这样的过程称为中断响应过程。
- 中断响应过程图示:
- 主程序执行 -> 中断请求 (断点) -> 响应中断请求 -> 执行中断服务程序→ (
RETI
) -> 返回主程序 -> 继续执行主程序
中断可以实现计算机资源的共享,是单片机进行实时控制(因为定时器中断很准确)以及多任务处理的基础

- 中断源 (Interrupt Source): 能产生中断的外部和内部事件。
- 中断优先级 (Interrupt Priority): CPU用来区分优先处理的中断。
- 中断嵌套 (Interrupt Nesting): 优先级高的事件可以中断CPU正在处理的低级的中断服务程序, 待完成了高级中断服务程序之后, 再继续被打断的低级中断服务程序。
中断的功能
- 实现CPU与外设的速度配合
- 实现实时控制
- 实现故障的及时处理
- 实现人机联系
5.2 80C51的中断系统
80C51的中断系统包括: 中断源、中断标志位、中断允许寄存器IE、中断优先级寄存器IP、中断矢量等。
在80C51中, 只有两级中断优先级。
80C51的中断系统结构示意图❗
- 展示了中断标志位、中断允许寄存器 (IE)、中断优先级寄存器 (IP) 与五个中断源 (INT0, T0, INT1, T1,串行口) 的连接关系。
- 中断源改变中断标志位;
- 每个机器周期去检查中断标志位,决定是否进入中断
- 中断有总开关EA与每个中断各自的小开关
- IP决定不同中断的优先级

中断源❗
80C51有5个中断源 (80C52增加一个T2)。
中断源 | 中断矢量地址 |
外部中断0 (INT0) | 0003H |
定时器/计数器0 (T0) | 000BH |
外部中断1 (INT1) | 0013H |
定时器/计数器1 (T1) | 001BH |
串行口 (RI、TI) | 0023H |
定时器/计数器2 (T2) | 002BH |
(注: 定时器/计数器2是80C52增加的)
中断源分类:
- 外中断类: 外中断请求信号可以是电平或脉冲, 可以通过控制位设置。
- 一些外设请求的中断(例如按钮、键盘),用于人机交互
- 定时中断类: 定时/计数器溢出产生。
- 串行中断类: 串行口接收或发送完一帧数据产生。
中断矢量 (Interrupt Vector):
- 当CPU响应中断时, 由硬件直接产生一个固定的地址, 即矢量地址, 指出每个中断源设备的中断服务程序的入口, 这种方法通常称为矢量中断。
- 每个中断源分别有自己的中断服务程序, 而每个中断服务程序又有自己的矢量地址。
中断源 | 中断矢量地址 |
外部中断0 (INT0) | 0003H |
定时器/计数器0 (T0) | 000BH |
外部中断1 (INT1) | 0013H |
定时器/计数器1 (T1) | 001BH |
串行口 (RI、TI) | 0023H |
定时器/计数器2 (T2) | 002BH |
- CPU识别出某个中断源时, 由硬件直接给出一个与该中断源相对应的矢量地址, 从而转入各自中断服务程序。
因为矢量地址之间的空间非常有限,不能实现复杂操作。所以在这些矢量地址通常放置一条跳转指令,以将CPU重定向到你实际的、更完整的中断服务程序,
5.3 中断的控制
中断标志位TCON/SCON

- INT0, INT1, T0及T1的中断标志存放在TCON (定时器/计数器控制) 寄存器中;
- 串行口的中断标志存放在SCON (串行口控制) 寄存器中。
定时控制寄存器 TCON (地址88H, 位地址8FH~88H):
虽然名称是TCON,但是实际上包含了外部中断控制和定时器中断控制两部分的功能
位地址 | 8FH | 8EH | 8DH | 8CH | 8BH | 8AH | 89H | 88H |
位符号 | TF1 | TR1 | TF0 | TR0 | IE1 | IT1 | IE0 | IT0 |
- TF1 (TCON.7): 定时器1溢出标志。
- 溢出意味着定时器完成了定时任务,产生了中断请求
- 当CPU响应了T1的中断请求,硬件会自动将TF1清零,撤销中断请求
- TF0 (TCON.5): 定时器0溢出标志。与TF1类似,但用于定时器0。
- TR1 (TCON.6): 定时器1运行控制位。1为启动定时器1计数,0为停止。软件可以通过设置此位来控制定时器的启动和停止,达到精确控制定时功能的目的。复位后TR1=0。
- TR0 (TCON.4): 定时器0运行控制位。与TR1功能相同,但控制定时器0。
- IE1 (TCON.3): 外部中断1标志位。当外部中断1事件发生时由硬件置位。
- IE0 (TCON.1): 外部中断0标志位。与IE1类似,但用于外部中断0。
- IT1 (TCON.2): 外部中断1的触发方式控制位。如果为0,则为电平触发(低电平有效)。如果为1,则为边沿触发(下降沿有效)。
- IT0 (TCON.0): 外部中断0的触发方式控制位。逻辑与IT1相同。
串行口控制寄存器 SCON (地址98H, 位地址9F~98H):
位地址 | 9FH | 9EH | 9DH | 9CH | 9BH | 9AH | 99H | 98H |
位符号 | SM0 | SM1 | SM2 | REN | TB8 | RB8 | TI | RI |
- TI (Transmit Interrupt): 串行口发送中断请求标志位。
- RI (Receive Interrupt): 串行口接收中断请求标志位。
- 中断响应后用软件对TI、RI标志清0。
中断允许和禁止IE(Interrupt Enable)❗
中断允许控制寄存器 IE (地址A8H, 位地址AFH~A8H):
位地址 | AF | AE | AD | AC | AB | AA | A9 | A8 |
位符号 | EA | / | / | ES | ET1 | EX1 | ET0 | EX0 |
- EA (Enable All): 中断允许总控制位。1为中断总允许, 0为中断总禁止。
- EX0、EX1: 外部中断0、1允许控制位。
- ET0、ET1: 定时/计数器0、1中断允许控制位。
- ES: 串行中断允许控制位。
- 0为禁止对应的中断, 1为允许对应的中断。
- CPU复位后, IE=00H, 即禁止所有中断。
区分ET0,ET1/TR0,TR1:
特性 | TR0 / TR1 | ET0 / ET1 |
寄存器 | TCON (定时器控制寄存器) | IE (中断允许寄存器) |
控制目标 | 定时器/计数器本身的运行/停止 | 定时器溢出事件是否产生中断请求 |
核心作用 | 启动或停止计数过程 | 允许或禁止中断 |
与中断的关系 | 间接相关 (定时器运行并溢出是产生中断的前提) | 直接相关 (决定了溢出后是否能触发中断) |
独立性 | 定时器可以运行 (TRx=1) 但不产生中断 (ETx=0) | 定时器中断能否发生,不仅取决于ETx,还取决于总中断EA位 |
中断优先级 (Interrupt Priority)❗
80C51有高、低两个中断优先级, 通过中断优先级寄存器IP来设定。
中断优先级控制寄存器 IP (地址B8H, 位地址BF~B8H):
位地址 | BF | BE | BD | BC | BB | BA | B9 | B8 |
位符号 | / | / | / | PS | PT1 | PX1 | PT0 | PX0 |
- PX0、PX1: 外部中断0、1优先级设定位。
- PT0、PT1: 定时器0、1中断优先级设定位。
- PS: 串行中断优先级设定位。
- 0为优先级低, 1为优先级高
中断优先级控制原则和控制逻辑❗
- 低优先级中断请求不能打断高优先级的中断服务。高优先级中断请求可以打断低优先级的中断服务。
- 在中断服务程序运行中, 不响应同级的其它中断请求
- 在主程序运行中, 同级的多个中断请求同时出现时, 响应次序为:
外中断0 -> 定时中断0 -> 外中断1 -> 定时中断1 -> 串行口中断。
外部中断触发方式: 2种
- 电平触发方式IT1、 IT0=0:
低电平有效。由TCON寄存器的IT1 (TCON.2) 及IT0 (TCON.0) 控制。低电平有效信号, 应一直保持到CPU响应中断为止。
- 跳变触发方式 IT1、 IT0=1:
电平发生由高到低的跳变 (负跳变) 时触发。信号高、低电平应至少各保持一个机器周期。
中断请求的撤除❗
中断请求被响应后, 转向中断服务程序执行, 在其执行中断返回指令 (RETI) 之前, 中断请求信号必须撤除, 否则将会再一次引起中断而出错。
- 单片微机内部硬件自动复位:
- 定时器/计数器T0、T1中断 (TF0, TF1标志)。
- 采用脉冲触发方式的外部中断请求 (IE0, IE1标志)。
- 用软件指令清除相应标志:
- 串行中断RI、TI❗
- 80C52的TF2, EXF2 (T2CON寄存器)。
- 用软件、硬件结合清除相应标志:
- 采用电平触发方式的外部中断请求。尽管中断标志 (IE0, IE1) 的撤消是硬件自动的, 但中断请求信号的低电平可能继续存在, 在以后机器周期采样时又会把已清“0”的IE0、IE1标志重新置“1”, 再次申请中断。为保证在CPU响应中断后、执行返回指令前, 撤除中断请求, 必须保证在中断响应后把中断请求信号从低电平强制改变为高电平。
- 硬件置位, 硬、软件结合清除的例子: (参考课件图示和代码)
- 使用D触发器和P1口控制外部中断请求信号的撤销。

5.4 中断响应过程和响应时间
中断响应过程:
中断采样:
- 针对外部中断信号需要中断采样;
- 针对内部中断源, 直接置位TCON或SCON中的中断请求标志。
- 每个机器周期的S5P2 (第五状态的第二节拍) 期间, 各中断标志采样相应的中断源, 并置入相应标志。

中断查询:
- CPU在每个机器周期的S6状态按优先级的顺序依次查询中断标志位。查询到标志位为1, 则在下一个机器周期的S1状态响应中断。
- 当一个指令需要多个机器周期去完成,即使查询到了中断请求,单片机也会先完成当前指令然后进入中断

中断响应:
- 中断响应的过程:
- 硬件自动生成
LCALL addr16
指令。 - 将PC (程序计数器) 值压栈, 将中断矢量地址 (addr16) 装入PC。
- 中断不立即响应的情况:
- CPU正处在同级或高一级的中断服务中。
- 查询中断请求的机器周期不是当前指令的最后一个机器周期 (确保指令完整执行)。
- 例如:
MUL AB
- 当前执行的是RETI或访问IE、IP的指令。
中断的执行过程与子程序调用的比较:
- 相似点:
- 都是中断当前正在执行的程序, 转去执行子程序或中断服务程序。
- 都是由硬件自动地把断点地址压入堆栈, 然后通过软件完成现场保护。
- 执行完子程序或中断服务程序后, 都要通过软件完成现场恢复, 并通过执行返回指令, 重新返回到断点处, 继续往下执行程序。
- 二者都可以实现嵌套, 如中断嵌套和子程序嵌套。
- 差别:
- 中断请求信号可以由外部设备发出, 是随机的 (如故障、按键); 子程序调用是由软件编排好的。
- 中断响应后由固定的矢量地址转入中断服务程序; 子程序地址由软件设定。
- 中断响应是受控的, 其响应时间会受一些因素影响; 子程序响应时间是固定的。
- 中断响应自动屏蔽该级别的中断允许, 返回必须用RETI, 否则再也不能进入该级别或者更低级别的中断。
虽然在矢量地址处一般还会有一个长跳转调用子程序
它会解除单片机对该级别或更低级别中断的自动屏蔽
中断响应时间❗
中断响应时间指的是从中断源发出中断请求,到CPU开始执行中断服务程序的第一条指令所需要的全部时间。
这个时间不是一个固定值,它有一个最短时间和最长时间,具体耗时取决于CPU在收到中断请求时“正在忙什么”。
事件 | 时间 | 说明 |
中断请求标志位查询 | 1个机器周期 | CPU在每个机器周期末尾检查中断标志,这是响应的起点。 |
执行LCALL指令 | 2个机器周期 | 硬件自动执行,用于保护断点并跳转到中断服务程序。 |
中断响应最短时间 | 3个机器周期 | ㅤ |
CPU执行RETI或访问IP、IE指令 | 额外2个机器周期 | 为确保中断系统稳定,执行完这类指令后还要再执行一条普通指令才能响应中断。 |
CPU执行乘法或除法指令 | 额外4个机器周期 | 这是8051最长的指令,CPU必须等它执行完才能响应中断。 |
中断响应最长时间 | 8个机器周期 | (RETI+DIV/MUL+LCALL)(中断请求标志位查询RETI时一并完成了) |
5.5 外部中断源的扩展
通过OC门线或实现 (逻辑或):
- 多个中断源通过OC门 (或反相器加与门) 连接到一个外部中断输入引脚 (如INT0)。

- 外部中断采用电平触发方式。
- 在中断服务程序中通过软件查询P1口等IO口的状态来确定具体的请求源。
- 外部中断源查询流程图示例: (参考课件图示)
- 进入中断后, 依次判断P1.0, P1.1, P1.2...等引脚的状态, 跳转到对应的中断服务处理。

通过片内定时器/计数器来实现:
- 使用定时器/计数器方式2 (8位自动重装载)。
- 计数初值为FFH。
- 外部中断请求信号接计数输入端T0或T1。当外部信号使计数器溢出时产生定时器中断。
- 中断服务程序的地址按定时器中断入口地址存放。
- (具体细节将在第六章后讨论)
5.7 中断服务程序的设计❗
中断程序
中断程序一般包含两部分:
- 中断控制程序 (中断初始化程序): 一般不独立编写, 而是包含在主程序中, 根据上述5点通过编写几条指令来实现。
- 中断服务程序 (Interrupt Service Routine, ISR)
中断初始化程序
中断初始化需要设置的内容 (5点):
- 中断服务程序入口地址的设定 (通常通过中断矢量表中的跳转指令)。
- 某一中断源中断请求的允许与禁止 (设置IE寄存器)。
- 对于外部中断请求, 还需进行触发方式的设定 (设置TCON寄存器中的ITx位)。
- 对于定时器中断,还要启动定时器运行(设置TCON寄存器中的TR0,TR10
- 各中断源优先级别的设定 (设置IP寄存器)。
- CPU开中断与关中断 (设置IE寄存器中的EA位)。
示例: 初始化程序段
- 要求: 设置外部中断INT0和串行接口中断为高优先级, 外部中断INT1为低优先级。屏蔽T0和T1中断请求。
- 编程思路:
- IP寄存器: 第0位 (PX0) 和第4位 (PS) 置1, 其余位为0。
MOV IP, #00010001B
- IE寄存器: 第0位 (EX0), 第2位 (EX1), 第4位 (ES), 第7位 (EA) 置1, 其余位为0 (ET0, ET1应为0以屏蔽T0, T1)。
MOV IE, #10010101B
(允许INT0, INT1, 串行口中断, 开CPU总中断)
- 程序结构: (注: 课件中IE寄存器设置 #10010101B 对应 EA=1, ES=1, EX1=1, EX0=1, 屏蔽了ET1和ET0, 符合题目要求)
代码段
中断服务程序 (ISR)
- 是一种为中断源的特定事态要求服务的独立程序段, 以中断返回指令RETI结束。
- 中断矢量地址 (0003H, 000BH, 0013H, 001BH, 0023H, 002BH) 通常存放一条无条件转移指令, 跳转到程序存储器其它部位的实际中断服务程序。
- 随机性: 中断响应具有随机性。
保护断点和现场、恢复断点和现场❗
- 断点的保护 (PC值入栈) 主要由硬件电路自动实现。
- 现场数据的保护 (如ACC, PSW, 使用的寄存器等) 需要指令完成 (PUSH指令), 位于中断服务程序的前面。
- 结束中断服务程序返回断点处之前要恢复现场 (POP指令)。
- 示例: 现场保护与恢复
代码段
本章小结
- 掌握80C51的5个中断源及其对应的中断矢量。
- 掌握中断相关的初始化及特殊功能寄存器 (SFR) 的设定 (IE, IP, TCON, SCON)。
- 理解中断响应的过程。
- 掌握编写中断服务程序的技能 (包括现场保护与恢复, RETI指令的使用)。