[STC单片机] 执行外部中断后怎么不正常返回,执行后蜂鸣器立即就响...

[复制链接]
1519|4
 楼主| xichandoujigu 发表于 2018-1-5 14:04 | 显示全部楼层 |阅读模式
本帖最后由 xichandoujigu 于 2018-1-5 14:25 编辑

外部3.2接了一个按键,测试外部中断用,如果不按按键,数码管显示到5s的时候蜂鸣器就响,能正常运行,在执行外部中断的时候赋值数码管为1秒,按道理执行按键后应该返回主程序继续按照1,2,3,4,5的顺序运行后蜂鸣器响,但实际是一按键蜂鸣器就立即响,为什么呢?                               #include <REG51.H>#define uchar unsigned char  
#define uint  unsigned int  
uchar Count;  
unsigned  int fen_gao;        //分十位
unsigned  int fen_di;        //分个位
unsigned  int miao_gao; //秒十位
unsigned  int miao_di;        // 秒个位
unsigned char Tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

sbit P37=P3^3;
sbit P36=P3^4;
sbit P35=P3^5;
sbit P34=P3^7;
sbit beep=P3^0;
char zhongduan_cnt;

  //10ms延时子程序(12MHZ)
   void delay_ms(void)
      {  
              unsigned char i,j,k;
              for(i=5;i>0;i--)        
                for(j=4;j>0;j--)
                  for(k=248;k>0;k--);
        }

void init()
    {   
          TMOD=0x01; //定时器初始化  选择timer0做16位定时器  
           TH0=(65536-50000)/256;  
           TL0=(65536-50000)%256;     
            EA=1;    //开放中断
            ET0=1;  //开放timer0中断  
            TR0=1;  //启动timer0  
            EX0=1;// 按键外部中断用
             IT0=1; // 按键外部中断用
    }

void display(unsigned int fen_gao,fen_di,miao_gao,miao_di)
    {
          P1 = 0X00;
           P37=0;  
           P1=Tab[fen_gao];
           delay_ms() ;
           P37=1;

           P1 = 0X00;
           P36=0;  
           P1=Tab[fen_di];
           delay_ms() ;
           P36=1;

           P1 = 0X00;
           P35=0;  
           P1=Tab[miao_gao];
           delay_ms() ;
           P35=1;

           P1 = 0X00;
           P34=0;  
           P1=Tab[miao_di];
           delay_ms() ;
           P34=1;
    }

void Delay_beep(char x)
     {   char t;   while(x--) for(t=0;t<120;t++);  }   //按周期t发音

void Play(char t)
     {    char i;   for(i=0;i<100;i++)  {   beep=~beep;  Delay_beep(t);  }   beep=0;  }  


void timer0(void) interrupt 1 using 1
    {
           TH0  = (65536-50000)/256;  
          TL0 |= (65536-50000)%256;   
          zhongduan_cnt++;  
    }


void is_key(void) interrupt 0 using 1
   {
      miao_di=1;
      miao_gao=0;
      fen_di=0 ;
      fen_gao==0 ;        //执行完后beep立即开始响了!
}

  /*********主程序********************/
void main()
  {
       beep=0;
       miao_di=0;
       miao_gao=0;
       fen_di=0;
       fen_gao=0;
       zhongduan_cnt=0;

       P35=0;  
       P37=0;
       P34=0;
       P36=0;

       init();

          while(1)
             {
                   if(zhongduan_cnt>19) //如果到了1S
                        {
                            zhongduan_cnt=0; //清零
                            miao_di++; //秒数累加
                         }

        if (miao_di>9)
          {
              miao_gao=miao_gao+1;
              miao_di=0;
           }

       if (miao_gao>5)
          {
             fen_di=fen_di+1;
             miao_gao=0;
            }

        if (fen_di>9)
          {
             fen_gao=fen_gao+1;
             fen_di=0;
           }

        display(fen_gao,fen_di,miao_gao,miao_di);

            if(miao_di==5)         //5秒开始响
             if(miao_gao==0)
              if(fen_di==0)
               if (fen_gao==0)
                    {
                       while(1)
                        {  Play(1); }
                     }

                  }
      }



caijie001 发表于 2018-1-5 14:11 | 显示全部楼层
  1. while(1)
  2. {

  3.         if(zhongduan_cnt>19) //如果到了1S
  4.             {
  5.                 zhongduan_cnt=0; //清零
  6.                  miao_di++; //秒数累加
  7.             }

  8. if (miao_di>9)
  9. {
  10.     miao_gao=miao_gao+1;
  11.     miao_di=0;}

  12. if (miao_gao>5)
  13. {
  14.    fen_di=fen_di+1;
  15.    miao_gao=0;
  16. }

  17. if (fen_di>9)
  18. {
  19.   fen_gao=fen_gao+1;
  20. fen_di=0;}

  21. display(fen_gao,fen_di,miao_gao,miao_di);

  22. if         (miao_di==5)         //5秒开始响
  23.   if         (miao_gao==0)
  24.    if         (fen_di==0)
  25.     if         (fen_gao==0)
  26.         {
  27.         while(1)
  28.         {
  29.                 Play(1);  
  30.         }
  31.         }

  32.                 }
你这了是、while(1)

{
xxxxxxxxxx
xxxxxxx
xxxx
whlie(1)
{
Play(1);  
}
}
请问怎么跳出循环?
 楼主| xichandoujigu 发表于 2018-1-5 14:28 | 显示全部楼层
我考虑是到时间蜂鸣器响,时间到,然后关闭电源。
ningling_21 发表于 2018-1-5 15:19 | 显示全部楼层
流程不清晰,逻辑有点乱
zqx1000 发表于 2018-4-10 21:25 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

31

主题

96

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部