中断介绍
中断是为使单片机具有对外部或内部随机发生的事件实时处理而设置的,中断功能的存在,很大程度上提高了单片机处理外部或内部事件的能力。它也是单片机最重要的功能之一,是我们学些单片机必须要掌握的。
为了更容易的理解中断概念,我们先来举一个生活中的例子:你打开火烧上一壶水,然后去洗衣服,在洗衣服的过程中,突然听到水壶发水开的报警声,这时,你停止洗衣服动作,立即去关掉火,然后将开水灌入暖水瓶中,灌完开水后,你又回去继续洗衣服。这个过程实际就发生了一次中断。如下图:
对于单片机来讲,中断是指 CPU 在处理某一事件A时,发生了另一件事情B, 请求CPU迅速去处理(中断发生);CPU暂时停止当前的工作(中断响应),转去处理事件B(中断服务);待CPU将事件B处理完毕后,再回到原来事件 A 被中断的地方继续处理事件 A(中断返回),这一过程称为中断。
在来看生活事例,与单片机中断结合分析,主要任务事洗衣服,水开报警这时一个中断请求,这一时刻相当于断点处,你响应中断去关火,然后将开水灌入暖水瓶中,这一行动实际上就是处理中断程序,灌完开水后再回去继续洗衣服,相当于处理完中断程序后再返回主程序继续执行主程序。这里需要注意的是,水开是随时都有可能的,但是无论什么时候开,只要一开你将立即去处理它,处理完后再回来继续接着洗衣服。单片机再执行程序时,中断也是随时可能发生,但无论何时发生,只要一旦发生,单片机将立即暂停当前程序,赶去处理中断程序,处理完中断程序后再返回刚才暂停处接着执行原来的程序。
单片机再执行程序时其程序流程图如下:
①分时操作。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 响应相应的中断申请。其中有些中断源可以用软件独立地控 制为开中断或关中断状态。每一个中断的优先级别均可用软件设置。高优先级的 中断请求可以打断低优先级的中断,反之,低优先级的中断请求不可以打断高优 先级及同优先级的中断。当两个相同优先级的中断同时产生时,将由查询次序来 决定系统先响应哪个中断。
①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)或 T(SCON.1),串行口中断请求标志。当串行口接收完一帧串行数据时置位 RI 或 当串行口发送完一帧串行数据时置位 TI,向 CPU 申请中断。
中断相关寄存器
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 溢出中断请求标志位。
①中断源有中断请求;②此中断源的中断允许位为 1;③CPU 开中断(即 EA=1)。以上三条同时满足时,CPU 才有可能响应中断。在使用中断时我们需要做什么呢?
EA=1;//打开总中断开关EX0=1;//开外部中断 0IT0=0/1;//设置外部中断的触发方式
void int0() interrupt 0 using 1{//编写用户所需的功能代码}