微控制器(单片机)的中断系统及应用
文章目录
1. 什么是中断
1.1 中断的概念
中断是指中央处理器CPU正在处理某件事情的时候,外部发生了某一事件(如定时器计时已到),请求CPU迅速去处理,CPU暂停当前的工作,转去处理所发生的事件,处理完以后,再回到原来被中断的地方,继续原来的工作。实现这种功能的部件称为中断系统。它由4个与中断有关的特殊功能寄存器(TCON、SCON),中断允许控制寄存器IE和中断顺序查询逻辑等组成。
1.2 中断源
我们将发起中断申请的设备,称为中断源。
1.2.1 中断源的种类
根据中断源的不同,可分为2个外部中断源,3个内部中断源:
- /INT0:外部中断0,中断请求信号由P3.2端口线引入,低电平或下跳沿引起。
- /INT1:外部中断1,中断请求信号由P3.3端口线引入,低电平或下跳沿引起。
- T0:定时/计数器0溢出中断,对外部脉冲计数由P3.4输入,由T0计满回零引起。
- T1:定时/计数器1溢出中断,对外部脉冲计数由P3.5输入,由T1计满回零引起。
- 串行中断:包括串行接收中断RI和串行发送中断TI。
2. 中断寄存器
单片机中主要包含四类特殊的寄存器对中断进行控制:
- TCON:定时/计数器控制寄存器
- SCON:串行口控制寄存器
- IE:中断允许寄存器
- IP:中断优先级寄存器
2.1 TCON寄存器
每个中断源对应一个中断标志位,当某个中断源有中断请求时,相应的中断标志位置1,各中断源的中断标志位在TCON和SCON中,具体如下表所示:
说明:
- 标志位IE0=1时,表示外部中断/INT0提出了中断请求,如果IE0=0,则没有中断请求;
- 标志位IE1=1时,表示外部中断/INT1提出了中断请求;
- 标志位TF0=1时,表示定时器/计数器T0提出了中断请求;
- 标志位TF1=1时,表示定时器/计数器T1提出了中断请求。
- IT0:外部中断0触发方式控制位。
- 当IT0=0时,为电平触发方式(低电平有效);
- 当IT0=1时,为边沿触发方式(下降沿有效)。
- IT1(TCON.2):外部中断1触发方式控制位,其作用和IT0类似。
- TR0(TCON.4):定时/计数器T0运行控制位。
当TR0=1,启动定时/计数器T0;反之,停止定时/计数器T0。 - TR1(TCON.6):定时/计数器T1运行控制位,其作用和TR0相同。
2.2 SCON寄存器
这里补充一下串口通信的四种模式,方便后面理解各个标志位的作用:
说明:
- TI:串行口发送中断标志位,当CPU将一个发送数据写入串行口发送缓冲器时,就启动了发送过程。每发送完一个串行帧,由硬件置位TI,即TI=1。 CPU响应中断时,不能自动清除TI,TI必须由软件清除。
- RI:串行口接收中断标志位。当允许串行口接收数据时,每接收完一个串行帧,由硬件置位RI,即RI=1,RI也必须由软件清除。
- SM0、SM1:串口工作方式选择位,用于控制串口通信模式。
- SM2:多机通信控制位,主要用于方式2和方式3。
- REN:允许串行接收位。由软件置REN=1,则启动串行口接收数据;若置REN=0,则禁止接收。
- TB8:在方式2或方式3中,是发送数据的第九位,可以用软件规定其作用,例如:作为数据的奇偶校验位,或在多机通信中,作为地址帧/数据帧的标志位。在方式0和方式1中,该位未用。
- RB8:在方式2或方式3中,是接收到数据的第九位,作为奇偶校验位或地址帧/数据帧的标志位。在方式1时,若SM2=0,则RB8是接收到的停止位。
2.3 IE寄存器
中断系统中所有中断以及某个中断源的开放和屏蔽是由中断允许寄存器IE控制的,IE可进行位寻址。中断允许寄存器IE对中断的开放和关闭实现两级控制。(PS:两级控制是指有一个总的开关中断控制位EA。当EA=0时,所有的中断请求被屏蔽,CPU对任何中断请求都不接受;当EA=1时,CPU开放中断,但5个中断源的中断请求是否允许,还要由IE中的低5位所对应的5个中断请求允许控制位的状态来决定。)
说明:
- EA:CPU中断允许(总允许)位。EA0=0,所有中断关闭,EA=1,CPU打开中断。
- ES:串行口中断允许位。ES=1,允许串口中断,否则关闭串口中断。
- ET1:定时/计数器T1中断允许位。ET1=1,允许T1中断,否则关闭T1中断。
- EX1:外部中断1允许位。EX1=1,允许外部中断1中断,否则关闭外部中断1。
- ET0:定时/计数器T0中断允许位。其功能与ET1相同。
- EX0:外部中断0允许位。其功能与EX1相同。
2.4 IP寄存器
单片机有两个中断优先级,即可实现二级中断服务嵌套。两级优先级遵循下述规则:仅高优先级可中断嵌套低优先级。简而言之:高优先级的中断可打断低优先级的中断。
说明:
- PX0:外部中断0优先级设定位;
- PT0:定时/计数器T0优先级设定位;
- PX1:外部中断1优先级设定位;
- PT1:定时/计数器T1优先级设定位;
- PS:串行口优先级设定位;
注意: 对于同一优先级的中断,一旦中断得到响应,就不会被其他中断打断。对于各中断的优先权值,则根据中断的系统的自然优先级形成,自然优先级如下图所示:
3. 中断处理流程
3.1 定时器中断实操
要求:使P1.0管脚上输出周期为2ms的方波脉冲。设单片机晶振频率Fosc=6MHz。
思路:利用定时器T0作1ms定时,达到定时值后引起中断,在中断服务程序中,使P1.0的状态取一次反,并再次定时1ms。
PS:当定时器/计数器工作在方式1时,且确定定时为T后,其初值的计算公式为:
X = 65536 - T x Fosc /12
编程实现为:
#include <reg52.h>
sbit Pulse=P1^1;
//初始化定时器
void InitTimer0( ){
EA = 0; //禁止所有中断
TMOD = 0x01; // T0为定时器状态,工作方式1
TL0 = (65536 - 10000) / 256 ; // T0的低位定时初值
TH0 = (65536 - 10000) %256 ; // T0的高位定时初值
ET0 = 1; //允许定时器/计数器0的溢出中断
EA = 1; //开CPU中断
TR0 = 1; //启动定时器0
}
//定时器0中断服务程序
void IRQTimer0 () interrupt 1{
EA=0;
TL0 = (65536 - 10000) / 256; // T0的低位定时初值
TH0 = (65536 - 10000) %256; // T0的高位定时初值
Pulse=~Pulse;
EA=1;
}
//主程序
void main() {
InitTimer0( )
Pulse=1;
while(1);
}
3.2 外部中断实操
要求:绘制电路图,并通过按键实现LED灯的闪烁。
思路:将按键信号作为单片机外部中断触发信号。每产生一个外部中断就将与LED灯相连的P1.0口电平取反,从而实现LED灯闪烁
PS:由于手动按键存在机械抖动,且按键会持续一段时间(约50~100ms),为避免一次按键产生多次外部中断,需要在每次中断后进行一定延时处理,确保本次按键已经释放
实现:电路图设计为:
编程为:
#include<reg51.h>
sbit LED=P1^0;
// 主函数
void main(void){
P3=0xff; //端口初始化,为外部中断信号输入作准备。
EA=1; //开总中断
IT0=0; //设置外部中断0为电平触发方式
EX0=1; //外部中断0允许
LED=0; //LED初始状态为点亮
while(1); //等待中断
}
//外部中断0服务程序
void EIRQ0(void) interrupt 0{
unsigned int iDelay=0;
EX0=0; //关外部中断1
LED=~ LED; //来一个外部中断信号LED状态改变一次
For(iDelay=0; iDelay<65535; iDelay++); //延时等待按键释放
EX0=1; //开外部中断1
}
3.3 思考题:
现要求编制程序,并设计相关外部电路,使P1.1管脚上连接LED,并在外部中断INT0连接按键。设单片机晶振频率Fosc=12MHz。
1.利用定时器T0使得达到定时值后引起中断,在中断服务程序中,使LED灯状态发生反转,并持续500ms。
2.若单片机被外部中断INT0中断,则在中断服务程序中使得LED等的状态进行500ms每次的闪烁(亮500ms,灭500ms)反复5次,期间可被定时器中断,5次以后重新回到INT0中断前状态。
想要获取或查看思考题的答案,请关注公众号:Newtol,后台回复暗号:中断