中断程序设计思想
中断系统是由硬件构成的,必须有相应的软件配合才能正确使用。设计中断程序需要弄清以下几个方面的问题。
1.中断程序设计的任务
每一个中断程序设计需要考虑许多问题,主要有以下几个任务:
(1)设置中断允许控制寄存器IE,允许或禁止相关中断源。
(2)设置中断优先级寄存器IP,分配所使用中断源的优先级。
(3)若是外部中断源,应设置中断触发方式,决定采用边沿触发方式还是电平触发方式。
以上三条一般放在初始化主程序中。例如,假设允许外部中断1中断,并设定它为高级中断,其他中断源为低级中断,采取边沿触发方式。在主程序中可使用如下指令:
SETB EA
SETB EX1
SETB PX1
SETB IT1
(4)编写中断服务程序,处理中断请求。
2.中断入口地址
中断入口地址和中断源具有一一对应关系,见表5-2。响应中断时,系统自动转入相应的中断入口地址,从入口地址开始执行中断服务程序,直到返回指令RETI为止。
3.采用中断时主程序结构
由于各个中断入口地址是固定的,而程序又必须从主程序起始地址0000 H执行,所以在0000H起始地址的几个字节中,要用无条件转移指令,跳转到主程序。另外,各中断入口地址之间只差8个字节。中断服务程序稍长就超过了8字节,如果将超过8字节的中断服务子程序直接放在中断入口地址处,那么就可能占用了其他的中断入口地址,影响了其他中断源的中断。因此,一般在中断进入后,需要利用一条无条件转移指令,把中断服务程序调转到远离其他中断入口的适当地址。以下为包含T0中断服务子程序的程序结构:
以下是中断服务程序的一些编程技巧:
(1)在中断服务程序入口处置一条无条件转移指令。
(2)软件保护现场,以免现场信息丢失。
1)保护现场和恢复现场前关中断,是为了防止此时有更高一级的中断进入,破坏现场。
2)保护现场和恢复现场后开中断,是为了下一次中断做准备,也为了允许有更高一级的中断进入。
(3)CPU响应完中断后,硬件自动清0中断请求标志,但串行口中断除外。
(4)程序中可以禁止高级中断。
(5)PUSH和POP应成对使用。
(6)以RETI结尾
【例5-3】现有外部中断1提出申请,且中断服务程序中有R0、R1、DPTR、累加器A需保护,当前工作寄存器为0区,试编写程序实现。
解:
编程中应注意以下问题:
(1)在0000H放一条跳转到主程序的跳转指令,这是因为89C51单片机复位后PC的内容为0000H,程序从0000H开始执行,紧接着0003H是中断程序入口地址,故在此中间只能插入一条转移指令。
(2)响应中断时,CPU先自动执行一条隐指令“LCALL 0013H”,而0013H(定时器1溢出中断入口地址)至001BH之间可利用的存储单元不够,故放一条无条件转移指令跳转至INT1。
(3)在中断服务程序的末尾,必须安排一条中断返回指令RETI,使程序自动返回主程序。
设计中断服务程序时,哪些功能应该放在中断程序中,哪些功能应该放在主程序中,这是一个很重要的问题。一般来说,中断服务程序应该做最少量的工作。尽量简化中断程序,把软件的主要代码放入主程序中,仔细考虑各中断之间的关系和每个中断执行的时间,特别要注意那些对同一个数据进行操作的中断服务程序。中断程序中放入的东西越多,它们之间越容易起冲突。