【51单片机系列】C51中的中断系统
本文主要是关于C51中的中断系统的相关介绍。
1. 中断概念
中断是为使单片机具有对外部或内部随机发生的事件实时处理而设置的。中断功能的存在,很大程度上提高了单片机处理外部或内部事件的能力,中断是单片机最重要的功能之一。
中断在生活中的一个事例:你打开火,烧一壶水;然后去洗衣服,在洗衣服的过程中,突然听到水壶发出水开的报警声,这是,你停止洗衣服动作,立即去关火,然后将开水灌入开水壶中,灌完开水后,又回去继续洗衣服。这个过程中就发生了一次中断。
对单片机来讲,中断是指CPU在处理某一事件A时,发生了另一事件B,请求CPU迅速去处理(中断发生);CPU暂时停止当前的工作(中断响应),转去处理时间B(中断服务);待CPU将事件B处理完毕后,再回到原来事件A被中断的地方继续处理时间A(中断返回),这一个过程称为中断。
如下图是展示了生活中的中断实例以及单片机处理中断的过程示意图。
将生活事例与单片机中断结合分析,主任务是洗衣服,水开报警是一个中断请求,这一时刻相当于断点处,响应中断去关火,然后将开水灌入暖水瓶中,这一动作实际上是处理中断程序,灌完开水后再回去继续洗衣服,相当于处理完中断程序后再返回主程序继续执行主程序。
需要注意的是,水开是随时都有可能的,但是无论什么时候开,只要一开将立即去处理它,处理完后再回来继续接着洗刚才那件衣服。单片机在执行程序时,中断也是随时可能发生,但无论何时发生,只要一旦发生,单片机将立即暂停当前程序,赶去处理中断程序,处理完中断程序后再返回刚才暂停处接着执行原来的程序。
引起CPU中断的根源称为中断源。中断源向CPU提出中断请求,CPU暂时中断原来的事务A,转去处理事件B,对事件B处理完毕后,再回到原来被中断的地方(即断点),称为中断返回。实现上述中断功能的部件称为中断系统(中断机构)。
当中央处理机CPU正在处理某件事时外界发生了紧急事件请求,要求CPU暂停当前的工作,转而去处理这个紧急事件,处理完以后,再回到原来被中断的地方,继续原来的工作,这样的过程称为中断。实现这种功能的部件称为中断系统,请示CPU中断的请求源称为中断源。
微型机的中断系统一般允许多个中断源,当几个中断源同时向CPU请求中断,要求为它服务的时候,就存在CPU优先响应哪一个中断源请求的问题。通常根据中断源的轻重缓急排队,优先处理最紧急事件的中断请求源,即规定每一个中断源有一个优先级别。CPU总是先响应优先级别最高的中断请求。
当CPU正在处理一个中断源请求的时候,发生了另外一个优先级比它还高的中断源请求。如果CPU能够暂停对原来中断源的服务程序,转而去处理优先级更高的中断请求源,处理完以后,再回到原低优先级中断服务程序,这样的过程称为中断嵌套。这样的中断系统称为多级中断系统,没有中断嵌套功能的中断系统称为单级中断系统。
中断的开启与关闭、设置启用哪一个中断等都是由单片机内部的一些特殊功能寄存器来决定的。
终端技术不仅解决了快速主机与慢速I/O设备的数据传送问题,而且还具有如下优点:
- 分时操作。CPU可以分时为多个I/O设备服务,提高了计算机的利用率;
- 实时响应。CPU能够及时处理应用系统的随机事件,系统的实时性大大增强。
- 可靠性高。CPU具有处理设备故障及掉电等突发性事件能力,从而使系统可靠性提高。
2. 中断结构及相关寄存器
89C51系列单片机提供了8个中断请求源,它们分别是:外部中断0(INT0)、外部中断1(INT1)、外部中断2(INT2)、外部中断3(INT3)、定时器0(T0)中断、定时器1(T1)中断、定时器2中断、串口(UART)中断。
需要注意,51单片机一定有基本的5个中断,但不全有8个中断,需要查看芯片手册,通常我们使用的都是基本的5个中断:INT0、INT1、定时器0/1、串口中断。
所有的中断都具有四个中断优先级(基本型只有两个)。
用户可以用关总中断允许位(EA/IE.7)或相应中断的允许位来屏蔽所有的中断请求,也可以用打开相应的中断允许位来使CPU响应相应的中断请求。
其中有些中断源可以用软件独立地控制位开中断或关中断状态。
每一个中断的优先级别均可用软件设置。高优先级的中断请求可以打断低优先级的中断,反之,低优先级的中断请求不可以打断高优先级及同优先级的中断。
当两个相同优先级的中断同时产生时,将由查询次序来决定系统先响应哪个中断。
STC89C5X系列单片机的各个中断查询次序表如下图所示:
中断源 | 中断向量地址 | 相同优先级内的查询次序 | 中断优先级设置IPH.IP | 优先级0(最低) | 优先级1 | 优先级2 | 优先级3(最高) | 中断请求标志位 | 中断允许控制位 |
---|---|---|---|---|---|---|---|---|---|
/INT0 外部中断0 |
0003H | 0 最高 |
PX0H,PX0 | 0,0 | 0,1 | 1,0 | 1,1 | IE0 | EX0/EA |
Timer0 定时器0 |
000BH | 1 | PT0H,PT0 | 0,0 | 0,1 | 1,0 | 1,1 | TF0 | ET0/EA |
/INT1 外部中断1 |
0013H | 2 | PX1H,PX1 | 0,0 | 0,1 | 1,0 | 1,1 | IE1 | EX1/EA |
Timer1 | 001BH | 3 | PT1H,PT1 | 0,0 | 0,1 | 1,0 | 1,1 | TF1 | ET1/EA |
UART | 0023H | 4 | PSH,PS | 0,0 | 0,1 | 1,0 | 1,1 | RI+TI | |
Timer2 | 002BH | 5 | PT2H,PT2 | 0,0 | 0,1 | 1,0 | 1,1 | TF2+EXF2 | (ET2)/EA |
/INT2 外部中断2 |
0033H | 6 | PX2H,PX2 | 0,0 | 0,1 | 1,0 | 1,1 | IE2 | EX2/EA |
/INT3 外部中断3 |
003BH | 7 | PX3H,PX3 | 0,0 | 0,1 | 1,0 | 1,1 | IE3 | EX3/EA |
通过设置新增加的特殊功能寄存器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申请中断。
(1). 中断允许控制寄存器IE
CPU对中断系统所有中断以及某个中断源的开放和屏蔽是由中断允许寄存器IE控制的。中断允许寄存器IE各个位如下所示:
位 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
---|---|---|---|---|---|---|---|---|---|
字节地址:A8H | EA | ES | ET1 | EX1 | ET0 | EX0 | IE |
位说明:
- EX0(IE.0),外部中断0(INT0)允许位;
- ET0(IE.1),定时/计数器T0中断允许位;
- EX1(IE.2),外部中断1(INT1)允许位;
- ET1(IE.3),定时/计数器T1中断允许位;
- ES(IE.4),串行口中断允许位;
- EA(IE.7),CPU中断允许(总允许)位;
(2). 中断请求标志寄存器TCON
中断请求标志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溢出中断请求标志位;
(3). 中断优先级
同一优先级中的中断申请不止一个时,就会出现中断优先权排队问题。同一优先级的中断优先权排队,由中断系统硬件确定的自然优先级形成,其排列如下所示:
各中断源响应优先级及中断服务程序入口表
中断源 | 中断标志 | 中断服务程序入口 | 优先级顺序 |
---|---|---|---|
外部中断0(/INT0) | IE0 | 0003H | 高 |
定时/计数器0(T0) | TF0 | 000BH | ↓ |
外部中断1(/INT1) | IE1 | 0013H | ↓ |
定时/计数器1(T1) | TF1 | 001BH | ↓ |
串行口 | RI或TI | 0023H | 低 |
(4). 中断号
中断源符号 | 名称 | 中断引起原因 | 中断号 |
---|---|---|---|
/INT0 | 外部中断0 | P3.2引脚低电平或下降沿 | 0 |
T0 | 定时/计数器0 | 定时/计数器0计数回0溢出 | 1 |
/INT1 | 外部中断1 | P3.3引脚低电平或下降沿 | 2 |
T1 | 定时/计数器1 | 定时/计数器1计数回0溢出 | 3 |
TI/RI | 串行口中断 | 串行通信完成一帧数据发送或接收引起中断 | 4 |
(5). 中断响应条件
当三个条件:①中断源有中断请求;②此中断源的中断允许位为;③CPU开中断(即EA=1);同时满足时,CPU才有可能响应中断。
在使用中断时,需要做:①想使用的是哪个中断,选择响应的中断号;②希望的触发条件是什么;③希望在中断之后做什么。
以外部中断0为例,如下所示:
首先主程序需要一下代码:
EA=1; // 总中断允许位置1,打开总中断开关
EX0=1; // 外部中断0允许位置1,打开INT0
IT0=0/1; // 外部中断0触发方式控制位,置为0或1,表示电平或边沿触发中断
然后中断服务函数:
void int0() interrupt 0 using 1
{
// 编写中断之后做什么的代码
}
其中int0
是函数名,可以自定义,需要符合C语言标识符定义规则;interrupt
是一个关键字,表示51单片机中断;后面的0
是中断号,外部中断0的中断号为0;后面的using 1
可省略不写。