MCS-51的中断系统
MCS-51单片机内的中断系统主要用于实时测控,即要求单片机能及时地响应和处理单片机外部或内部事件所提出的中断请求。由于这些中断请求都时随机发出的,如果采用定时查询方式来处理这些中断请求,则单片机的工作效率低,且得不到实时处理。因此,MCS-51单片机要实时处理这些中断请求,就必须采用具有中断处理功能的部件——中断系统来完成。* 为什么用中断,因为定时查询的效率低。(注意这里讲的定时查询不是定时器
【说明】本文学习自《单片机原理及应用(张毅刚)》
目录
MCS-51单片机内的中断系统主要用于实时测控,即要求单片机能及时地响应和处理单片机外部或内部事件所提出的中断请求。由于这些中断请求都时随机发出的,如果采用定时查询方式来处理这些中断请求,则单片机的工作效率低,且得不到实时处理。因此,MCS-51单片机要实时处理这些中断请求,就必须采用具有中断处理功能的部件——中断系统来完成。
* 为什么用中断,因为定时查询的效率低。(注意这里讲的定时查询不是定时器查询)
1 中断的概念
当MCS-51单片机的CPU正在处理某件事情(例如,正在执行主程序)的时候,单片机外部或内部发生的某一事件(如外部设备产生的一个电平的变化,一个脉冲沿的发生或内部计数器的计数溢出等)请求CPU迅速去处理,于是,CPU暂时中止当前的工作,转到中断服务处理程序处理所发生的事件。中断服务处理程序处理完该事件后,再回到原来被中止的地方,继续原来的工作(例如,继续执行被中断的主程序),这称为中断。CPU处理事件的过程,称为CPU的中断响应过程,如图5-1所示。对事件的整个处理过程,称为中断处理(或中断服务)。

图 1-1 中断响应过程
能够实现中断处理功能的部件称为中断系统;产生中断的请求源称为中断请求源(或中断源);中断源向CPU提出的处理请求,称为中断请求(或中断申请)。当CPU暂时中止正在执行的程序,转去执行中断服务程序时,除了硬件自动把断点地址(16位程序计数器PC的值)压入堆栈之外,用户应注意保护有关的工作寄存器、累加器、标志位等信息,这称为保护现场。在完成中断服务程序后,恢复有关的工作寄存器、累加器、标志位内容,这称为恢复现场。最后执行中断返回指令RETI。从堆栈中自动弹出断点地址到PC,继续执行被中断的程序,这称为中断返回。
如果没有中断技术,CPU的大量时间可能会浪费在原地踏步的查询操作上,或者采用定时查询,即不论又无中断请求,都要定时去查询。采用中断技术完全消除了CPU在查询方式中的等待现象,大大地提高了CPU的工作效率。由于中断工作方式的优点极为明显,因此在单片机的硬件结构中都带有中断系统。
2 MCS-51中断系统的结构
MCS-51单片机的中断系统有5个中断请求源,具有2个中断优先级,可实现2级中断服务程序嵌套。用户可以用关中断指令“CLR EA”来屏蔽所有的中断请求,也可以用开中断指令“SET EA”来允许CPU接收中断请求;每一个中断源可以用软件独立地控制为允许中断或关中断状态;每一个中断源的中断级别均可用软件来设置。
MCS-51的中断系统结构示意图如图5-2所示。下面将从应用的角度来说明MCS-51的中断系统的工作原理和编程方法。

图2-2 MCS-51 的中断系统结构
3 中断请求源
MCS-51中断系统共有5个中断请求源(见图3-1),它们是:
(1)——外部中断请求0,由
引脚输入,中断请求标志为IE0。
(2)——外部中断请求1,由
引脚输入,中断请求标志为IE1。
(3)定时器/计数器T0溢出中断请求,中断请求标志为TF0。
(4)定时器/计数器T1溢出中断请求,中断请求标志为TF1。
(5)串行口中断请求,中断请求标志为T1或R1。
这些中断请求源的中断请求标志位分别由特殊功能寄存器TCON和SCON的相应位锁存。
TCON为定时器/计数器的控制寄存器,字节地址为88H,可位寻址。该寄存器中既有定时器/计数器T0和T1的溢出中断请求标志位TF1和TF0,也包括了有关外部中断请求标志位IE1和IE0。其格式如图5-3所示:

图3-1 TCON中的中断请求标志位
TCON寄存器中与中断系统有关的各标志位的功能如下:
(1)IT0——选择外部中断请求0为跳沿触发方式还是电平触发方式;
IT0=0,为电平触发方式,加到引脚 上的外部中断请求输入信号为低电平有效。
IT1=1,为跳沿触发方式,加到引脚 上的外部中断情求输入信号电平从高到低的负跳变有效。
IT0位可由软件置1或清0。
(2)IE0 —— 外部中断请求0的中断请求标志位。
当IT0=0,为电平触发方式,CPU在每个机器周期的S5P2采样 引脚,若 引脚为低电平,则置IE0为1,说明有中断请求,否则IE0清0。
当IT0 = 1,即外部中断请求0设置为跳沿触发方式时,当低一个机器周期采样到 为低电平时,则置IE0为1。IE0=1,表示外部中断0正在向CPU请求中断。当CPU响应该中断,转向中断服务程序时,由硬件对IE0清0。
(3)IT1——选择外部中断请求1为跳沿触发方式还是电平触发方式,其意义与IT0类似。
(4)IE1——外部中断请求1的中断请求标志位,其意义与IE0类似。
(5)TF0——MCS-51片内定时器/计数器T0溢出中断请求标志位。
当启动T0计数后,定时器/计数器T0从初值开始加1计数,当最高位产生溢出时,由硬件对TF0置1,向CPU申请中断,CPU响应TF0中断时,对TF0清0,TF0也可由软件清0。
(6)TF1——MCS-51片内的定时器/计数器T1的溢出中断请求标志位,功能和TF0类似。
TR1(D6位)、TR0(D4位)这2个位与中断无关,仅与定时器/计数器T1和T0有关,它们的功能将在定时器/计数器一章中介绍。
当MCS-51复位后,TCON被清0,则CPU关中断,锁由中断请求被禁止。
SCON为串行口控制寄存器,字节地址为98H,可位寻址。SCON的低2位锁存串行口的发送中断和接收中断的中断请求标志T1和R1,其格式如图3-2所示:

图3-2 SCON中的中断请求标志位
SCON中各标志位的功能入下:
(1)TI——串行口的发送中断请求标志位。CPU将1B的数据写入发送缓冲器SBUF时,就启动1帧串行数据的发送,每发送完1帧串行数据后,硬件自动对T1置1。CPU响应串行口发送中断时,CPU并不清除T1中断请求标志,必须在中断服务程序中用软件对T1标志清0。
(2)RI——串行口接收中断请求标志位。在串行口接收完1个串行数据帧,硬件自动对RI中断请求标志置1。CPU在响应串行口接收中断时,并不对RI标志清0,必须在中断服务程序中用软件对RI清0。
4 中断控制
4.1 中断允许寄存器IE
MCS-51的CPU对中断源的开放或屏蔽,是由片内的中断允许寄存器IE控制的。IE的字节地址为A8H,可进行位寻址。其格式如图4-1所示:

图4-1 中断允许寄存器IE的格式
中断允许寄存器IE对中断的开放和关闭实现2级控制。所谓2级控制,就是有1个总的开关中断控制位EA(IE.7位),当EA=0时,所以的中断请求被屏蔽,CPU对任何中断请求都不接受,称CPU关中断;当EA=1时,CPU开放中断,但5个中断源的中断请求是否允许,还要由IE中的低5位所对应的5个中断请求允许控制位的状态来决定(见图4-1)。
IE中各位的功能如下:
(1)EA——中断允许总控制位
EA = 0,CPU屏蔽所有的中断请求(CPU关中断);
EA = 1,CPU开放所有中断(CPU开中断)。
(2)ES——串行口中断允许位
ES = 0,禁止串行口中断;
ES = 1,允许串行口中断;
(3)ET1——定时器/计数器T1的溢出中断允许位
ET1 = 0,禁止T1溢出中断;
ET1 = 1,允许T1溢出中断;
(4)EX1——外部中断1中断允许位
EX1 = 0,禁止外部中断1中断;
EX1 = 1,允许外部中断1中断。
(5)ET0——定时器/计数器T0的溢出中断允许位
ET0 = 0,禁止T0溢出中断;
ET0 = 1,允许T0溢出中断。
(6)EX0——外部中断0中断允许位。
EX0 = 0,禁止外部中断0中断;
EX0 = 1,允许外部中断0中断。
MCS-51复位以后,IE被清0,所有的中断请求被禁止。由用户程序置1或对IE相应的位清0,即可允许或禁止各中断源的中断申请。若使某一个中断源被允许中断,除了相应的位被置1外,还必须使EA=1,即CPU开放中断。改变IE的内容,可由位操作指令来实现(即SETB bit; CLR bit),也可用字节操作指令实现(即MOV IE, #data; ANL IE, #data; ORL IE,#data; MOV IE, A等)。
例4-1 若允许片内2个定时器/计数器中断,禁止其它中断源的中断请求。请编写出设置IE的相应程序段。
(1)用位操作指令来编写如下程序段:
CLR ES ;禁止串行口中断
CLR EX1 ;禁止外部中断1中断
CLR EX0 ;禁止外部中断0中断
SETB ET0 ;允许定时器/计数器T0中断
SETB ET1 ;允许定时器/计数器T1中断
SETB EA ;CPU开中断
(2)用字节操作指令来编写:
MOV IE, #8AH
或者用:
MOV 0A8H, #8AH ;A8H为IE寄存器的地址字节地址
4.2 中断优先级寄存器IP
MCS-51的中断请求源有2个中断优先级,每一个中断请求源可由软件定为高优先级中断或低优先级中断,可实现2级中断嵌套,所谓2级中断嵌套,就是CPU正在执行低优先级中断的服务程序时,可被高优先级中断请求所中断,去执行高优先级中断服务程序,待高优先级中断处理完毕后,再返回低优先级中断服务程序。
2级中断嵌套的过程如图4-2所示。

图 4-2 2级中断嵌套
由图4-2可见,一个正在执行的低优先级中断程序能被高优先级的中断源所中断,但不能被另一个低优先级的中断源所中断。若CPU正在执行高优先级的中断,则不能被任何中断源所中断,一直执行到中断服务程序结束,遇到中断返回指令RETI,返回主程序再执行一条指令后才能响应新的中断请求。以上所述可以归纳为下面两条基本规则:
(1)低优先级可被高优先级中断,反之则不能。
(2)任何一种中断(不管时高级还是低级),一旦得到响应,不会再被它的同级中断源所中断。如果某一中断源被设置为高优先级中断,在执行该中断源的中断服务程序时,则不能被任何其它中断源的中断请求所中断。
MCS-51的片内有一个中断优先级寄存器IP,其字节地址为B8H,可位寻址。只要用程序改变其内容,即可进行各中断源中断级别的设置,IP寄存器的格式如图4-3所示:

图 4-3 中断优先级寄存器IP的格式
中断优先级寄存器IP各个位的含义如下:
(1)PS——串行口中断优先级控制位
PS=1,串行口中断定义为高优先级中断;
PS=0,串行口中断定义为低优先级中断。
(2)PT1——定时器T1中断优先级控制位
PT1=1,定时器T1定义为高优先级中断;
PT1=0,定时器T1定义为低优先级中断。
(3)PX1——外部中断1中断优先级控制位
PX1=1,外部中断1定义为高优先级中断;
PX1=0,外部中断1定义为低优先级中断。
(4)PT0——定时器T0中断优先级控制位
PT0=1,定时器T0定义为高优先级中断;
PT0=0,定时器T0定义为低优先级中断。
(5)PX0——外部中断0中断优先级控制位
PX0=1,外部中断0定义为高优先级中断;
PX0=0,外部中断0定义为低优先级中断。
中断优先级控制寄存器IP的各位都由用户程序置1和清0,可用位操作指令或字节操作指令更新IP的内容,以改变各中断源的中断优先级。
MCS-51复位以后,IP的内容为0,各个中断源均为低优先级中断。
为进一步了解MCS-51中断系统的优先级,简单介绍一下MCS-51的中断优先级结构。MCS-51的中断系统有两个不可寻址的优先级激活触发器。其中一个指示某高优先级的中断正在执行,所有后来的中断均被阻止。另一个触发其指示某低优先级的中断正在执行,所有同级的中断都被阻止,但不阻断高优先级的中断请求。
在同时收到几个同一优先级的中断请求时,哪一个中断请求能优先得到响应,取决于内部的查询顺序。这相当于在同一个优先级内,还同时存在另一个辅助优先级结构,其查询顺序如下:

由上可见,各中断源在同一个优先级的条件下,外部中断0的中断优先权最高,串行口中断的优先权最低。
例4-2 设置IP寄存器的初始值,使得MCS-51的2各外中断请求为高优先级,其它中断请求为低优先级。
(1)用位操作指令
SETB PX0 ;2个外中断为高优先级
SETB PX1
CLR PS ; 串行口、2个定时器/计数器为低优先级中断
CLR PT0
CLR PT1
(2)用字节操作指令
MOV IP, #05H
或者用:
MOV 0B8H, #05H ;B8H为IP寄存器的字节地址
5 响应中断请求的条件
一个中断源的中断请求被响应,需满足以下必要条件:
(1)CPU开中断,即IE寄存器中的中断总允许位EA=1。
(2)该中断源发出中断请求,即该中断源对应的中断请求标志为1。
(3)该中断源的中断允许位=1,即该中断没有被屏蔽。
(4)无同级或更高级中断正在被服务。
中断响应就是CPU对中断源提出的中断请求的接受。当CPU查询到有效的中断请求,并满足上述条件时,紧接着就是进行中断响应。
中断响应的主要过程是首先由硬件自动生成一条长调用指令LCALL addr16。这里的addr16就是程序存储区中的相应的中断入口地址。例如,对于外部中断1的响应,产生的长调用指令为:
LCALL 0013H
生成LCALL指令后,紧接着就由CPU执行该指令。首先是将程序计数器PC的内容压入堆栈以保护断点,再将中断入口地址装入PC,使程序转向响应中断请求的中断入口地址。各中断服务程序的入口地址是固定的,如下所示:

2个中断入口间只相隔8B,一般情况下难以安排一个完整的中断服务程序。因此,通常总是再中断入口地址放置1条无条件转移指令,使程序执行转向在其它地址存放的中断服务程序。
中断响应是有条件的,并不是查询到的所有中断请求都能被立即响应,当遇到下列三种情况之一时,中断响应被封锁:
(1)CPU正在处理同级的或更高优先级的中断。因为当一个中断被响应时,要把对应的中断优先级状态触发器置1(该触发器指出CPU所处理的中断优先级别),从而封锁了低级中断和同级中断请求。
(2)所查询的机器周期不是当前所正在执行指令的最后一个机器周期。作这个限制的目的是只有在当前指令执行完毕后,才能进行中断响应,以确保当前指令完整的执行。
(3)正在执行的指令是RETI或是访问IE或IP的指令。因为按MCS-51中断系统特性的规定,在执行完这些指令后,需要再去执行完一条指令,才能响应新的中断请求。
如果存在上述三种情况之一,CPU将丢弃中断查询结果,不能对中断进行响应。
6 外部中断的响应时间
在设计者使用外部中断时,有时需考虑从外部中断请求有效(外部中断请求标志置1)到转向中断入口地址所需要的响应时间。下面来讨论这个问题。
外部中断的最短响应时间为3个机器周期。其中中断请求标志位查询占起个机器周期,而这个机器周期恰好是处于指令的最后一个机器周期,在这个机器周期结束后,中断即被响应,CPU接着执行1条硬件子程序调用指令LCALL以转到相应的中断服务程序入口,则需要2个机器周期。
外部中断响应的最长时间为8个机器周期。这种情况发生在CPU进行中断标志查询是,刚好是开始执行RETI或是访问IE或IP的指令,则需把当前指令执行完再继续执行1条指令后,才能响应中断。执行上述的RETI或是访问IE或IP的指令,最长需要2个机器周期。而接着再执行的1条指令,按最长的指令(乘法指令MUL和除法指令DIV)来算,也只有4个机器周期。再加上硬件子程序调用指令LCALL的执行,需要2个机器周期,所以,外部中断响应最长时间为8个机器周期。
如果已经在处理同级或更高级中断,外部中断请求的响应时间取决于正在执行的中断服务程序的处理时间,这种情况下,响应时间就无法计算了。
这样,在1个单一中断的系统里,MCS-51单片机对外部中断请求的响应时间总是在3~8个机器周期之间。
7 外部中断的触发方式选择
外部中断的触发有2种触发方式:电平触发方式和跳沿触发方式。
7.1 电平触发方式
若外部中断定义为电平触发方式,外部中断申请触发器的状态随着CPU在每个机器周期采样到的外部中断输入线的电平变化而变化,这能提高CPU对外部中断请求的响应速度。当外部中断源被设定为电平触发方式时,在中断服务程序返回之前,外部中断请求输入必须无效(即变为高电平),否则CPU返回主程序后会再次响应中断。所以电平触发方式适合于外部中断以低电平输入而且中断服务程序能清除外部中断请求源(即外部中断输入电平又变为高电平)的情况。
7.2 跳沿触发方式
外部中断若定义为跳沿触发方式,外部中断请求触发器能锁存外部中断输入线上的负跳变。即便是CPU暂时不能响应,中断请求标志也不会丢失。在这种方式里,如果相继连续两次采样,一个机器周期采样到外部中断输入为高,下一个机器周期采样为低,则置1中断申请触发器,直到CPU响应此中断时,该标志才清0。这样不会丢失中断,但输入的负脉冲宽度至少保持12个时钟周期(若晶振频率为6MHz,则为2us),才能被CPU采样到。外部中断的跳沿触发方式适合于以负脉冲形式输入的外部中断请求。
8 中断请求的撤销
某个中断请求被响应后,就存在着一个中断请求的撤销问题。下面按中断请求源的类型分别说明中断请求的撤销方法。
1 定时器/计数器中断请求的撤销
定时器/计数器中断的中断请求被响应后。硬件会自动把中断请求标志位(TF0或TF1)清0,因此定时器/计数器中断请求是自动撤销的。
2 外部中断请求的撤销
(1)跳沿方式外部中断请求的撤销:跳沿方式的外部中断请求的撤销,包括2项内容:中断标志位的清0和外中断信号的撤销。其中,中断标志位(IE0或IE1)的清0是在中断响应后由硬件自动完成的。而外中断请求信号的撤销,由于跳沿信号过后也就消失了,所以跳沿方式的外部中断请求也是自动撤销的。
(2)电平方式外部中断请求的撤销:对于电平方式外部中断请求的撤销,中断请求标志的撤销是自动的,但中断请求信号的低电平可能继续存在,在以后的机器周期采样时,又会把已清0的IE0或IE1标志位重新置1。为此,要彻底解决电平方式外部中断请求的撤销,除了标志位清0之外,必要时还需在中断响应后把中断请求信号引脚从低电平强制改变为高电平。为i此,可在系统中增加如图5-8所示的电路。

图 8-1 电平方式外部中断请求的撤销电路
由图8-1可见,用D触发器锁存外来的中断请求低电平,并通过D触发器的输出端Q接到(或
)。所以,增加的D触发器不影响中断请求。中断响应后,为了撤销中断请求,可利用D触发器的直接置位端SD实现,把SD端接MCS-51的P1.0端。因此,只要P1.0端输出一个负脉冲就可以使D触发器置1,从而撤销了低电平的中断请求信号。所需的负脉冲可通过在中断服务程序中增加如下2条指令得到:
ORL P1, #01H ;P1.0为1
ANL P1, #0FEH ;P1.0为0
可见,电平方式的外部中断请求信号的完全撤销,是通过软硬件相结合的方法来实现的。
3 串行口中断请求的撤销
串行口中断请求的撤销只有标志位清0的问题。串行口中断的标志位是TI和RI,但着2个中断标志CPU不进行自动清0。因为在响应串行口的中断后,CPU无法知道是接收中断还是发送中断,还需测试这2个中断标志位的状态,以判定是接收操作还是发送操作,然后才能清除。所以串行口中断请求的撤销只能使用软件的方法,在中断服务程序中进行,即用如下的指令来进行串行口中断标志位的清除:
CLR T1 ;清TI标志位
CLR RI ;清RI标志位
9 中断服务程序的设计
中断系统虽是硬件系统,但必须由相应软件配合才能正确使用。设计中断服务程序需要弄清楚以下几个问题。
1 中断服务程序设计的任务
中断服务程序设计的基本任务有下列几条:
(1)设置中断允许控制寄存器IE,允许相应的中断请求源中断。
(2)设置中断优先级寄存器IP,确定并分配所使用的中断源的优先级。
(3)若是外部中断源,还要设计中断请求的触发方式IT1或IT0,以决定采用电平触发方式还是跳沿触发饭方式。
(4)编写中断服务程序,处理中断请求。
前3条一般方在程序的初始化程序段中。
例9-1 假设允许外部中断0中断,并设定它为高级中断,其它中断源为低机中断,采用跳沿触发方式。在主程序中可编写如下程序段:
SETB EA ;EA位置1,CPU开中断
SETB ET0 ;ET0位置1,允许外部中断0产生中断
SETB PX0 ;PX0位置1,外部中断0为高级中断
SETB IT0 ;IT0位置1,外部中断0为跳沿触发方式
2 采用中断时的主程序结构
由于各中断入口地址是固定的,而程序又必须先从主程序起始地址0000H执行。所以,在0000H起始地址的几个字节中,要用无条件转移指令,跳转到主程序。另外,各中断入口地址之间依次相差8B。中断服务程序稍长就超过8B,这样中断服务程序就占用了其它的中断入口地址,影响其它中断源的中断。为此,一般在进入中断后,利用1条无条件转移指令,跳转到远离其它中断入口的中断服务主程序入口地址。
常用的主程序结构如下:
ORG 0000H
LJMP MAIN
ORG 中断入口地址
LJMP INT
ORG ××××H
MAIN:【主程序】
INT:【中断服务程序】
注意:在一上的主程序结构中,如果有多个中断源,就对应有对各“ORG中断入口地址”,多各“ORG中断入口地址”必须依次由小到大排列。主程序MAIN的起始地址××××H,根据具体情况来安排。(如果使用C++进行编程,应该不用考虑这个问题)。
3 中断服务程序的流程
MCS-51响应中断后,就进入中断服务程序。中断服务程序的基本流程如图9-1所示。

图9-1 中断服务程序的基本流程
下面对有关中断服务程序执行过程中的一些问题进行说明。
(1)线程保护和现场恢复
所谓现场是指中断时刻单片机中某些寄存器和存储器单元中的数据或状态。为了使中断服务程序的执行不破坏这些数据或状态。为了使中断服务程序的执行不破坏这些数据或状态,以免在中断返回后影响主程序的运行,因此要把它们送入堆栈中保存起来,这就是现场保护。现场保护一定要位于中断处理程序的前面。中断处理结束后,在返回主程序前,则需要把保存的现场内容从堆栈中弹出,以恢复那些寄存器和存储单元中的原由内容,这就是现场恢复。现场恢复一定要位于中断处理程序的后面。MCS-51的堆栈操作指令PUSH direct和POP direct,主要是供现场保护和现场恢复使用的。至于要保护哪些内容,应该由用户根据中断处理程序的具体情况来决定。
(2)关中断和开中断
图5-9中保护现场和恢复现场前关中断,是为了防止此时有高一级的中断进入,避免现场被破坏;在保护现场和恢复现场之后的开中断是为了下一次的中断作好准备,也为了允许有更高级的中断进入。这样作的结果是,中断处理可以被打断,但原来的现场保护和现场恢复不允许更改,除了现场保护和现场恢复的片刻外,仍然保持着中断嵌套的功能。
但有的时候,对于一个重要的中断,必须执行完毕,不允许被其它的中断所嵌套。对此可在现场保护之前先关闭中断系统,彻底屏蔽其它中断请求,待中断处理完毕后再开中断。这样,就需要将图9-1中的“中断处理”步骤前后的“开中断”和“关中断”两个过程去掉。
至于具体中断请求源的关与开,可通过CLR或SETB指令清0或置1中断允许寄存器IE中的有关位来实现。
(3)中断处理
中断处理是中断请求中断的具体目的。应用设计者应根据任务的具体要求,来编写中断处理部分的程序。
(4)中断返回
中断服务程序的最后1条指令必须是返回指令RETI,RETI指令是中断服务程序结束的标志。CPU执行完这条指令后,把响应中断时所置1的优先级状态触发器清0,然后从堆栈中弹出栈顶上的2B的断点地址送到程序计数器PC,弹出的第一个字节送入PCH,弹出的第二各字节送入PCL,CPU从断点处重新执行被中断的主程序。
例9-2 根据图9-1的中断服务程序流程,编写出中断服务程序。假设,现场保护只需要将PSW寄存器和累加器A的内容压入堆栈中保护起来。
一个典型的中断服务程序如下:
INT: CLR EA ;CPU关中断
PUSH PSW ;现场保护
PUSH A
SETB EA ;CPU开中断
【中断处理程序段】
CLR EA ;CPU关中断
POP A ;现场恢复
POP PSW
SETB EA ;CPU开中断
RETI ;中断返回,恢复断点
上述程序有几点需要说明的是:
-
1、 本例的现场保护假设仅仅涉及到PSW和A的内容,如果还有其它的需要保护的内容,需要在相应的位置再加几条PUSH和POP指令即可。注意,对堆栈的操作是先进后出,次序不可颠倒。
-
2、中断服务程序中的“中断处理程序段”,应用设计者应根据中断任务的具体要求,来编写这部分中断处理程序。
-
3、如果本中断服务程序不允许被其它的中断所中断。可将“中断处理程序段”前后的“SETB EA”和“CLR EA”两条指令去掉。
-
4、中断服务程序的最后一条指令必须是返回指令RETI,千万不可缺少。它是中断服务程序结束的标志。CPU执行完着跳指令后,返回断点处,从断点处重新执行被中断的主程序。
10 多外部中断源系统设计
MCS-51为用户提供两个外部中断请求输入端和
,实际的应用系统中,两个外部中断请求源往往不够用,需对外部中断源进行扩充。本节介绍如何来扩充外部中断源的方法。
10.1 定时器/计数器作为外部中断源的使用方法
MCS-51有两个定时器/计数器(有关定时器/计数器的工作原理将在下一章介绍),当它们选择为计数器工作模式,T0引脚上发生负跳变时,T0(或T1)计数器加1,利用这个特性,可以把T0(或T1)引脚作为外部中断请求输入引脚,而定时器/计数器的溢出中断TF0(或TF1)作为外部中断请求标志。例如:定时器/计数器T0设置为方式2(自动恢复常数方式)外部计数工作模式,计数器TH0、TL0初始值均为0FFH,并允许T0中断,CPU开放中断,初始化程序如下:
ORG 0000H
AJMP IINI
.
.
.
IINI: MOV TMOD, #06H ;设置T0的工作方式寄存器
MOV TL0, #0FFH ;给计数器设置初值
MOV TH0, #0FFH
SETB TR0 ;启动T0,开始计数
SETB ET0 ;允许T0中断
SETB EA ;CPU开中断
当连接在P3.4(T0引脚)的外部中断请求输入线上的电平发生负跳变时,TL0加1,产生溢出,TF0置1,向CPU发出中断请求,同时TH0的内容0FFH送TL0,即TL0恢复初值0FFH,这样,P3.4相当于跳沿触发的外部中断请求源输入端。对P3.5也可作类似的处理。
10.2 中断和查询结合的方法
若系统中有多个外部中断请求源,可以按它们的轻重缓急进行排队,把其中最高级别的中断源直接接到MCS-51的一个外部中断请求源IR0输入端,其余的外部中断请求源IR1~IR4用线或的办法连到MSC-51的另一个外中断源输入端
,同时还连上P1口,外部中断源的中断请求由外设的硬件电路产生,这种方法原则上可处理任意多个外部中断。例如,5个外部中断源的排队顺序依次为:IR0、IR1、……、IR4,对于这样的中断源系统,可以采用如图10-1所示的中断电路。

图 10-1 中断和查询相结合的外部中断请求源系统
图10-1中的4个外设IR1~IR4的中断请求通过集电极开路的OC门构成线或的关系,它们的中断请求输入均通过传给CPU。无论哪一个外设提出高电平有效的中断请求信号,都会使
引脚的电平变低。究竟是哪个外设提出的中断请求,可通过程序查询P1.0~P1.3引脚上的逻辑电平即可知道。设IR1~IR4这4个中断请求源的高电平可由相应的中断服务程序清0。
的中断服务程序如下:
ORG 0013H ; $\overline{INT1}$ 的中断入口
LJMP INT1
.
.
.
INT1: PUSH PSW ;保护现场
PUSH A
JB P1.0, IR1 ;如P1.0引脚为高,则IR1有中断请求,跳标号IR1处理
JB P1.1, IR2 ;如P1.1引脚为高,则IR2有中断请求,跳标号IR2处理
JB P1.2, IR3 ;如P1.2引脚为高,则IR3有中断请求,跳标号IR3处理
JB P1.3, IR4 ;如P1.3引脚为高,则IR4有中断请求,跳标号IR4处理
INTIR: POP A ;恢复现场
POP PSW
RETI ;中断返回
IR1: 【IR1的中断处理程序】
AJMP INTIR ;IR1中断处理完毕,跳标号INTIR处执行
IR2: 【IR2的中断处理程序】
AJMP INTIR ;IR2中断处理完毕,跳标号INTIR处执行
IR3: 【IR3的中断处理程序】
AJMP INTIR ;IR3中断处理完毕,跳标号INTIR处执行
IR4: 【IR4的中断处理程序】
AJMP INTIR ;IR4中断处理完毕,跳标号INTIR处执行
查询法扩展外部中断源比较简单,但是扩展的外部中断源个数较多时,查询时间稍长。
更多推荐
所有评论(0)