Logo

郎哥编程

中断优先级和中断嵌套

2024-11-13 28

若单片机同时接收到几个中断请求时,单片机对中断请求的响应顺序是如何确定的?实际上,单片机是通过中断优先级来确定中断响应顺序的。

中断优先级

单片机通过硬件电路实现了中断优先级的默认顺序,默认顺序是INT0,T0,INT1,T1,TI/RI,这5个中断源的中断顺序号依次是0,1,2,3,4,即INT0的中断优先级最高,TI/RI的优先级最低。例如:若INT0,T0,INT1在同一时间发生中断,单片机会首先响应INT0,然后再响应T0。最后响应INT1中断;若单片机正在响应T0中断,此时发生了INT0中断,单片机会暂时停止T0中断处理,先处理INT0中断,INT0中断处理完成后,再继续处理T0中断。

若需要改变默认优先级顺序,可以设置中断优先级寄存器IP,该寄存器可以进行位寻址,通过位来控制不同中断源的优先级,寄存器位定义见下表:

中断优先级寄存器D0和D2位,为外部中断0和1优先级控制位,该位为1定义为高优先级中断,该位为0定义为低优先级中断;中断优先级寄存器D1和D3位,为定时器/计数器0和1优先级控制位,该位为1定义为高优先级中断,该位为0定义为低优先级中断;D4位为串行口优先级控制位,该位为0定义为低优先级中断,该位为1定义为高优先级。

中断嵌套

在51单片机系列中,高优先级的中断能够打断低优先级的中断,形成中断嵌套,即单片机处理完高优先级的中断后,还得回来继续处理低优先级的中断。但同优先级中断之间,或低优先级对高级中断不能形成中断嵌套。当多个中断同时向单片机请求中断响应时,在没有设置中断优先级的情况下,单片机按照默认中断优先级顺序响应中断,若设置了中断优先级,则按照设置顺序响应中断请求。

中断优先级应用案例:在电路中引入三个数码管,分别接单片机P0、P1、P2口。在电路引入两个按键,分别接INT0、INT1引脚,低电平触发中断。设置INT1中断为高优先级,设置INT0中断为低优先级,实验中断嵌套和优先级。

下图是中断优先级应用案例电路设计图:

单片机的P0、P1、P2口接三个共阳极数码管,接入P0口的数码管由主程序控制,接入P1口的数码管由INT1中断处理程序控制,接入P2口的数码管由INT0中断程序控制。单片机的INT0和INT1引脚接入两个按键,用于触发INT0和INT1中断。默认情况下,INT0中断的优先级高于INT1,通过程序将INT0设置为低优先级中断,将INT0设置为高优先级中断。

完整C程序代码如下:

#include <reg51.h>
#include <stdio.h>
unsigned char led[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
void delay(unsigned int millisecond)
{
	unsigned int i,j;
	for(i=millisecond;i>0;i--)
		for(j=120;j>0;j--);
}
void main(void)
 { 
   unsigned int i;
	 EA = 1;
	 EX0 = 1;
	 EX1 = 1;
	 PX1 = 1;
	 while(1)
	 {
		 for(i=0;i<10;i++)
		 {
			P0 = led[i];
			delay(500);
		 }
	 }
 }
 
void t1() interrupt 0
{
   unsigned int i;
	 for(i=0;i<10;i++)
	 {
		P2 = led[i];
		delay(500);
	 }
}
void t2() interrupt 2
{
   unsigned int i;
	 for(i=0;i<10;i++)
	 {
		P1 = led[i];
		delay(500);
	 }
}

t2()函数是INT1中断处理程序,当按下连接INT1引脚的按键后,INT1中断被触发,因为INT1被设置为高优先级,单片机会暂停当前主程序工作或INT0中断处理程序,执行t2()函数,当t2()函数执行完成后,再返回执行主程序工作或INT0中断处理程序。

t1()函数是INT0中断处理程序,由于INT0被设置为低优先级,当INT0中断触发后,若INT1中断正在执行,t1()函数不会被立即执行,需等待t2()函数执行完成后,才会执行t1()函数。

代码在线纠错(通义千问 qwen-max)

支持粘贴多个代码文件,提交后由阿里云通义千问自动分析代码漏洞、语法错误、逻辑问题并给出修改建议。
您已解锁 AI 代码纠错功能,可正常使用!

评论区

登录 后发表评论
暂无评论