本帖最后由 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秒延时,啊啊啊,为什么呀??大家帮帮忙,谢谢!!
|