理论教育 中断服务程序设计-《单片机原理及接口技术》

中断服务程序设计-《单片机原理及接口技术》

时间:2023-11-05 理论教育 版权反馈
【摘要】:设计中断服务程序需要弄清楚以下几个问题。图5-5中断服务程序的基本流程图下面对有关中断服务程序执行过程中的一些问题进行说明。中断返回中断服务程序的最后1条指令必须是返回指令RETI,RETI指令是中断服务程序结束的标志。3)在中断服务程序的末尾,必须安排一条中断返回指令RETI,使程序自动返回主程序。

中断服务程序设计-《单片机原理及接口技术》

中断系统必须由硬件系统与软件系统相互配合才能正确使用。设计中断服务程序需要弄清楚以下几个问题。

1.中断服务程序设计的任务

中断服务程序设计的基本任务有下列几条:

1)设置中断允许控制寄存器IE,允许相应的中断请求源中断。

2)设置中断优先级寄存器IP,确定并分配所使用的中断源的优先级。

3)若是外部中断源,还要设置中断请求的触发方式IT1或IT0,以决定采用电平触发方式还是跳沿触发方式。

4)编写中断服务程序,处理中断请求。

前3条一般放在主程序的初始化程序段中。

【例5-1】 假设允许外部中断1中断,并设定它为高优先级中断,其他中断源为低优先级中断,采用电平触发方式。

解 在主程序中可编写如下程序段:

2.采用中断时的主程序结构

由于各中断入口地址是固定的,而复位后程序又必须从起始地址0000H执行。所以,在0000H起始地址的几个字节中,要用无条件转移指令,跳转到主程序。另外各中断源入口地址之间依次相差8B。中断服务程序稍长就超过8B,这样中断服务程序就占用了其他的中断入口地址,影响其他中断源的中断。为此,一般在进入中断后,利用1条无条件转移指令,跳转到远离其他中断入口的适当地址去执行中断服务主程序。常用的主程序结构如下:

注意:在以上的主程序结构中,如果有多个中断源,就对应有多个“ORG”中断入口地址,多个“ORG”中断入口地址必须依次由小到大排列。主程序MAIN的起始地址××××H,根据具体情况来安排。

3.中断服务程序的流程

MCS-51响应中断后,就进入中断服务程序。中断服务程序的基本流程如图5-5所示。

图5-5 中断服务程序的基本流程图

下面对有关中断服务程序执行过程中的一些问题进行说明。

(1)现场保护和现场恢复

现场是指中断时刻单片机中某些寄存器和存储器单元中的数据或状态。为了使中断服务程序的执行不破坏这些数据或状态,以免在中断返回后影响主程序的运行,因此要把它们送入堆栈中保存起来,这就是现场保护。现场保护一定要位于中断处理程序的前面。中断处理结束后,在返回主程序前,则需要把保存的现场内容从堆栈中弹出,以恢复那些寄存器和存储器单元中的原有内容,这就是现场恢复。现场恢复一定要位于中断处理程序的后面。MCS-51的堆栈操作指令PUSH direct和POP direct,主要是供现场保护和现场恢复使用的。至于要保护哪些内容,应该由用户根据中断处理程序的具体情况来决定。(www.daowen.com)

(2)关中断和开中断

图5-5中保护现场和恢复现场前关中断,是为了防止此时有高一级的中断进入,避免现场被破坏;在保护现场和恢复现场之后的开中断是为下一次的中断做好准备,也为了允许有更高级的中断进入。这样做的结果是,除了现场保护和现场恢复的片刻外,仍保持着中断嵌套的功能。

但有的时候,对于一个重要的中断,必须执行完毕,不允许被其他的中断所嵌套。对此可在现场保护之前先关闭中断系统,彻底屏蔽其他中断的请求,待中断处理完毕后再开中断。这样,就需要将图5-5中的“处理中断”步骤前后的“开中断”和“关中断”两个过程去掉。

至于具体中断请求源的关与开,可通过CLR和SETB指令清0或置1中断允许寄存器IE中的有关位来实现。

(3)中断处理

中断处理是中断源请求中断的具体目的。应用设计者应根据任务的具体要求,来编写中断处理部分的程序。

(4)中断返回

中断服务程序的最后1条指令必须是返回指令RETI,RETI指令是中断服务程序结束的标志。CPU执行完这条指令后,把响应中断时所置位的优先级状态触发器复位,然后从堆栈中弹出断点地址送到程序计数器PC(弹出的第一个字节送入PC的高8位,弹出的第二个字节送入PC的低8位),CPU从断点处重新执行被中断的主程序。

4.编写中断服务程序应注意的问题

1)各中断源的中断入口地址之间只相隔8个字节,容纳不下较长的中断服务程序,因此,在中断入口地址单元通常存放一条无条件转移指令,可将中断服务程序转至存储器的其他任何空间。

2)若要在执行当前中断程序时禁止其他更高优先级中断,需先用软件关闭CPU中断,或用软件禁止相应高优先级的中断,在中断返回前再开放中断。

3)在保护和恢复现场时,为了不使现场数据遭到破坏或造成混乱,一般规定此时CPU不再响应新的中断请求。因此,在编写中断服务程序时,要注意在保护现场前关中断,在保护现场后若允许高优先级中断,则应开中断。同样,在恢复现场前也应先关中断,恢复之后再开中断。

【例5-2】 现有外部中断1提出申请,且主程序中有寄存器R0、R1、DPTR以及累加器A需要保护,编制程序完成上述操作。

解 程序如下:

程序说明:

1)在0000 H放一条跳转到主程序的跳转指令,这是因为MCS-51单片机复位后,PC的内容变为0000 H,程序从0000 H开始执行,紧接着0003H是中断程序入口地址,故在此中间只能插入一条转移指令,转移到主程序所在的程序空间去执行主程序。

2)响应中断时,先自动执行一条隐指令“LCALL 0013 H”即从0013H单元开始执行程序,而0013H至001BH(定时器/计数器T1溢出中断入口地址)之间可利用的存储单元不够存放一个中断服务程序,故放一条无条件转移指令,转移到外部中断1的中断服务程序所在的程序空间去执行该程序。

3)在中断服务程序的末尾,必须安排一条中断返回指令RETI,使程序自动返回主程序。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈