MCS-51单片机的中断系统
单片机中断技术概述
在任何一款事件驱动型的CPU里面都应该会有中断系统,因为中断就是为响应某种事件而存在的。中断的灵活应用不仅能够实现想要的功能,而且合理的中断安排可以提高事件执行的效率,因此中断在单片机应用中的地位是非常重要的。
单片机中断(Interrupt)是硬件驱动事件,它使得CPU暂停当前的主程序,转而去执行一个中断服务子程序。为了更形象地理解中断,下面以学生上自习时接电话为例阐述一下中断的概念。
单片机的中断系统有5个中断源、2个中断优先级,可实现两级中断服务程序嵌套。
如果单片机没有中断系统,单片机的大量时间可能会浪费在查询是否有服务请求发生的定时査询操作上。采用中断技术完全消除了单片机在査询方式中的等待现象,大大地提高了单片机的工作效率和实时性。
单片机中断系统结构及中断控制
中断系统结构图如图5-2所示。
由图5-2可见,MCS-51中断系统共有5个中断请求源:
- INT0——外部中断请求0,中断请求信号由INT0引脚输入。
- 定时/计数器T0计数溢出发出的中断请求。
- INT1——外部中断请求1,中断请求信号由INT1引脚输入。
- 定时/计数器T1计数溢出发出的中断请求。
- 串行口中断请求。
中断优先级从高到底排列。
单片机如何知道有中断请求信号?是否能够响应该中断?若5个中断源请求信号同时到来,单片机如何响应?这些问题都可以由中断寄存器来解决。
单片机中断寄存器有中断标志寄存器TCON和SCON、中断使能寄存器IE和中断优先级寄存器IP,这些寄存器均为8位。
中断标志寄存器
5个中断请求源的中断请求标志分别由TCON和SCON的相应位锁存,单片机通过这些中断标志位的状态便能知道具体是哪个中断源正在申请中断。
TCON寄存器
TCON寄存器为定时/计数器的控制寄存器,字节地址为88H,可位寻址。特殊功能寄存器TCON的格式如图5-3所示。
TCON各标志位功能如下。
- TF1——定时/计数器T1的溢出中断请求标志位。当T1计数产生溢出时,由硬件使TF1置“1”,向CPU申请中断。CPU响应TF1中断时,TF1标志由硬件自动清“0”,TF1也可由软件清“0”。
- TF0——定时/计数器T0的溢出中断请求标志位,功能与TF1类似。
- IE1——外部中断请求1的中断请求标志位。
- IE0——外部中断请求0的中断请求标志位,功能与IE1类似。
- IT1——选择外部中断请求1为跳沿触发还是电平触发。IT1=0,电平触发方式,引脚上低电平有效,并把IE1置“1”。转向中断服务程序时,由硬件自动把IE1清“0”。IT1=1,跳沿触发方式,加到引脚上的外部中断请求输入信号电平从高到低的负跳变有效,并把IE1置“1”。转向中断服务程序时,由硬件自动把IE1清“0”。
- IT0——选择外部中断请求0为跳沿触发方式还是电平触发方式,其意义与IT1类似。
MCS-51复位后,TCON被清“0”,5个中断源的中断请求标志均为0。TRI (D6位)、TRO (D4位)这两位与中断系统无关。
SCON寄存器
SCON寄存器为串行口控制寄存器,字节地址为98H,可位寻址。
低二位锁存串行口的发送中断和接收中断的中断请求标志TI和RI,格式如图5-4所示。
各标志位的功能如下。
- TI——串行口的发送中断请求标志位。每发送完一帧串行数据后,TI自动置“1”。TI标志必须由软件清“0”。
- RI——串行口接收中断请求标志位。串行口接收完一个串行数据帧,硬件自动使RI中断请求标志置“1”。必须在中断服务程序中用指令对RI清“0”。
中断使能寄存器IE
MCS-51对各中断源的使能或屏蔽是由中断使能寄存器IE控制的。IE字节地址为A8H,可位寻址,格式如图5-5所示。
IE对中断的使能和屏蔽实现两级控制。一个总的使能中断控制位EA (IE,7位),EA=0时,所有的中断请求被屏蔽;EA=1时,使能中断,但5个中断源的中断请求是否允许,还要由IE中的低5位所对应的5个中断请求允许控制位的状态来决定(见图5-5)。
IE中各位功能如表5-1所示。
MCS-51复位以后,IE被清“0”,所有中断请求被禁止。IE中与各个中断源相应的位可用指令置“1"或清“0”。若使某一个中断源被允许中断,除了 IE相应的位被置“1”外,还必须使EA位置“1”。改变IE的内容,可由位操作指令来实现(即SETB bit; CLR bit),也可用字节操作指令实现。
中断优先级寄存器IP
MCS-51的中断请求源有两个中断优先级,由软件可设置为高优先级中断或低优先级中断,可实现两级中断嵌套。
当几个中断同时向CPU发出中断请求时,CPU会根据这些中断的优先级来安排处理的顺序,优先级高的先处理,优先级低的后处理。单片机的CPU正在处理一个低优先级的中断,此时有一个高优先级的中断信号到来,CPU会暂停处理该低优先级中断,转而去处理高优先级的中断,处理完高优先级中断后返回继续处理低优先级中断。
也就是说,MCS-51正在执行低优先级中断的服务程序时,可被高优先级中断请求所中断,待高优先级中断处理完毕后,再返回低优先级中断服务程序。两级中断嵌套的过程如图5-6所示。各中断源的中断优先级关系,可归纳为两条基本规则:
- 低优先级可被高优先级中断,高优先级不能被低优先级中断。如果某一中断源被设置为高优先级中断,则不能被任何其他的中断源的中断请求所中断。
- 任何一种中断一旦得到响应,不会再被它的同级中断源所中断。
中断优先级寄存器IP,其字节地址为B8H,可位寻址。只要用程序改变其内容,即可进行各中断源中断优先级的设置。IP寄存器的格式如图5-7所示。
中断优先级控制寄存器IP用位操作指令或字节操作指令可更新IP的内容,以改变中断优先级。MCS-51复位以后,IP的内容为0,各个中断源均为低优先级中断。在同时收到几个同优先级的中断请求时,哪一个中断请求能优先得到响应,取决于内部的査询顺序。其査询顺序见表5-3。
由此可见,各中断源在同一个优先级的条件下,外部中断0的中断优先权最高,串行口中断优先权最低。
中断响应及中断处理过程
中断响应
中断请求被响应,必须满足以下必要条件。
- 总中断允许开关接通,即IE寄存器中的中断总允许位EA=1。
- 该中断源发出中断请求,即对应的中断请求标志为“1”。
- 该中断源的中断允许位置1,即该中断被允许。
- 无同级或更高级别的中断正在被服务。
当CPU査询到有效的中断请求时,在满足上述条件的情况下,紧接着就响应该中断。
中断响应的过程:首先由硬件自动生成一条长调用指令“LCALL addrl6"。addrl6就是程序存储区中相应的中断入口地址。
例如:对于外部中断0的响应,硬件自动生成的长调用指令为LCALL 0003H
然后将程序计数器PC的内容压入堆栈以保护断点,再将中断入口地址装入PC,使程序转向响应中断请求的中断入口地址。
各中断源服务程序的入口地址如表5-4所示。
两个中断入口间只相隔8B,难以安放一个完整的中断服务程序。因此,通常在中断入口地址处放置一条无条件转移指令,使程序执行转向中断服务程序入口。
中断处理
中断响应是有条件的,当遇到下列三种情况之一时,中断响应被封锁。
- CPU正在处理同级或更高级的中断。
- 所査询的机器周期不是当前正在执行指令的最后一个机器周期。只有在当前指令执行完毕后,才能进行中断响应,以确保当前指令执行的完整性。
- 正在执行的指令是RETI或是访问IE或IP的指令。因为按照MCS-51中断系统的规定,在执行完这些指令后,需要再执行完一条指令,才能响应新的中断请求。
如果存在上述三种情况之一,CPU将丢弃中断査询结果,不能对中断进行响应。
如果中断标志有效时没有响应,中断之后将不再保持该标志,每次查询周期都会更新中断标志。
当中断服务程序执行到RETI指令时通知处理器中断程序已执行完毕,然后从堆栈弹出两个字节(程序中断处的地址)重新装入PC,继续执行被中断的程序。
中断返回
中断返回指令:RETI = RET指令+通知CPU中断服务已结束。
注意:RET指令也以返回被中断的程序,但这样会使中断系统认为中断仍在执行,后面的中断再也无法响应。
中断服务程序
中断系统的运行必须与中断服务子程序配合才能正确使用。
设计中断服务子程序需要首先明确以下几个问题。
中断服务子程序设计的任务
任务有下列4条。
- 设置中断允许控制寄存器IE,允许相应的中断请求源中断。
- 设置中断优先级寄存器IP,确定所使用的中断源的优先级。
- 若是外部中断源,还要设置中断请求的触发方式,决定釆用电平触发方式还是跳沿触发方式。
- 编写中断服务子程序,处理中断请求。
前3条一般放在主程序的初始化程序段中。
采用中断时的主程序结构
程序必须先从主程序起始地址0000H执行。所以,在0000H起始地址的几个字节中,用无条件转移指令,跳向主程序。
另外,各中断入口地址之间依次相差8B,中断服务子程序稍长就超过8B,这样中断服务子程序就占用了其他的中断入口地址,影响其他中断源的中断处理。为此,一般在进入中断后,用一条无条件转移指令,把中断服务子程序跳转到远离其他中断入口的入口地址处。
常用的主程序结构如下。
ORG:指定一个地址,后面的程序或数据从这个地址值开始分配。
LJMP:无条件转移指令。
注意:如果有多个中断源,就有多个“ORG X1X2X3X4H”的入口地址,多个“中断入口地址”必须依次由小到大排列,否则会发生地址重叠情况。主程序MAIN的起始地址Y1Y2Y3Y4H根据具体情况来安排,但必须大于串口的中断入口地址0023H。
中断服务子程序的流程
中断服务子程序的基本流程如图5-8所小。下面对有关中断服务子程序执行过程中的一些问题进行说明。
-
现场保护和现场恢复
现场是指单片机中某些寄存器和存储器单元中的数据或状态。为使中断服务子程序的执行不破坏这些数据或状态,要送入堆栈保存起来,这就是现场保护。现场保护一定要位于中断处理程序的前面。中断处理结束后,在返回主程序前,则需要把保存的现场内容从堆栈中弹出恢复原有内容,这就是现场恢复。现场恢复一定要位于中断处理的后面。MCS-51 的堆栈操作指令:“PUSH direct"和 “POP direct”,是供现场保护和现场恢复使用的。要保护哪些内容,应根据具体情况来定。
-
关中断和开中断
现场保护前和现场恢复前关中断,是为防止此时有高一级的中断进入,避免现场被破坏。在现场保护和现场恢复之后的开中断是为下一次的中断做好准备,也为了允许有更高级的中断进入。这样,中断处理可以被打断,但原来的现场保护和现场恢复不允许更改,除了现场保护和现场恢复的片刻外,仍然保持着中断嵌套的功能。但有时候,一个重要的中断必须执行完毕,不允许被其他的中断嵌套。可在现场保护前先关闭总中断开关位,待中断处理完毕后再开总中断开关位。 -
中断处理
应用设计者根据任务的具体要求,来编写中断处理部分的程序。 -
中断返回
中断服务子程序最后一条指令必须是返回指令RETLI。CPU执行完这条指令后,把响应中断时所置1的不可寻址的优先级状态触发器清0,然后从堆栈中弹出栈顶上的两个字节的断点地址送到程序计数器PC,弹出的第一个字节送入PCH,弹出的第二个字节送入PCL,从断点处重新执行主程序。
PC,程序计数器,16位数。
PCL,是其低八位;PCH,是其高八位。
上述程序几点说明:
- 本例的现场保护假设仅仅涉及PSW和A的内容,如有其他需要保护的内容,只需在相应位置再加几条PUSH和POP指令即可。注意,堆栈的操作是先进后岀。
- “中断处理程序段”,设计者应根据中断任务的具体要求,来编写中断处理程序。
- 如果不允许被其他的中断所中断,可将“中断处理程序段”前后的“SETB EA”和“CLR EA”两条指令去掉。
- 最后一条指令必须是返回指令RETL不可缺少,CPU执行完这条指令后,返回断点处,重新执行被中断的主程序。
多外部中断源系统设计
实际的应用中,两个外部中断请求源往往不够用,需对外部中断源进行扩充,如图5-9所示。系统有6个外部中断请求源INTRO〜INTR5,高电平有效。
最高级的请求源INTR0直接接到MCS-51的一个外部中断请求输入端INT0,其余5个请求源INTR1〜INTR5通过各自的OC门(集电极开路门)连到MCS-51的另一个外中断源输入端INT1,同时还连到P1口的P1.4〜P1.0脚,供MCS-51查询。电路如图5-9所示,除了 INTR0优先权级别最高外,其余4个外部中断源的中断优先权取决于查询顺序。
假设图5-9中的5个外设中有一个外设提出高电平有效的中断请求信号,则中断请求通过5个集电极开路OC门的输出公共点,即INT1脚的电平就会变低。究竟是哪个外设提出的请求,要通过程序査询P1.4〜P1.0引脚上的逻辑电平来确定。
本例假设某一时刻只能有一个外设提出中断请求,并设INTR1〜INTR5这5个中断请求源的高电平可由相应的中断服务子程序清“0”,则中断服务子程序如下。
标志寄存器PSW(程序状态字寄存器PSW)
标志寄存器PSW是一个16为的寄存器。它反映了CPU运算的状态特征并且存放某些控制标志。8086使用了16位中的9位,包括6个状态标志位和3个控制标志位。
CF(进位标志位):当执行一个加法(减法)运算时,最高位产生进位(或借位)时,CF为1,否则为0。
ZF零标志位:若当前的运算结果为零,则ZF为1,否则为0。
SF符号标志位:该标志位与运算结果的最高位相同。即运算结果为负,则SF为1,否则为0。
OF溢出标志位:若运算结果超出机器能够表示的范围称为溢出,此时OF为1,否则为0。判断是否溢出的方法是:进行二进制运算时,最高位的进位值与次高位的进位值进行异或运算,若运算结果为1则表示溢出OF=1,否则OF=0PF奇偶标志:当运算结果的最低16位中含1的个数为偶数则PF=1否则PF=0
AF辅助进位标志:一个加法(减法)运算结果的低4位向高4位有进位(或借位)时则AF=1否则AF=0另外还有三个控制标志位用来控制CPU的操作,可以由程序进行置位和复位。
TF跟踪标志:该标志位为方面程序调试而设置。若TF=1,8086/8088CPU处于单步工作方式,即在每条指令执行结束后,产生中断。IF中断标志位:该标志位用来控制CPU是否响应可屏蔽中断。若IF=1则允许中断,否则禁止中断。
DF方向标志:该标志位用来控制串处理指令的处理方向。若DF=1则串处理过程中地址自动递减,否则自动递增。出栈操作,前面应该有PUSH ACC,把ACC寄存器压入堆栈。