中断

作者: 拿着苹果学猪叫 | 来源:发表于2020-07-12 14:46 被阅读0次

    一个外中断的应用

    【例6-1】在单片机P1口上接有8只LED。在外部中断0输入引脚(P3.2)接一只按钮开关K1。要求将外部中断0设置为电平触发。程序启动时,P1口上的8只LED全亮。每按一次按钮开关K1,使引脚接地,产生一个低电平触发的外中断请求,在中断服务程序中,让低4位的LED与高4位的LED交替闪烁5次。然后从中断返回,控制8只LED再次全亮。原理电路及仿真结果见图6-9。

    #include<reg51.h>
    #define uchar unsigned char
    #define uint unsigned int
    //延时函数
    void delay(uint i)
    {
     unsigned int j;
     for(;i>0;i--)
     for(j=0;j<333;j++)//晶振为12MHz,j选择与频率有个
     {;}
    }
    //主函数
    void main()
    {
     EA =1;
     EX0=1;
     IT0=0;
    
     while(1)
     {
           P1=0;
     }
    }
    //中断函数
    void ite() interrupt 0 using 0
    {
    uchar m;
    EX0=0;
    for(m=0;m<5;m++)
    {
       P1=0x0f;
       delay(400);
       P1=0xf0;
       delay(400);
    }
    EX0=1;
    }
    

    两个外中断的应用

    两个外中断的优先级相同

    【例6-2】如图6-10所示,在单片机P1口上接有8只LED。在外部中断0输入引脚(P3.2)接有一只按钮开关K1。在外部中断1输入引脚(P3.3)接有一只按钮开关K2。要求K1和K2都未按下时,P1口的8只LED呈流水灯显示,仅K1(P3.2)按下再松开时,上下各4只LED交替闪烁10次,然后再回到流水灯显示。如果按下再松开K2(P3.3)时,P1口的8只LED全部闪烁10次,然后再回到流水灯显示。设置两个外中断的优先级相同。

    #include <reg51.h>
    #define uchar unsigned char
    #define uint unsigned int 
    //延时函数
    void delay(uint i)
    {
       uchar j;
       for(;i>0;i--)
       for(j=0;j<125;j++)
       {;}
    }
    //主函数
    void main()
    {
       //流水灯
       uchar display[9]= {0xff,0xfe,0xfd,0xf7,0xef,0xdf,0xbf,0xf7f};
       unsigned int a;
      for(;;)//相当于while(1)
       {
          EA =1;
          EX0=1;
          EX1=1;
          IT0=1;
          IT1=1;
          IP=0;//两个外部中断均是低优先级
          for(a=0;a<9;a++)
          {
               delay(500);
               P1=display[a];
           }
        }
    }
    //第一个中断函数
    void int0() interrupt 0 using 1
    {
       uchar m;
       for(m=0;m<10;m++)
       {
           P1=0xf0;
           delay(500);
           P1=0x0f; 
           delay(500); 
        }
    }
    //第二个中断函数
    voide int1() interrupt 1 using 2
    {
       uchar b;
       for(b=0;b<10;b++)
       {
           P1=0x00;
           delay(500);
           P1=0xff;
           delay(500);
        }
    }
    

    两个外中断的优先级不同

    【例6-3】电路见图6-10,设计一中断嵌套程序:要求K1和K2都未按下时,P1口8只LED呈流水灯显示,当按一下K1时,产生一个低优先级外中断0请求(跳沿触发),进入外中断0中断服务程序,上下4只LED交替闪烁。此时按一下K2时,产生一个高优先级的外中断1请求(跳沿触发),进入外中断1中断服务程序,使8只LED全部闪烁。当显示5次后,再从外中断1返回继续执行外中断0中断服务程序,即P1口控制8只LED,上、下4只LED交替闪烁。设置外中断0为低优先级,外中断1为高优先级。

    #include <reg51.h>
    #define uchar unsigned char
    #define uint unsigned int 
    //延时函数
    void delay(uint i)
    {
       uchar j;
       for(;i>0;i--)
       for(j=0;j<125;j++)
       {;}
    }
    //主函数
    void main()
    {
       //流水灯
       uchar display[9]= {0xff,0xfe,0xfd,0xf7,0xef,0xdf,0xbf,0xf7f};
       unsigned int a;
      for(;;)//相当于while(1)
       {
          EA =1;
          EX0=1;
          EX1=1;
          IT0=1;
          IT1=1;
          PX0=0;//外部中断0为低优先级
          PX1=1;//外部中断1为高优先级
          for(a=0;a<9;a++)
          {
               delay(500);
               P1=display[a];
           }
        }
    }
    //第一个中断函数
    void int0() interrupt 0 using 1
    {
       uchar m;
       for(m=0;m<10;m++)
       {
           P1=0xf0;
           delay(500);
           P1=0x0f; 
           delay(500); 
        }
    }
    //第二个中断函数
    voide int1() interrupt 1 using 2
    {
       uchar b;
       for(b=0;b<10;b++)
       {
           P1=0x00;
           delay(500);
           P1=0xff;
           delay(500);
        }
    }
    
    

    定时计数器

    采用12MHz晶振,则计数周期为T=1\mu s

    机器周期=晶振周期 \times 12
    机器周期=12 \times 1 \div12M=1微秒.
    计数器=\frac{50\times 1000 \mu s}{1\mu s} =5000
    初值=65536-5000=15336=3CB0H

    将3C,B0分别预制给TH1,TL1.

    相关文章

      网友评论

          本文标题:中断

          本文链接:https://www.haomeiwen.com/subject/ohugcktx.html