继电器开启时1602显示时间停止 怎么解决 谢谢大侠们!
时间:10-02
整理:3721RD
点击:
问题在红色部分:
while(1)
{
if(B1==0&BEEP==1) //手动喂食
{
BEEP=0;
delay1(3000);// 当这里暂停10秒时 1602显示的时间会静止,当暂停结束后时间直接增加10秒显示 ,怎么解决呢?
BEEP=1;
}
if(B2==0&DENG==1) //手动开灯
{DENG=0;delay1(200);}
if(B2==0&DENG==0) //手动关灯
{DENG=1; write_position(2,16); lcd_wdat(0x20); delay1(200);}
kll:
if(B3==0&BEIDENG==1) //手动开背灯
{BEIDENG=0;delay1(200);}
if(B3==0&BEIDENG==0) //手动关背灯
{BEIDENG=1;write_position(2,16); lcd_wdat(0x20); delay1(200);}
Play_nowtime();读取芯片时间并显示到1602
}
void Play_nowtime()
{
read_nowtime(0x81,init,7); //读出当前时间,读出7个字节
write_position(2,1);
lcd_wdat(((init[2]&0xf0)>>4)+0x30);
write_position(2,2);
lcd_wdat('0'+(init[2]&0x0f)); //读小时
// write_position(2,3);
// lcd_wdat(':');
write_position(2,4);
lcd_wdat('0'+((init[1]&0xf0)>>4));
write_position(2,5);
lcd_wdat('0'+(init[1]&0x0f)); //读分钟
// write_position(2,6);
// lcd_wdat(':');
write_position(2,7);
lcd_wdat('0'+((init[0]&0xf0)>>4));
write_position(2,8);
lcd_wdat('0'+(init[0]&0x0f)); //读秒
write_position(1,1);
lcd_wdat('0'+((init[6]&0xf0)>>4));
write_position(1,2);
lcd_wdat('0'+(init[6]&0x0f)); //读年
// write_position(1,3);
// lcd_wdat('/');
write_position(1,4);
lcd_wdat('0'+((init[4]&0xf0)>>4));
write_position(1,5);
lcd_wdat('0'+(init[4]&0x0f)); //读月
// write_position(1,6);
// lcd_wdat('/');
write_position(1,7);
lcd_wdat('0'+((init[3]&0xf0)>>4));
write_position(1,8);
lcd_wdat('0'+(init[3]&0x0f)); //读日
write_position(1,15);
lcd_wdat('0'+(init[5]&0x0f)); //读周
flash();
}
2.在main
函数中 怎么实现无按键10秒后 BEIDENG=1(就是无操作10秒后 1602背景灯关闭(1602背景接地端接P2.2口)
while(1)
{
if(B1==0&BEEP==1) //手动喂食
{
BEEP=0;
delay1(3000);// 当这里暂停10秒时 1602显示的时间会静止,当暂停结束后时间直接增加10秒显示 ,怎么解决呢?
BEEP=1;
}
if(B2==0&DENG==1) //手动开灯
{DENG=0;delay1(200);}
if(B2==0&DENG==0) //手动关灯
{DENG=1; write_position(2,16); lcd_wdat(0x20); delay1(200);}
kll:
if(B3==0&BEIDENG==1) //手动开背灯
{BEIDENG=0;delay1(200);}
if(B3==0&BEIDENG==0) //手动关背灯
{BEIDENG=1;write_position(2,16); lcd_wdat(0x20); delay1(200);}
Play_nowtime();读取芯片时间并显示到1602
}
void Play_nowtime()
{
read_nowtime(0x81,init,7); //读出当前时间,读出7个字节
write_position(2,1);
lcd_wdat(((init[2]&0xf0)>>4)+0x30);
write_position(2,2);
lcd_wdat('0'+(init[2]&0x0f)); //读小时
// write_position(2,3);
// lcd_wdat(':');
write_position(2,4);
lcd_wdat('0'+((init[1]&0xf0)>>4));
write_position(2,5);
lcd_wdat('0'+(init[1]&0x0f)); //读分钟
// write_position(2,6);
// lcd_wdat(':');
write_position(2,7);
lcd_wdat('0'+((init[0]&0xf0)>>4));
write_position(2,8);
lcd_wdat('0'+(init[0]&0x0f)); //读秒
write_position(1,1);
lcd_wdat('0'+((init[6]&0xf0)>>4));
write_position(1,2);
lcd_wdat('0'+(init[6]&0x0f)); //读年
// write_position(1,3);
// lcd_wdat('/');
write_position(1,4);
lcd_wdat('0'+((init[4]&0xf0)>>4));
write_position(1,5);
lcd_wdat('0'+(init[4]&0x0f)); //读月
// write_position(1,6);
// lcd_wdat('/');
write_position(1,7);
lcd_wdat('0'+((init[3]&0xf0)>>4));
write_position(1,8);
lcd_wdat('0'+(init[3]&0x0f)); //读日
write_position(1,15);
lcd_wdat('0'+(init[5]&0x0f)); //读周
flash();
}
2.在main
函数中 怎么实现无按键10秒后 BEIDENG=1(就是无操作10秒后 1602背景灯关闭(1602背景接地端接P2.2口)
继电器的开启时间较长时,不能这样简单的延时,这样延时要占用CPU,cpu一直在执行延时,当然不会刷新你的时间显示,使用定时器控制继电器的开启时间,这样延时不占用cpu资源。
无操作10秒后,使背景灯关闭,同样要使用定时器,设置一个标志位,任何一次操作后,定时器开始计时,时间到达10秒,中断程序中把标志位置1,主程序中查询这个标志。
实际程序没有我说的这么简单,还需考虑有操作时把计数清零,但也复杂不了多少,慢慢琢磨吧。
我是菜鸟 请问定时器怎么写啊?
你的程序去哪里找的!
1302时钟程序改的!
我这个是 定时喂鱼食的装置 是自己用的。刚学单片机所以很多都是现抄现卖!
你需要看51单片机关于定时器的内容,定时器的操作实际上很简单,看一看实例就会了。