中断嵌套是指中断系统正在执行一个中断服务时,有另一个优先级更高的中断提出中断请求,这时会暂时终止当前正在执行的级别较低的中断源的服务程序,去处理级别更高的中断源,待处理完毕,再返回到被中断了的中断服务程序继续执行的过程。
中断嵌套可以让单片机能够处理多个优先级不同的事件或情况。当高优先级的中断被触发时,可以立即响应并处理,而不用等待低优先级中断处理完毕。当高优先级中断处理完毕后,再回到低优先级中断处理程序继续执行。
在单片机中,中断嵌套的实现通常需要注意中断优先级的设置和中断使能的控制,以确保高优先级中断能够打断正在执行的低优先级中断。同时,中断嵌套还需要注意保存和恢复上下文的操作,以确保各个中断处理程序之间的数据不会被覆盖或混乱。
下面笔者以LED闪烁为例来演示中断嵌套的应用。
#include <reg51.h>
#define uchar unsigned char
uchar 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和1
IT0=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
感谢观看,明天会介绍定时器/计数器的相关功用。