单片机原理及应用:中断嵌套

发布时间:2024年01月10日

?中断嵌套是指中断系统正在执行一个中断服务时,有另一个优先级更高的中断提出中断请求,这时会暂时终止当前正在执行的级别较低的中断源的服务程序,去处理级别更高的中断源,待处理完毕,再返回到被中断了的中断服务程序继续执行的过程。 ??

中断嵌套可以让单片机能够处理多个优先级不同的事件或情况。当高优先级的中断被触发时,可以立即响应并处理,而不用等待低优先级中断处理完毕。当高优先级中断处理完毕后,再回到低优先级中断处理程序继续执行。

在单片机中,中断嵌套的实现通常需要注意中断优先级的设置和中断使能的控制,以确保高优先级中断能够打断正在执行的低优先级中断。同时,中断嵌套还需要注意保存和恢复上下文的操作,以确保各个中断处理程序之间的数据不会被覆盖或混乱。

下面笔者以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

感谢观看,明天会介绍定时器/计数器的相关功用。?

文章来源:https://blog.csdn.net/qq_62530454/article/details/135507893
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。