将中断优先级最高的XIRQ0直接接到/INT0引脚,其余的XIRQ1~XIRQ4经集电极开路与门(74LS21)电路接到/INT1引脚并分别与P1.0~P1.3相连。当XIRQ1~XIRQ4中有一个或几个有效(为低电平)时,都会通过/INT1引脚向单片机发出中断请求。在/INT1的中断服务程序中依次查询P1.0~P1.3,就可以确定具体是哪个中断源提出中断请求,并根据事先确定的优先级顺序查询P1.0~P1.3的电平状态。当采用图8-3所示的电路时,必须确保外设在产生中断请求信号时为低电平,如果为高电平,需先进行逻辑电平反向处理;此外,当处理器响应中断后,该中断请求信号能切换到高电平状态。 中断系统的运行必须与中断服务程序配合才能正确使用,MCS-51单片机的中断程序处理需要进行以下操。 (1)作设置中断允许控制寄存器IE,允许相应的中断请求源中断。 (2)设置中断优先级寄存器IP,确定并分配所使用的中断源的优先级。 (3)若是外部中断源,还要设置中断请求的触发方式IT1或IT0,以决定采用电平触发方式还是跳沿触发方式。 (4)编写中断服务子程序,处理中断请求。 前三条是对中断进行设置,即中断初始化操作,一般放在主程序的初始化程序段中。 8.2.3 MCS-51单片机中断服务程序的设计 由于各中断入口地址是固定的,而程序又必须先从主程序起始地址0000H执行。所以,在0000H起始地址的几个字节中,要用无条件转移指令,跳转到主程序。另外,MCS-51单片机各中断入口地址之间依次相差8B,中断服务子程序稍长就超过8B,这样中断服务子程序就占用了其他的中断入口地址,影响其他中断源的中断。为此,一般在进入中断后,利用一条无条件转移指令,把中断服务子程序跳转到远离其他中断入口的地址处。例如外部中断0在程序结构上通常采用如下形式: 在以上的主程序结构中,如果有多个中断源,就对应有多个“ORG XXXXH”的中断入口地址,多个“中断入口地址”必须依次由小到大排列。 为了使中断服务程序执行时不破坏其他内存块或寄存器的数据,在进入中断服务程序时应当立即执行数据保护操作,即现场保护,把需要保护的数据压入堆栈中;中断处理结束后,在返回主程序前,再把保护的数据从堆栈中弹出,以恢复那些寄存器和存储器单元中的原有数据,这就是现场恢复。现场恢复一定要位于中断处理程序的后面。MCS-51单片机的堆栈操作指令“PUSH Direct”和“POP Direct”,这里的Direct可以是直接地址,也可以是寄存器。至于要保护哪些内容,需要根据中断处理程序的具体情况来决定。 根据图8-2(b)中断服务程序流程,典型的汇编中断服务程序如下: 其中,“IRQx”代表具体哪个中断服务程序,其书写格式与“ORG IRQx”中的“IRQx”要完全一致。 在该例中,现场保护只有寄存器PSW和A的内容,如果还有其他需要保护的内容,只需要在相应的位置再加几条PUSH和POP指令即可。需要注意的是对堆栈的操作是先进后出,次序不可颠倒。 采用汇编语言编写的中断服务子程序的最后一条指令必须是返回指令RETI,CPU执行完这条指令后,返回断点处,重新执行被中断的主程序。 使用C语言进行MCS-51中断操作时,其程序书写简化了很多,主要是堆栈操作这些代码不会直接出现在C代码中,而中断初始化可以直接对寄存器或控制位赋值即可,如外部中断1的初始化函数Init_EIrq1()可以如下书写: void Init_EIRQ1() { EA=0; //关总中断 IT1=1; //设置外部中断1为边沿触发方式 EX1=1; //外部中断1允许 EA=1; //开总中断 } 而C语言实行MCS-51单片机中断服务程序时,使用interrupt关键字来标识,具体格式如下: ISR_Name interrupt No [using Bank] 确定其标号“No”后会自动生成中断向量,向量计算公式为(8* No+3),这和汇编代码中“ORG xxxxH”指出的绝对地址是相同的。 “using”告诉编译器在进入中断处理服务程序后切换寄存器到哪个工作区(Bank),MCS-51单片机寄存器组只能在第0~3区。using Bank是可选的,如果不需要using的话,编译器会自动选择一组寄存器作为绝对寄存器访问的。下面是采用C语言实现外部中断1服务程序段。 void EIRQ1 (void) interrupt 2 { EX1=0; //关外部中断1 LED=~LED;
原创力文档

文档评论(0)