中断介绍
中断概念
中断是为使单片机具有对外部或内部随机发生的事件实时处理而设置的,中断功能的存在,很大程度上提高了单片机处理外部或内部事件的能力。
先来举一个生活事例:*你打开火,烧上一壶水。然后去洗衣服,在洗衣服的过程中,突然听到水壶发出水开的报警声,这时,你停止洗衣服动作,立即去关掉火,然后将开水灌入暖水瓶中,灌完开水后,你又回去继续洗衣服。*这个过程中实际上就发生了一次中断。
对于单片机来讲,中断是指 CPU 在处理某一事件 A 时,发生了另一事件 B,请求 CPU 迅速去处理(中断发生);CPU 暂时停止当前的工作(中断响应),转去处理事件 B(中断服务);待CPU 将事件 B 处理完毕后,再回到原来事件 A 被中断的地方继续处理事件 A(中断返回),这一过程称为中断。
单片机在执行程序时其程序流程图如下:
引起 CPU 中断的根源称为中断源。中断源向 CPU 提出中断请求,CPU 暂时中断原来的事务A,转去处理事件B,对事件B处理完毕后,再回到原来被中断的地方(即断点),称为中断返回。实现上述中断功能的部件称为中断系统(中断机构)。
当中央处理机 CPU 正在处理某件事的时候外界发生了紧急事件请求,要求CPU 暂停当前的工作,转而去处理这个紧急事件,处理完以后,再回到原来被中断的地方,继续原来的工作,这样的过程称为中断。实现这种功能的部件称为中断系统,请示 CPU 中断的请求源称为中断源。微型机的中断系统一般允许多个中断源,当几个中断源同时向 CPU 请求中断,要求为它服务的时候,这就存在CPU 优先响应哪一个中断源请求的问题。通常根据中断源的轻重缓急排队,优先处理最紧急事件的中断请求源,即规定每一个中断源有一个优先级别。CPU总是先响应优先级别最高的中断请求。
当 CPU 正在处理一个中断源请求的时候(执行相应的中断服务程序),发生了另外一个优先级比它还高的中断源请求。如果 CPU 能够暂停对原来中断源的服务程序,转而去处理优先级更高的中断请求源,处理完以后,再回到原低级中断服务程序,这样的过程称为中断嵌套。这样的中断系统称为多级中断系统,没有中断嵌套功能的中断系统称为单级中断系统。
中断系统优点:
- 分时操作。CPU可以分时为多个I/O设备服务,提高了计算机的利用率;
- 实时响应。CPU能够及时处理应用系统的随机事件,系统的实时性大大增强;
- 可靠性高。CPU具有处理设备故障及掉电等突发性事件能力,从而使系统可靠性提高。
中断结构及相关寄存器
中断结构
STC89C5X 系列单片机提供了 8 个中断请求源,它们分别是:外部中断O(INTO)
、外部中断1(INT1)
、外部中断 2(INT2)
、外部中断 3(INT3)
、定时器 0中断
、定时器1中断
、定时器2中断
、串口(UART)中断
。(注意:51 系列单片机一定有基本的 5 个中断,但不全有 8 个中断,需要查看芯片手册,通常我们使用的都是基本的5个中断:INT0、INT1、定时器0/1,串口中断)。所有的中断都具有四个中断优先级(基本型只有两个)。用户可以用关总中断允许位(EA/IE.7
)或相应中断的允许位来屏蔽所有的中断请求,也可以用打开相应的中断允许位来使 CPU 响应相应的中断申请。其中有些中断源可以用软件独立地控制为开中断或关中断状态。每一个中断的优先级别均可用软件设置。高优先级的中断请求可以打断低优先级的中断,反之,低优先级的中断请求不可以打断高优先级及同优先级的中断。当两个相同优先级的中断同时产生时,将由查询次序来决定系统先响应哪个中断。STC89C5X系列单片机的各个中断查询次序表如下图所示:
通过设置新增加的特殊功能寄存器 IPH 中的相应位,可将中断优先级设为四级,如果只设置 IP 或 XICON,那么中断优先级就只有两级,与传统 8051 单片机两级中断优先级完全兼容。上图中的中断查询次序即为中断号,这个中断号在编程时非常重要,当中断来临时,只有中断号正确才能进入中断。
下面我们以51单片机均有的5个中断来介绍,其内部结构框图如下所示:
- INT0 对应的是P3.2口的附加功能,可由
IT0(TCON.0)
选择其为低电平有效还是下降沿有效。当CPU检测到P3.2引脚上出现有效的中断信号时,中断标志IE0(TCON.1)
置 1,向CPU申请中断。 - INT1 对应的是P3.3口的附加功能,可由
IT1(TCON.2)
选择其为低电平有效还是下降沿有效。当CPU检测到P3.3引脚上出现有效的中断信号时,中断标志IE1(TCON.3)
置 1,向 CPU 申请中断。 - T0对应的是P3.4口的附加功能,
TF0(TCON.5)
,片内定时/计数器T0溢出中断请求标志。当定时/计数器T0发生溢出时,置位TF0,并向CPU申请中断。 - T1 对应的是P3.5口的附加功能,
TF1(TCON.7)
,片内定时/计数器T1溢出中断请求标志。当定时/计数器T1发生溢出时,置位TF1,并向CPU申请中断。 - RXD 和 TXD 对应的是P3.0 和 P3.1 口的附加功能,
RI(SCON.0)
或TI(SCON.1)
,串行口中断请求标志。当串行口接收完一帧串行数据时置位RI或当串行口发送完一帧串行数据时置位TI,向CPU申请中断。
中断相关寄存器
中断允许控制
CPU 对中断系统所有中断以及某个中断源的开放和屏蔽是由中断允许寄存器IE
控制的。
位 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
---|---|---|---|---|---|---|---|---|---|
字节地址:A8H | EA | ES | ET1 | EX1 | ET0 | EX0 | IE |
- EX0(IE.0) :外部中断0允许位
- ET0(IE.1) : 定时/计数器T0中断允许位
- EX1(IE.2) : 外部中断0允许位
- ET1(IE.3) : 定时/计数器T1中断允许位
- ES(IE.4) : 串行口中断允许位
- EA(IE.7) : CPU中断允许(总允许)位
中断请求标志TCON
位 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
---|---|---|---|---|---|---|---|---|---|
字节地址:88H | TF1 | TR1 | TF0 | TR0 | IE1 | IT1 | IE0 | IT0 | TCON |
- IT0(TCON.0) : 外部中断0触发方式控制位
- 当
IT0 = 0
,为电平触发方式 - 当
IT0 = 1
,为边沿触发方式(下降沿有效)
- 当
- IE0(TCON.1) : 外部中断0中断请求标志位
- IT1(TCON.2) : 外部中断1触发方式控制位
- IE1(TCON.3) : 外部中断1中断请求标志位
- TF0(TCON.5) : 定时/计数器T0溢出中断请求标志位
- TF1(TCON.7) : 定时/计数器T1溢出中断请求标志位
中断优先级
同一优先级中的中断申请不止一个时,则有中断优先权排队问题。同一优先级的中断优先权排队,由中断系统硬件确定的自然优先级行程,其排列如下表所示:
中断源 | 中断标志 | 中断服务程序入口 | 优先级顺序 |
---|---|---|---|
外部中断0 () | IE0 | 0003H | 高 |
定时/计数器0 (T0) | IF0 | 000BH | ⬇ |
外部中断1 () | IE1 | 0013H | ⬇ |
定时/计数器1(T1) | TF1 | 001BH | ⬇ |
串行口 | RI或TI | 0023H | 低 |
中断号
中断源符号 | 名称 | 中断引起原因 | 中断号 |
---|---|---|---|
/INT0 | 外部中断0 | P3.2引脚低电平或下降沿信号 | 0 |
T0 | 定时器0中断 | 定时/计数器0计数回0溢出 | 1 |
/INT1 | 外部中断1 | P3.3引脚低电平或下降沿信号 | 2 |
T1 | 定时器1中断 | 定时/计数器1计数回0溢出 | 3 |
TI/RI | 串行口中断 | 串行通信完成一帧数据发送或接收引起中断 | 4 |
中断响应条件
- 中断源有中断请求
- 此中断源的中断允许位为1
- CPU开中断(即
EA=1
)
以上三条同时满足时,CPU才有可能响应中断。在使用中断时我们需要做什么呢?()
- 你想使用的中断时哪个?选择相应的中断号;
- 你所希望的触发条件时什么?
- 你希望在中断之后干什么?
以下以外部中断0为例
- 主程序
1
2
3EA = 1; // 打开总中断开关
EX0 = 1; // 开外部中断0
IT0 = 0/1; // 设置外部中断的触发方式 - 中断服务函数
1
2
3
4void int0() interrupt 0
{
// 中断处理
}
在中断函数中int0是函数名,可自定义,但必须符合C语言标识符定义规则,interrupt
是一个关键字,表示51单片机中断。后面的“0”是中断号,外部中断0中断号为0,这个可参考前面的内容。