问题引入
在了解基本概念之前,先看三个问题:
1.你想使用的中断是哪个?
2.你所希望的触发条件是什么?
3.你希望在中断之后做什么?
可以边看边思考,文章最后给出答案
中断概念
为什么引入中断?
中断是为使单片机具有对外部或内部随机发生的事件实时处理而设置的,中断功能的存在,很大程度上提高了单片机处理外部或内部事件的能力。
中断系统特点:
①分时操作。CPU 可以分时为多个 I/O 设备服务,提高了计算机的利用率;
②实时响应。CPU 能够及时处理应用系统的随机事件,系统的实时性大大增强;
③可靠性高。CPU 具有处理设备故障及掉电等突发性事件能力,从而使系统可靠性提高
中断过程
对于单片机来讲,中断是指CPU在处理某一时间A时,发生了另一事件B请求CPU立刻去处理(中断发生或中断请求);CPU暂时停止当前的工作(中断响应),转而去处理事件B(中断服务),待CPU处理事件B完成后,再回到原来事件A被中断的地方继续处理事件A(中断返回)。这一过程称为中断,注意是整个过程,而不是单一的停止一件事的意思。
举例:你打开火,烧上一壶水。然后去洗衣服,在洗衣服的过程中,突然听到水壶发出水开的报警声,这时,你停止洗衣服动作,立即去关掉火,然后将开水灌入暖水瓶中,灌完开水后,你又回去继续洗衣服。这个过程中实际上就发生了一次中断。
对照图:
程序流程图
单片机在执行程序时,中断也随时有可能发生,但无论何时发生,只要一旦发生,单片机将立即暂停当前程序,赶去处理中断程序,处理完中断程序后再返回刚才暂停处接着执行原来的程序。
中断系统:实现中断过程
中断源:请示CPU中断的请求源。微型机的中断系统一般允许多个中断源,当几个中断源同时向 CPU 请求中断,要求为它服务的时候,这就存在CPU 优先响应哪一个中断源请求的问题。通常根据中断源的轻重缓急排队,优先处理最紧急事件的中断请求源,即规定每一个中断源有一个优先级别。CPU 总是先响应优先级别最高的中断请求。
中断嵌套:当单片机正在执行中断请求时,又出现了一个比正在执行的优先级更高的中断请求,则先停止正在执行的中断请求,执行优先级高的中断请求,等执行完后再执行原来优先级较低的中断请求。
拥有中断嵌套的中断系统称为多级中断系统,没有嵌套功能的为单级中断系统。
中断结构
大多数单片机共提供8个中断请求源,但是一定有最基本的5个中断。
中断:
外部中断0(INTO)、外部中断 1(INT1)、外部中断 2(INT2)、外部中断 3(INT3)、定时器 0中断、定时器 1 中断、定时器 2 中断、串口(UART)中断。
基本中断:
INT0、INT1、定时器 0,定时器1,串口中断。
中断请求标志位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和1(IT0和IT1)为0或1时是两种触发方式,低电平触发和边沿触发,是控制位不是标志位。
中断允许控制
CPU 对中断系统所有中断以及某个中断源的开放和屏蔽是由中断允许寄存器IE 控制的。
各中断的中断允许位:
EX0(IE.0),外部中断 0 允许位;
ET0(IE.1),定时/计数器 T0 中断允许位;
EX1(IE.2),外部中断 1允许位;
ET1(IE.3),定时/计数器 T1 中断允许位;
ES(IE.4),串行口中断允许位;
EA (IE.7), CPU 中断允许(总允许)位。
注意:总中断允许位就是是总开关一样,只有总允许位有效的前提下,其它中断置允许位才能使中断有效。
中断优先级
同一优先级中的中断申请不止一个时,则有中断优先权排队问题。同一优先级的中断优先权排队,由中断系统硬件确定的自然优先级形成,其排列如所示:
中断优先级三条原则:
首先响应高优先级的中断请求。
2.高优先级的中断请求可以打断低优先级的中断。
3.低优先级的中断请求不可以打断高优
先级及同优先级的中断。
中断号
中断号在编程时非常重要,当中断来临时,只有中断号正确才能进入中断。
中断响应条件
①中断源有中断请求;
②此中断源的中断允许位为 1;
③CPU 开中断(总允许位)(即 EA=1)。
以上三条同时满足时,CPU 才有可能响应中断
如图,为中断内部结构框图:
TCON为中断请求标志,其中外部中断0和外部中断1可选择控制方式低电平有效还是下降沿有效。
,IE为中断允许位,可以看到,只有EA等于1时,其他中断允许才可能有效。
从图中可以看出,一个中断过程:中断位(确定哪一个中断)->中断标志位->中断允许位->中断总允许位->中断执行功能。
问题引入及解答(中断应用举例)
回到上面的三个问题
1.你想使用的中断是哪个?
每一个中断都对应一个中断号,要想使用某一中断就选择对应的中断号。
2.你所希望的触发条件是什么?
外部中断的触发调件触发条件可分为低电平触发和下降沿触发,要明确触发条件。
3.你希望在中断之后做什么?
即中断服务函数,函数里要做什么,执行什么样的功能。
以外部中断0为例:
EA=1;//打开总中断开关
EX0=1;//开外部中断 0
IT0=0/1;//设置外部中断的触发方式
/*中断服务函数*/
void int0() interrupt 0 using 1//intterrupt表示中断,0表示中断号,using1可省略
{
//编写用户所需的功能代码
}