打印
[51单片机]

这个程序怎么就执行一次呢??

[复制链接]
1304|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
samsunghellome|  楼主 | 2013-9-2 19:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#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为儿童模式1秒延时标志位
void Init_Timer0()
{
TMOD|= 0x01;   //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响      
TH0=(65536-50000)/256;       //给定初值,这里使用定时器最大值从0开始计数一直到65535溢出
TL0=(65536-50000)%256;
EA=1;            //总中断打开
ET0=1;           //定时器中断打开
TR0=1;           //定时器开关打开
}
void Init_Timer1()
{
TMOD|= 0x10;   //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响      
TH1=(65536-50000)/256;       //给定初值,这里使用定时器最大值从0开始计数一直到65535溢出
TL1=(65536-50000)%256;
EA=1;            //总中断打开
ET1=1;           //定时器中断打开
TR1=1;           //定时器开关打开
}
void main()
{
  KEY1=1;
  KEY2=1;
while(1)
{ if(KEY2==0&&LED1==1) //儿童开灯
    { DelayMs(2);
   b=0;      
   if(KEY1==0&&KEY2==0)
    {Init_Timer1();//定时1s,b=1;
     while(b==0);
     if(KEY1==0&&KEY2==0)   
   LED1=0;
   b=0;
  while(KEY1==0&&KEY2==0);
    }      
}  
   /********儿童关灯********/
   if(KEY2==0&&LED1==0) //儿童关灯
    { DelayMs(2);
     if(KEY2==0&&LED1==0)
      while(KEY2==0)
       { b=0;      
       if(KEY1==0&&KEY2==0)
       {Init_Timer1();//定时1s,b=1;
         while(b==0);
     i   f(KEY1==0&&KEY2==0)   
        LED1=1;
        b=0;
      while(KEY1==0&&KEY2==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==3) //超过150ms视为无效操作
    {
     i=0;
  a=0;
  TR0=0;  
}
}
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;
TR1=0;
}  
}  

先按k2,再按k1,1秒后开灯,先按k2,再按k1,1秒后关灯,程序仅第一次有效,一开一关,之后就没反应了。说明一下,我的不是按键,是红外感应,所以抖动设置的小!   

相关帖子

沙发
opal11| | 2013-9-4 22:13 | 只看该作者
这个问题,好像发过了吧。

使用特权

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

本版积分规则

43

主题

198

帖子

0

粉丝