微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > C51 中断 如何 快速反应

C51 中断 如何 快速反应

时间:10-02 整理:3721RD 点击:
最近没事折腾下C51,看到,下面这段程序,//stc11f01单片机,12m晶振,rst用作p3.6
//爆闪灯,多种模式,带数码管显示
    #include <reg51.h>
    sbit  out_1=P3^7;     //爆闪输出1
    sbit out_2=P1^1;     //爆闪输出2
    sbit  out_3=P1^5;     //爆闪输出3
    sbit out_4=P1^7;     //爆闪输出4
    sbit a=P1^2;         //数码管段位a
    sbit b=P1^6;         //数码管段位b
    sbit c=P3^6;         //数码管段位c
    sbit d=P3^0;         //数码管段位d
    sbit e=P3^1;         //数码管段位e
    sbit f=P1^0;         //数码管段位f
    sbit g=P3^4;            //数码管段位g
//unsigned int f=2000;
unsigned int cnt,cout,l,v,m,t;    //定义变量
void delay (unsigned int k)        //延时程序
{
  unsigned int i,j;
  for (i=0;i<k;i++)
    {
      for (j=0;j<=121;j++)
      {;}  
  }

}
void init(void)                  //初始化
{
   PX1=1;
   EX1 =1;
   IT1 =1;
   EA=1;
}

void extern_int1(void)  interrupt 2      //中断按键检测
{
delay(35);
cout++;
if(cout==9)
{
cout=0;
}

}
void IN_SYSTEM_init(void)//定时器初始化
{
   TMOD = 0X11;
    TH1=-(30000/256);
   TL1=-(30000/256);
   ET1=1;
   TR1=1;
    TH0=-(30000/256);
   TL0=-(30000/256);
   ET0=1;
   TR0=1;
   EA=1;  
}
//***********************************************定时器0中断服务函数
void time0_int (void) interrupt 1
{
   TH0=-(30000/256);
   TL0=-(30000%256);
  out_1= ~out_1;
   out_2=~out_2;
  }
//***************************************************定时器1中断服务函数
void time1_int (void) interrupt 3
{
  TH1=-(30000/256);
   TL1=-(30000%256);
  out_3=~out_3;
  out_4=~out_4;
  }
//****************************************************
void k_1(void)               //按键切换
{      
   switch(cout)
     {
//****************************************************   
//**************************************************** 第一种变化,交替闪
  case 1:
  a=b=c=d=e=f=g=1;
  b=c=0;
  delay(200) ;
EX1 =0;
for(cnt=0;cnt<=15;cnt++)
{
out_1=out_2=out_3=out_4=1;
TR1=1;
TR0=0;
delay(80);
}

for(cnt=0;cnt<=15;cnt++)
{
out_1=out_2=out_3=out_4=1;
  TR1=0;
TR0=1;
  delay(80);
}

  EX1 =1;
break;
        //------------------------------------------2渐快闪      
    case 2:
    a=b=c=d=e=f=g=1;
    a=b=d=e=g=0;
   EX1 =0;
        m+=10;  
            if(m>150)  {  m=0; }  
             for(t=0;t<=23;t++)
              {
                TR1=0;
                 TR0=1;         
                    out_1=out_2=out_3=out_4=1;
               delay(150-m);      
             }
           delay(150-m);
           for(t=0;t<=23;t++)
            {    TR1=1;
                 TR0=0;
               out_1=out_2=out_3=out_4=1;
                delay(150-m);
            }
        EX1 =1;     
           break;

//**************************************************** 3快全闪,
    case 3:
    a=b=c=d=e=f=g=1;
    a=b=c=d=g=0;     
EX1 =0;
             for(t=0;t<=20;t++)
               {
                 TR1=1;
                TR0=1;
          delay(100);
               }
               TR1=0;
               TR0=0;
                out_1= 1;
                out_2=1;
                out_3=1;
                out_4=1;
         delay(1000);
      EX1 =1;
    break;
//****************************************************4慢全闪
    case 4:
     a=b=c=d=e=f=g=1;
     b=c=f=g=0;
      EX1 =0;
    for(t=0;t<=20;t++)
               {
                 TR1=1;
                TR0=1;
          delay(100);
               }
               TR1=0;
               TR0=0;
                out_1= 1;
                out_2=1;
                out_3=1;
                out_4=1;
         delay(2500);
      EX1 =1;
   break;
//****************************************************5全闪
  case 5:
      a=b=c=d=e=f=g=1;
    a=c=d=f=g=0;
      EX1 =0;
  TR1=1;
                TR0=1;
                 delay(150);

   EX1 =1;
break;  
//****************************************************6交替闪再全闪   
case 6:
a=b=c=d=e=f=g=1;
a=c=d=e=f=g=0;
EX1 =0;
         for(l=0;l<=3;l++)
         {
           for(cnt=0;cnt<=13;cnt++)
           {    out_1=out_2=out_3=out_4=1;
             TR1=0;
             TR0=1;
             delay(150);
            }
           for(cnt=0;cnt<=13;cnt++)
           {
                    out_1=out_2=out_3=out_4=1;
                TR1=1;
                 TR0=0;
                delay(150);
           }
       }
   for(v=0;v<=3;v++)
   {
        for(cnt=0;cnt<=10;cnt++)
{
TR1=1;
TR0=1;
delay(150);
}
TR1=0;
TR0=0;
               out_1= 1;
                out_2=1;
                out_3=1;
                out_4=1;

delay(1000);
   }
  EX1 =1;
   break;

//***************************************************7流水闪烁
case 7:
a=b=c=d=e=f=g=1;
a=b=c=0;
EX1 =0;               
                   TR1=0;
                 out_1=out_2=out_3=out_4=1;
                  TR0=0;
         for(t=0;t<=13;t++)
              {     
             out_4= ~out_4;
             delay(100);      
               }     
         for(t=0;t<=13;t++)
              {
              out_3= ~out_3;
              delay(100);      
               }        
         for(t=0;t<=13;t++)
              {                                   
             out_2= ~out_2;
             delay(100);      
               }
         for(t=0;t<=13;t++)
              {                                   
               out_1= ~out_1;
               delay(100);      
               }
EX1 =1;
             break;
             //****************************************************8左右交替长闪
    case 8:
     a=b=c=d=e=f=g=1;
     a=b=c=d=e=f=g=0;
  EX1 =0;
   for(cnt=0;cnt<=15;cnt++)
{
out_1=out_2=out_3=out_4=1;
  TR1=1;
  TR0=0;
delay(300);
}
for(cnt=0;cnt<=15;cnt++)
{
  out_1=out_2=out_3=out_4=1;
   TR1=0;
   TR0=1;
  delay(300);
}
EX1 =1;
    break;
//****************************************************0全灭
      case 0:
         a=b=c=d=e=f=g=1;
        EX1 =0;         
               out_1=out_2=out_3=out_4=1;
            TR1=0;
             TR0=0;
        EX1 =1;
          break;
       }
     }

//**************************************************** 主程序
void main (void)
{  
init();
IN_SYSTEM_init();
while (1)
   {
k_1();
}  
}

///////////////////////////////////////////////
程序有的地方可以借鉴,求助一个问题,这个程序在按键切换后,程序不能立即能切换到需要的位置,感觉好像要等该段程序结束后才会跳转到下一个。

请教下怎么改进。


Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top