5.1 中断的概念
5.2 中断控制系统
5.3 中断处理过程
5.4 中断的编程及应用举例
5.1 中断的概念
日常生活的中断现象举例
中断是指在突发事件到来时先中止当前正在进行的工作,转而去处理突发事件。待处理完成后,再返回到原先被中止的工作处,继续进行随后的工作。
中断的一般概念
中断响应过程:由中断管理系统处理突发事件的过程;
中断源:中断管理系统能够处理的突发事件;
中断请求:中断源向CPU提出的处理请求;
中断函数:针对中断源和中断请求提供的服务函数;
中断嵌套:在中断服务过程中执行
更高级别的中断服务。
中断过程与调用一般函数过程的相似性:
两者都需要保护断点,都可实现多级嵌套等。
中断过程与调用一般函数过程的差异性:
1、前者是程序设计者事先安排的(断点位置是明确的),而后者却是系统根据工作环境随机决定的(断点位置是随机的)。
2、主函数与一般函数之间具有主从关系,而主函数与中断函数之间则是平行关系(中断函数只能被系统调用);
3、一般函数调用是纯粹软件处理过程,而中断函数调用却是需要软、硬件配合才能完成的过程。
中断能实现的功能:
1、分时操作:CPU可以使多个外设同时工作,并分时为各外设提供服务,从而大大提高了CPU的利用率和输入/输出的速度。
2、实时处理:当计算机用于实时控制时,请求CPU提供服务是随机发生的。有了中断系统,CPU就可以立即响应并加以处理。
3、故障处理:当计算机运行中出现如电源断电、存储器校验出错、运算溢出等错误时,CPU可及时转去执行故障处理程序,减小或消除故障产生的影响。
在计算机与外部设备交换信息时,存在高速的CPU和低速的外设之间的矛盾。为了保证CPU送来的数据不至于丢失,可以采取两种办法:查询方式和中断方式。
中断法编程的思路:
让系统在后台等待被测源P3.2的状态变化,一旦有变就中止主函数的任务,转而执行P2.0的输出。
程序由主函数和中断函数组成,中断函数int0_srv( )完成p2_0电平翻转作用,主函数中的while(1)语句则模拟任意任务的语句。
主函数中没有检测语句,不会消耗主函数的机时,可提高检测效率。
疑问:
1、中断函数为何能自动执行?
2、主函数中变量赋值语句的作用?
答案:
1、P3.2的负脉冲信号是约定的中断源信息,可硬件激活中断响应;
2、中断系统的相关初始化工作。
5.2 中断控制系统
5.2.1 中断系统的结构
1、中断源(哪些信号可以作为51单片机中断源?)
中断源数量和种类越多,MCU处理突发事件的能力就越强。
80C51单片机共有5种中断源。
- 中断事件出现后,系统将调用与该中断源相对应的中断函数进行中断处理。
- 汇编语言中规定了5个特殊的ROM单元用于引导中断程序的调用,这些单元的地址称为中断向量。
- 汇编编程时,需要在此单元处放置一条指向中断程序入口地址的跳转语句,以便引导中断程序的执行。
- 对于C51语言,调用中断函数时不用中断向量,而要用到与中断源相应的中断号。
- 80C51的中断源、中断向量及中断号的对应关系如下表所示。
2、中断请求标志(单片机如何得知中断信号出现?)
当中断信号出现时,单片机中某些寄存器位(中断请求标志位)可被硬件置1。
CPU通过定期查看中断请求标志位是否为1,便可知道有无中断请求出现。
中断请求标志的置1原理
5.2.2 中断控制
中断系统的组成(影响中断的因素?)
中断信号分别沿5条水平路径由左向右进行传送。
其中,TCON、SCON、IE、IP是相关SFR。
1、TCON寄存器
定时/计数器的控制寄存器(Timer/Counter Control Register),字节地址为88H,可位寻址。
2、SCON寄存器
串口控制寄存器(Serial control register),字节地址为98H,可位寻址。
【注意】TI和RI虽然是2个中断请求标志位,但在SCON之后经或门电路合成为1个信息,统一接受中断管理。
3、IE寄存器
中断允许寄存器(Interrupt Enable Register),字节地址为A8H,可位寻址。
【注意】单片机复位后IE初值为0——默认为禁止所有中断。
4、IP 寄存器
中断优先级寄存器(Interrupt Priority Registers),字节地址为B8H,可位寻址。
【注意】每个中断源的优先级都有两种选择,可被选入两个队列之一。
优先级原则:
1)高级中断请求可以打断正在执行的低级中断;
2)同级或低级中断请求不能打断正在执行的中断;
3)同级中断源同时提出请求时按自然优先级响应:
/INT0→ T0 → /INT1→T1→TI/RI
4)单片机复位时,IP初值为0——默认
所有中断源均为低级中断。
中断标志汇总
中断管理寄存器汇总
中断系统汇总
5.3 中断处理过程
中断处理包括中断请求、中断响应、中断服务等环节。
1.中断响应
中断响应是指CPU从发现中断请求,到开始执行中断函数的过程。CPU响应中断的基本条件为:
① 有中断源发出中断请求;
② 中断总允许位EA=1,即CPU开中断;
③ 申请中断的中断源的中断允许位为1,即没有被屏蔽。
满足以上条件后,CPU一般都会响应中断。但如果遇到一些特殊情况,中断响应还将被阻止,例如CPU正在执行某些特殊指令,或CPU正在处理同级的或更高优先级的中断等。待这些中断情况撤销后,若中断标志尚未消失,则CPU还可继续响应中断请求,否则中断响应将被中止。
CPU响应中断后,由硬件自动执行如下功能操作:
① 中断优先级查询,对后来的同级或低级中断请求不予响应;
② 保护断点,即把程序计数器PC的内容压入堆栈保存;
③ 清除可清除的中断请求标志位(见中断撤销);
④ 调用中断函数并开始运行;
⑤ 返回断点继续运行。
可见,除中断函数运行是软件方式外,其余中断处理过程都是由单片机硬件自动完成的。
2.响应时间
从查询中断请求标志到执行中断函数第一条语句所经历的时间,称为中断响应时间。
不同中断情况,中断响应时间是不一样的,以外部中断为例,最短的响应时间为3个机器周期。
这是因为,CPU在每个机器周期的S6期间查询每个中断请求的标志位。如果该中断请求满足所有中断条件,则CPU从下一个机器周期开始调用中断函数,而完成调用中断函数的时间需要2个机器周期。这样中断响应共经历了1个查询机器周期加2个调用中断函数周期,总计3个机器周期,这也是对中断请求作出响应所需的最短时间。
如果中断响应受阻,则需要更长的响应时间,最长响应时间为8个机器周期。一般情况下,在一个单中断系统里,外部中断的响应时间在3~8个机器周期之间。如果是多中断系统,且出现了同级或高级中断正在响应或正在服务中,则需要等待响应,那么响应时间就无法计算了。
这表明,即使采用中断处理突发事件,CPU也存在一定的滞后时间。在可能的范围内提高单片机的时钟频率(缩短机器周期),可减少中断响应时间。
3.中断撤销
中断响应后,TCON和SCON中的中断请求标志应及时清0,否则中断请求将仍然存在,并可能引起中断误响应。不同中断请求的撤销方法是不同的。
对于定时/计数器中断,中断响应后,由硬件自动对中断标志位TF0和TF1清0,中断请求可自动撤销,无须采取其他措施。
对于脉冲触发的外部中断请求,在中断响应后,也由硬件自动对中断请求标志位IE0和IE1清0,即中断请求的撤销也是自动的。
对于电平触发的外部中断请求,情况则不同。中断响应后,硬件不能自动对中断请求标志位IE0和IE1清0。中断的撤销,要依靠撤除引脚上的低电平,并用软件使中断请求标志位清0才能有效。由于撤除低电平需要有外加硬件电路配合,比较烦琐,因而采用脉冲触发方式便成为常用的做法。
对于串口中断,其中断标志位TI和RI不能自动清0。因为在中断响应后,还要测试这两个标志位的状态,以判定是接收操作还是发送操作,然后才能清除。所以串口中断请求的撤销是通过软件方法实现的。
4.中断函数
中断服务是针对中断源的具体要求进行设计的,需要用户自己编写。C51中断函数采用如下定义格式:
void 函数名 (void) interrupt n〔using m〕
{ 函数体语句 }
这里interrupt和using都是C51扩展的关键词,其中:
整数n是与中断源相对应的中断号,使用interrupt n可以让编译器知道相应中断向量地址(=8n+3),并在这个地址上自动安排一个指向该中断函数首地址的无条件跳转指令。由于无须人工处理跳转,编写C51中断函数要比编写汇编语言中断服务程序更加简明快捷。
整数m是工作寄存器组的组号,C51组号m与80C51工作寄存器组的关系如表5.4所示。使用using m可以切换工作寄存器组,省去中断响应时为保护断点进行的压栈操作,从而提高中断处理的实时性。using m省略时默认采用当前工作寄存器组(由特殊功能寄存器PSW的RS1和RS0位设定)。
C51一般函数的定义格式:
〔返回值类型〕函数名(〔形式参数〕)〔编译模式〕〔reentrant〕〔interrupt x〕〔using y〕
C51中断函数的定义格式:
void 函数名 (void) interrupt n〔using m〕
可见,C51中断函数是C51一般函数的一个特例:
① 中断函数是没有返回值的void型函数;
② 中断函数是没有形参的无参函数;
③ 中断函数采用系统默认编译模式;
④ 中断函数不是可重入的函数;
使用C51中断函数还需要注意以下几点:
① 允许在中断函数中使用return语句(表示结束中断),但不能使用带有表达式的return语句,如return(z)。
② 可以通过使用全局变量,将变量值传入或传出中断函数,以此弥补无参和无返回值的使用限制;
③ 中断函数只能被系统调用,不能被其他任意函数调用。
④ 为提高中断响应的实时性,中断函数应尽量简短,并尽量使用简单变量类型及简单算术运算。一种常用的编程做法是,在中断函数中仅更新全局性标志变量值,而在主函数或其他函数中根据该标志变量值再做相应处理,这样就能较好地发挥中断对突发事件的应急处理能力。
5.4 中断编程及应用
5.4.1 中断的编程和应用举例
【实例2】中断扫描法行列式键盘
试比较查询法键盘和中断法键盘的差异,并完成中断法键盘的硬件设计和软件编程工作。
【解】分析:
在单片机应用系统中,键盘扫描只是CPU工作的内容之一。CPU在忙于各项工作任务时,需要兼顾键盘扫描,既保证不失时机地响应键操作,又不过多地占用CPU时间。
因此,可以采用中断扫描方式来提高CPU的效率,即只有在键盘有键按下时,才执行键盘扫描程序;如果无键按下,则将键盘视为不存在。
相比可知,中断法中当各列电平都为0时,无论压下哪个按键,与门的输出端都可形成/INT0的中断请求信号。这样便可将按键的扫描查询工作放在中断函数中进行,从而就能达到既快速响应按键动作,又提高CPU工作效率的目的。
硬件更改:
增加一个4输入与门器件U3→行线分接输入端,输出端接P3.2(INT0);
软件更改:
①主函数中进行中断初始化,中断函数中查找闭合键号并刷新LED显示;
②每次中断返回前都应将列电平置为全低,行电平置为全高,为下次中断做准备 。
实例2源程序
【实例3】中断方式的键控流水灯
试将第4章实例2的查询法进行按键检测的流水灯示例,改为用中断法进行按键检测的流水灯示例(包括硬件电路和软件编程)。
实例2的问题:当CPU运行于LED循环环节时,将因不能及时检测按键状态,而使按键操作不灵敏。
硬件改动:增加一只4输入与门电路,使按键闭合电平作为外部中断信号。
软件改动:将标志位修改功能放在中断函数中进行。
实例3源程序
实例4 观察两级中断嵌套效果
根据如图所示的数码管显示与按键电路图,编程实现两级外部中断嵌套演示效果。其中K0定为低优先级中断源,K1为高优先级中断源。此外,利用发光二极管D1验证外部中断请求标志IE0在脉冲触发中断时的硬件置位与撤销过程。
【解】分析:
① 利用3只数码管分别进行字符1~9的循环显示,其中由主函数对LED0进行无限计数显示,由中断函数K0和K1分别对LED1和LED2进行单圈计数显示。由此观察中断及中断嵌套现象。
②为观察IE0的撤销过程,在K1中断函数里将IE0值送P3.0输出。由此观察IE0的变化。
实例4源程序
5.4.2 扩展外部中断源
MCS-51系列单片机只有两个外部中断源输入端。当所设计的应用系统需要两个以上外部中断源时,就要进行外部中断源的扩展。
①利用定时器扩展外部中断源(参见第6章的实例3)
②利用查询法扩展外部中断源
基本思路是,每根中断输入线可以通过“线或”的关系连接多个外部中断源,同时利用输入端口线作为各个中断源的识别线。
③采用优先权解码芯片74LS148扩展外部中断源
当8个任意按键按下时,解码芯片的GS引脚都将使80C51的 引脚产生中断请求。中断函数只需保存解码芯片形成的中断分支码,并置位自定义中断标志位即可返回。在主函数中,则可根据中断标志位判断有无中断发生,并根据中断分支码判断中断请求分支号,据此可实现8路外部中断源的扩展。
在主函数中,则可根据中断标志位判断有无中断发生,根据中断分支码判断中断请求分支号,据此可实现8路外部中断。
【实例5】扩展8路外部中断源
下图为模拟解码芯片74LS148扩展8路外部中断源应用的电路图。试编写程序,实现用数码管的显示值模拟扩展后的中断分支程序的功能。
【解】分析:
P2中包含了解码芯片74LS148的3位编码输出值7~0和5位悬空引脚的高电平。为使其变换为0~7的编码信息,可以对P2进行取反后再屏蔽高5位的运算,即~P2&0x07。然后将变换结果作为分支跳转条件和数码管字模数组指针,实现模拟扩展外部中断函数的效果。
实例5源程序:
本章小结