中断嵌套是指中断系统正在执行一个中断服务时,有另一个优先级更高的中断提出中断请求,这时会暂时终止当前正在执行的级别较低的中断源的服务程序,去处理级别更高的中断源,待处理完毕,再返回到被中断了的中断服务程序继续执行的过程。
中断嵌套可以让单片机能够处理多个优先级不同的事件或情况。当高优先级的中断被触发时,可以立即响应并处理,而不用等待低优先级中断处理完毕。当高优先级中断处理完毕后,再回到低优先级中断处理程序继续执行。
在单片机中,中断嵌套的实现通常需要注意中断优先级的设置和中断使能的控制,以确保高优先级中断能够打断正在执行的低优先级中断。同时,中断嵌套还需要注意保存和恢复上下文的操作,以确保各个中断处理程序之间的数据不会被覆盖或混乱。
下面笔者以LED闪烁为例来演示中断嵌套的应用。
#include <reg51.h>
#define uchar unsigned charuchar display[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
void Delay()
{ unsigned int i,j;for(i=0;i<255;i++) for(j=0;j<255;j++); }
void main( )
{ uchar a; IE=0x85; //设置中断允许寄存器,开启总中断,允许外部中断0和1IT0=0; //外部中断0和1为跳沿触发方式IT1=0; IP=0x04; //设置中断优先级寄存器,外部中断1为高优先级while(1) { for(a=0;a<8;a++) { P1=display[a]; //流水灯 Delay(); }}
}
void int0_isr(void) interrupt 0 //外部中断0中断服务函数
{ uchar m;for(m=0;m<2;m++){P1=0x0f; //高低位交替Delay(); P1=0xf0; Delay(); }
}void int1_isr (void) interrupt 2 //外部中断1中断服务函数
{uchar n;for(n=0;n<2;n++) {P1=0; //全部闪烁Delay(); P1=0xff; Delay(); }
}
建议大家在定义中断函数的时候不指定工作寄存器组,而是让CPU自行分配。笔者在设定using 0的时候恰巧占用了主函数的运算核心,导致中断结束后无法返回主函数,虽然说是比较少见,不过还希望大家不要遇到类似的问题。
仿真如图所示,两个按键一端接地,K1按键连接外部中断0,K2按键连接外部中断1。
不同优先级中断嵌套控制LED
感谢观看,明天会介绍定时器/计数器的相关功用。