单片机中断优先级应用案例

控制/MCU

1815人已加入

描述

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

单片机通过硬件电路实现了中断优先级的默认顺序,默认顺序是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()函数。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分