#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秒后关灯,程序仅第一次有效,一开一关,之后就没反应了。说明一下,我的不是按键,是红外感应,所以抖动设置的小!
|