-
功能
1.外部放置四个键盘,用于设置不同的投喂时间间隔
2.时间达到设定值,发光二极管以及蜂鸣器工作。
3.距离下次投喂的时间以倒数形式展示在数码管 -
具体思路
为了实现时间计算的精准,这里通过t0。
其次,为了实现倒计时,需要在中断部分进行相应的调整。
最后,我们需要控制蜂鸣器以及LED。 -
实现
本文在Proteus上进行仿真,使用89C51型号的单片机。
第一步:计时准确以及如何实现倒计时:
TMOD|=0x01; //定时计数器0,工作方式1
以及我们需要设置它的初值,在这里,我设置为10ms,循环100次
TH0=0xd8;
TL0=0xf0;
当然,接下来的就是模板化的语句,开中断,设置触发方式等等
EA=1;
ET0=1;
TR0=1;
实现了1ms的初值设置,我们需要在中断部分设置变量,使之实现1s的精确定时。之后,我们需要通过判断经过了多少个1s 来计算 分钟 以及 小时。
void Inter0() interrupt 1
{
TH0=0xd8;
TL0=0xf0;
i++;
if(i==100)
{
i=0;
s--;
if(s==0)
{
if(m==0)
{
if(h==0)
{
react();//当倒计时结束,我们需要点亮LED以及使蜂鸣器工作
}
else if(h!=0)
{
h--;
m=59;
s=59;
}
}
else if(m!=0)
{
m--;
s=59;
}
}
}
}
关于如何使LED以及蜂鸣器工作,这里简单的展示下函数内容:
void react()
{
EA = 0;
buzzer = ~buzzer;
led = 0;//这里看自己的接线是接+5V还是接地。
}
最后,就是如何通过按键来调整倒计时的具体时间:
void keydown()
{
if(key0 == 0) //关闭定时器,进而使数码管显示不变
{
delay(1000);
if(key0 == 0)
{
EA = 0;
led = 1;
buzzer = 1;
}
}
if(key1 == 0) //开启定时器,使数码管显示继续变化
{
delay(1000);
if(key1 == 0)
{
EA = 1;
}
}
if(key2 == 0)
{
delay(1000);
if(key2 == 0)
{
h=3;
m=30;
s=value;
}
}
if(key3 == 0)
{
delay(1000);
if(key3 == 0)
{
h=4;
m=0;
s=value;
}
}
if(key4 == 0)
{
delay(1000);
if(key4 == 0)
{
h=4;
delay(5);
m=30;
delay(5);
}
}
}
这里,我直接设置了几种倒计时方案,没有选择通过某个按键来为小时+1等待,(是因为我在尝试这个方式时,秒的显示一直是乱码,最终没能解决,如果有这方面经验的希望可以分享)
最后的最后,本文的Proteus接线图以及单片机编程已上传至CSDN,如有需要直接搜索 基于51单片机的宠物投喂系统 (免费)