打印
[51单片机]

大家帮忙看看这个程序bug吧,谢谢

[复制链接]
1393|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
samsunghellome|  楼主 | 2013-8-30 15:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 samsunghellome 于 2013-8-30 16:07 编辑

程序如下:
#include<reg52.h>
sbit KEY1=P3^0;  
sbit KEY2=P3^6;  
sbit LED1=P1^0;
sbit LED2=P1^1;
bit Flag=0;//Flag为模块选择标志位
void DelayUs2x(unsigned int t);
void DelayMs(unsigned int t);
static unsigned char i;
static unsigned char j;
bit a;//a为正常模式200ms延时标志位
bit b;//b为儿童模式2秒延时标志位
bit c;//c为儿童模式开灯/关灯控制标志位
void Init_Timer0(void)
{
TMOD|= 0x01;   //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响      
TH0=(65536-50000)/256;       //给定初值,这里使用定时器最大值从0开始计数一直到65535溢出
TL0=(65536-50000)%256;
EA=1;            //总中断打开
ET0=1;           //定时器中断打开
TR0=1;           //定时器开关打开
}
void Init_Timer1(void)
{
TMOD|= 0x10;   //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响      
TH1=(65536-50000)/256;       //给定初值,这里使用定时器最大值从0开始计数一直到65535溢出
TL1=(65536-50000)%256;
EA=1;            //总中断打开
ET1=1;           //定时器中断打开
TR1=1;           //定时器开关打开
}
void main(void)
{
  KEY1=1;
  KEY2=1;
while(1)
{while(!Flag)//开灯模块
{if(KEY1==0)      
  {DelayMs(8);
   if(KEY1==0)//按键1延时去抖
   //while(!KEY1);
   a=1;
   Init_Timer0();        
while(a)
{if(KEY2==0) //2s
   {DelayMs(8);
       if(KEY2==0)   
  LED1=0;
     Flag=1;
  while(!KEY2);//等待按键2释放
  a=0;
   }
}   
  }                                    
  else if(KEY2==0)
  {DelayMs(8);
    if(KEY2==0)  
  if(KEY1==0&&KEY2==0)
   {DelayMs(8);
    if(KEY1==0&&KEY2==0)
    Init_Timer1();
    while(b)
   {
   if(c==0)
    {
    LED1=LED1;
     c=1;
  //Flag=1;
    }
       else if(c==1)
       {LED1=1;
     c=0;
     //Flag=0;
    }
     b=0;
   }
   }
  }
}
  while(Flag)//关灯模块
  {if(KEY2==0)      
    {DelayMs(8);
      if(KEY2==0)//按键2延时去抖
   //while(!KEY2);
   a=1;
   Init_Timer0();      
  while(a)
     {if(KEY1==0)
       {DelayMs(8);
            if(KEY1==0)      
      LED1=1;
   Flag=0;
   while(!KEY1);//等待按键1释放              
        a=0;
    }                        
        }
   
   }
}
}
}     
void DelayUs2x(unsigned int t)
{   
while(--t);
}

void DelayMs(unsigned int t)
{
    while(t--)
{
     //大致延时1mS
     DelayUs2x(245);
  DelayUs2x(245);
}
}
void Timer0_isr(void) interrupt 1 //using 1
{
   TH0=(65536-50000)/256;       //给定初值,这里使用定时器最大值从0开始计数一直到65535溢出
   TL0=(65536-50000)%256;
   i++;
   if(i>4) //200ms
    {i=0;
     a=0; //超过200ms视为无效操作
     LED2=!LED2;}
}
void Timer1_isr(void) interrupt 3 //using 1
{
   TH1=(65536-50000)/256;       //给定初值,这里使用定时器最大值从0开始计数一直到65535溢出
   TL1=(65536-50000)%256;
   j++;      
   if(j>20) //1s
    {j=0;//超过1秒后,启动儿童模式
     b=1;}  
}        

程序bug:儿童模式下:先按按键2并保持导通,再按按键1,1秒后开灯,但是儿童模式关灯时,先按按键2并保持导通,再按按键1,瞬间开灯/熄灯,没有2秒延时,啊啊啊,为什么呀??大家帮帮忙,谢谢!!   

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

43

主题

198

帖子

0

粉丝