控制/MCU
若单片机同时接收到几个中断请求时,单片机对中断请求的响应顺序是如何确定的?实际上,单片机是通过中断优先级来确定中断响应顺序的。
单片机通过硬件电路实现了中断优先级的默认顺序,默认顺序是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
#include
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()函数。
全部0条评论
快来发表一下你的评论吧 !