前言:中断
是为使单片机具有对外部或内部随机发生的事件实时处理而设置的。单片机中断(Interrupt)是硬件驱动事件,它使得CPU暂停执行当前的主程序,转而去执行一个中断服务子程序。如果单片机没有中断系统,单片机的大量时间可能会浪费在是否有服务请求发生的定时查询操作上。采用中断技术完全消除了单片机在查询方式 中的等待现象,大大地提高了单片机的工作效率和实时性。
目录:
1.1 什么是中断?
❄️ 当中央处理器CPU正在执行主程序的时候外界发生了紧急事件请求,要求CPU暂停当前的工作,转而去处理这个紧急事件,处理完以后,再回到原来被中断的地方继续原来的工作,这样的过程称为中断
。
❄️ 对于单片机来讲,中断是指 CPU 在处理某一事件 A 时,发生了另一事件 B, 请求 CPU 迅速去处理(中断发生);CPU 暂时停止当前的工作(中断响应), 转去 处理事件 B(中断服务);待 CPU 将事件 B 处理完毕后,再回到原来事件 A 被 中断的地方继续处理事件 A(中断返回),这一过程称为中断。
❄️ 为了能让大家更容易理解中断概念, 我们先来举一个生活事例: 你打开火, 烧上一壶水。然后去洗衣服,在洗衣服的过程中,突然听到水壶发出水开的报警 声,这时,你停止洗衣服动作,立即去关掉火,然后将开水灌入暖水瓶中,灌完 开水后,你又回去继续洗衣服。这个过程中实际上就发生了一次中断。
1.2 什么是中断系统?
单片机在执行程序时其程序流程图如下:
如上图,当外部发生中断事件(中断源
)请求CPU处理,CPU暂停运行当前运行程序A,转而去运行该处理该事件的中断服务程序B,对该事件处理完毕后,再回到原来被中断的地方(断点
)继续运行原来的程序A。实现上述中断功能的部件称为中断系统。
1.2.1 有哪些中断源会引起单片机的中断请求?
STC89C5X系列单片机提供了至少5 个中断请求源,它们分别是:外部中断 0( INT0 ‾ \overline{\text{INT0}} INT0)、外部中断 1( INT1 ‾ \overline{\text{INT1}} INT1)、定时/计数器0(T0) 、定时/计数器 1(T1) 、定时器 2 中断、串口(UART)中断。
1.2.2 上述中断源怎样触发中断请求?【重要】
回顾GPIO口P3引脚,P3的每一个引脚除了作为基本输入输出引脚,还会有第二功能。可以看到P3.2和P3.3可作为中断的事件源,它们的某些状态会导致中断请求的发生。
中断源符号 | 名称 | 中断引起原因 | 中断号 | 中断向量地址 |
---|---|---|---|---|
INT0 ‾ \overline{\text{INT0}} INT0 | 外部中断0 | P3.2引脚低电平或下降沿信号 | 0 | 0003H |
INT1 ‾ \overline{\text{INT1}} INT1 | 外部中断1 | P3.3引脚低电平或下降沿信号 | 2 | 0013H |
T0 | 定时器0中断 | 定时/计数器0计数回0溢出 | 1 | 000B |
T1 | 定时器1中断 | 定时/计数器1计数回0溢出 | 3 | 001B |
T1/R1 | 串行口中断 | 串行通信完成一帧数据发送或接收引起中断 | 4 | 0023H |
开中断情况下(特殊寄存器某位为1),当P3.2所连接的物理器件状态发生变化,导致读取到P3.2引脚为低电平(例如按键)或下降沿信号,则向CPU发送中断号为0的中断请求,若CPU响应该中断,则跳转地址0x0003(或许有不同,详细地址参看单片机参考手册)处执行其中断服务函数。其他中断请求可按照上表自行推断。
1.2.3 用户怎样控制中断系统
中断功能是否开启、设置启用哪个中断、中断的触发方式、当多个中断请求发生,CPU响应中断的顺序都是由单片机内部的一些特殊功能寄存器来决定的。用户通过对相应寄存器位进行设置,就能操作中断系统。
单片机特殊寄存器数据如下(后文会有详细操作,此处只例举常用的两个寄存器):
中断允许控制寄存器IE
CPU 对中断系统所有中断以及某个中断源的开放和屏蔽是由 中断允许寄存器 IE
控制的,IE寄存器中具体位代表功能如下:
位 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
---|---|---|---|---|---|---|---|---|---|
字节地址:A8H | EA | - | ET2 | ES | ET1 | EX1 | ET0 | EX0 | IE |
EX0(IE.0)
,外部中断 0 允许位。EX0=1,允许中断;EX0=0,禁止中断;
ET0(IE.1)
,定时/计数器 T0 中断允许位;ET0=1,允许T0中断;ET0=0,禁止T0中断;
EX1(IE.2)
,外部中断 0 允许位;EX1=1,允许外部中断1中断;EX1=0,禁止外部中断1中断;
ET1(IE.3)
,定时/计数器 T1 中断允许位;ET1=1,允许T1中断;ET1=0,禁止T1中断;
ES(IE.4)
,串行口中断允许位;ES=1,允许串行口1中断;ES=0,禁止串行口1中断;
ET2(IE.5)
,定时/计数器T2的溢出中断允许位;ET2=1,允许T2中断;ET2=0,禁止T2中断;
EA (IE.7)
, CPU 中断允许(总允许)位;EA=1,CPU开放中断,EA=0,CPU屏蔽所有的中断申请。EA的作用是使中断允许形成两级控制。即各中断源首先受EA控制,其次还受各中断源自己的中断允许控制位控制。
中断请求控制寄存器TCON
TCON为定时器/计数器T0、T1的控制寄存器,同时也锁存T0、T1溢出中断源和外部请求中断源等。
位 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
---|---|---|---|---|---|---|---|---|---|
字节地址:88H | TF1 | TR1 | TF0 | TR0 | IE1 | IT1 | IE0 | IT0 | TCON |
IT0(TCON.0)
,外部中断 0 触发方式控制位。IT0=0, INT0 ‾ \overline{\text{INT0}} INT0/P3.2引脚上的低电平可触发外部中断0.IT0=1,外部中断0为下降沿触发方式。
IE0(TCON.1)
,外部中断 0 中断请求标志位( INT0 ‾ \overline{\text{INT0}} INT0/P3.2)。IE0=1外部中断0向CPU请求中断,当CPU响应外部中断时,由硬件清零IE0(边沿触发方式)。
IT1(TCON.2)
,外部中断 1 触发方式控制位。IT1=0, INT1 ‾ \overline{\text{INT1}} INT1 /P3.3引脚上的低电平信号可触发外部中断1.IT1=1,外部中断1为下降沿触发方式。
IE1(TCON.3)
,外部中断 1 中断请求标志位。 ( INT1 ‾ \overline{\text{INT1}} INT1/P3.3).IE1=1,外部中断向CPU请求中断,当CPU响应该中断时硬件清零IE1。
TR0(TCON.4)
, 定时器0的运行控制位。
TF0(TCON.5)
,定时/计数器 T0 溢出中断请求标志位。 T0被允许计数以后,从初值开始加1计数。当产生溢出时,由硬件置"1"TF0,向CPU请求中断,一直保持CPU响应该中断时,才由硬件清零。
TR1(TCON.6)
,定时器1的运行控制位
TF1(TCON.7)
,定时/计数器 T1 溢出中断请求标志位。T1被允许计数以后,从初值开始加1计数。当产生溢出时由硬件置"1"TF1,向CPU请求中断,一直保持到CPU响应中断时,才由硬件清"0".
CPU响应中断的三个条件为:
⛅️ 中断源有中断请求
⛅️ 此中断的中断允许位为1
⛅️ CPU开中断(即EA = 1)
当满足以上三个条件,中断系统将会运行,做出中断处理操作
;
;
;