#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秒延时标志位
bit c;//c为儿童模式开灯/关灯控制标志位
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(KEY1==0&&LED1==1) //正常开灯
{DelayMs(2);
if(KEY1==0&&LED1==1)//按键1延时去抖
while(!KEY1);
a=1;
Init_Timer0();
while(a)
{if(KEY2==0)
{DelayMs(2);
if(KEY2==0)
{LED1=0;
a=0;
while(!KEY2);//等待按键2释放
}
}
}
}
/********正常关灯********/
if(KEY2==0&&LED1==0)//正常关灯
{DelayMs(2);
if(KEY2==0&&LED1==0)//按键2延时去抖
while(!KEY2);
a=1;
Init_Timer0();
while(a)
{if(KEY1==0&&KEY2==1)
{DelayMs(2);
if(KEY1==0&&KEY2==1)
{LED1=1;
a=0;
while(!KEY1);//等待按键1释放
}
}
}
}
/********儿童开灯********/
if(KEY2==0&&LED1==1) //儿童开灯
{ DelayMs(2);
if(KEY2==0&&LED1==1)
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)
b=0;
if(KEY1==0&&KEY2==0&&LED1==0)
{Init_Timer1();//定时1s,b=1;
while(b==0);
if(KEY1==0&&KEY2==0&&LED1==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;
}
}
正常模式:k1按下,150ms内按下k2,灯亮
k2按下,150ms内按下k1,灯灭
儿童模式:k2按下之后k1按下,1s后,灯亮
k2按下之后k1按下,1s后,灯灭
正常模式下开灯,儿童模式可以关闭;儿童模式下开的灯,正常模式可以关闭
要求系统运行可靠,不相互干扰,我的不是按键,是红外感应模块,所以去抖时间短。
此程序存在的问题:1、正常模式运行正常。
2、儿童模式可以正常开灯,不可以关灯
3、正常模式开的灯,儿童模式关闭不了
请高手指点指点,谢谢!
|