51单片机中断嵌套及两个中断处理方法

文章目录

  • 前言
  • 一、中断嵌套是什么?
  • 二、两个同级别中断
  • 2.1 中断运行关系
  • 2.2 测试程序
  • 三、两个不同级别中断实现中断嵌套
  • 3.1 中断运行关系
  • 3.2 测试程序
  • 总结

  • 前言

    提示:这里可以添加本文要记录的大概内容:

    课程需要:


    提示:以下是本篇文章正文内容,下面案例可供参考

    一、中断嵌套是什么?

    二、两个同级别中断

    2.1 中断运行关系

    主函数->中断0->主函数
    主函数->中断1->主函数
    主函数->中断0->中断1->主函数
    主函数->中断1->中断0->主函数

    2.2 测试程序

    关键:

       		PX0=0;			//外部中断0为低优先级
       		PX1=0;			//外部中断1为低优先级
    

    代码如下(示例):

    
    #include <reg51.h>
    #define uchar unsigned char
    void Delay(unsigned int i)		//延时函数Delay( )
    {	
      unsigned int j;
      for(;i > 0;i--)		
       for(j=0;j<125;j++)		
      {;}					//空函数
    }
    void  main( )		//主函数
    {
      	uchar display[9]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
                                  //流水灯显示数据组		
    	uchar a;
    
    
    	for(;;)		
    	{
    	  		EA=1;			//总中断允许
    	   		EX0=1;			//允许外部中断0中断
    	   		EX1=1;			//允许外部中断1中断
    	   		IT0=1;			//选择外部中断0为跳沿触发方式
    	   		IT1=1;			//选择外部中断1为跳沿触发方式
    	   		PX0=0;			//外部中断0为低优先级
    	   		PX1=0;			//外部中断1为高优先级
    	for(a=0;a<9;a++)		
    	{						
    	    Delay(500);		//延时
    	   P1=display[a];		//流水灯显示数据送到P1口驱动LED显示
    	 } 	
    
    }
    }
    void int0_isr(void)  interrupt 0  using 0   //外中断0中断函数
    {	
      for(;;)
      {
      	P1=0x0f;		//低4位LED灭,高4位LED亮
      	Delay(400);		//延时
      	P1=0xf0;		//高4位LED灭,低4位LED亮
     	Delay(400);		//延时
      } 							
    }
    
    void int1_isr (void)  interrupt 2  using 1  //外中断1中断函数
    {
      uchar m;
      for(m=0;m<5;m++)			//8位LED全亮全灭5次
      {
      	P1=0;				//8位LED全亮
       	Delay(500);			//延时
       	P1=0xff;			//8位LED全灭
       	Delay(500);			//延时
      }
    }
    

    中断 1无法打断中断0 同级


    三、两个不同级别中断实现中断嵌套

    3.1 中断运行关系

    中断0 高级中断
    中断1 低级中断

    主函数->高级中断->主函数
    主函数->低级中断->主函数
    主函数->低级中断–>高级中断->主函数
    主函数->高级中断->低级中断->主函数

    嵌套:

    主函数->低级中断(执行到一半)->高级中断->低级中断(执行下一半)->主函数

    3.2 测试程序

    关键:

       		PX0=0;			//外部中断0为低优先级
       		PX1=1;			//外部中断1为高优先级
    

    代码如下(示例):

    
    #include <reg51.h>
    #define uchar unsigned char
    void Delay(unsigned int i)		//延时函数Delay( )
    {	
      unsigned int j;
      for(;i > 0;i--)		
       for(j=0;j<125;j++)		
      {;}					//空函数
    }
    void  main( )		//主函数
    {
      	uchar display[9]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
                                  //流水灯显示数据组		
    	uchar a;
    
    
    	for(;;)		
    	{
    	  		EA=1;			//总中断允许
    	   		EX0=1;			//允许外部中断0中断
    	   		EX1=1;			//允许外部中断1中断
    	   		IT0=1;			//选择外部中断0为跳沿触发方式
    	   		IT1=1;			//选择外部中断1为跳沿触发方式
    	   		PX0=0;			//外部中断0为低优先级
    	   		PX1=1;			//外部中断1为高优先级
    	for(a=0;a<9;a++)		
    	{						
    	    Delay(500);		//延时
    	   P1=display[a];		//流水灯显示数据送到P1口驱动LED显示
    	 } 	
    
    }
    }
    void int0_isr(void)  interrupt 0  using 0   //外中断0中断函数
    {	
      for(;;)
      {
      	P1=0x0f;		//低4位LED灭,高4位LED亮
      	Delay(400);		//延时
      	P1=0xf0;		//高4位LED灭,低4位LED亮
     	Delay(400);		//延时
      } 							
    }
    
    void int1_isr (void)  interrupt 2  using 1  //外中断1中断函数
    {
      uchar m;
      for(m=0;m<5;m++)			//8位LED全亮全灭5次
      {
      	P1=0;				//8位LED全亮
       	Delay(500);			//延时
       	P1=0xff;			//8位LED全灭
       	Delay(500);			//延时
      }
    }
    
    

    中断 1能打断中断0 不同级

    总结

    同级别不能中断嵌套,不同级别实现中断嵌套

    作者:Winner1300

    物联沃分享整理
    物联沃-IOTWORD物联网 » 51单片机中断嵌套及两个中断处理方法

    发表回复