本文主要简单讲解利用51单片机、LCD显示模块等硬件搭建一个可以计时、显示日期的小的电子DIY作品。
硬件资源:
51单片机1个、LCD显示1个、按键2个、蜂鸣器1个、8050三极管2个等。
一、硬件设计
硬件连接图如下:

注意:
51单片机的晶振频率是12MHz的,蜂鸣器电路如下:
为了节能,LCD会自动进入睡眠状态,程序里加的两个按键除了调节时间、日期、定时等功能外,还用于将LCD唤醒。相关电路如下:
硬件在系统里面的作用:
- 51单片机最小系统是主控电路。
- LCD是显示电路,软件设计中(下面会讲)默认显示LCD约5s,然后进入休眠状态以减少能耗
- 蜂鸣器用于定时使用,达到预设的时间后会发出“滴滴”的声音;
- 两个按键是用来调节时间、日期、定时时间、唤醒LCD。
二、软件设计
软件这部分比较复杂,主要讲最复杂的主函数,搞清楚主函数其他的大致也就明白了,主函数如下:
void main()
{
unsigned char k; //记录按键信息,该变量为1说明按键1按下,为2则说明按键2按下
LCDInit(); //初始化LCD
InitTimer(); //初始化定时器1,此函数内开了定时器中断,频率为20Hz
while(1)
{
k = Key_scan(0); //扫描按键的函数
DisplayTime(); //LCD第一行居中显示时间
DisplayDate(); //LCD第二行居中显示日期(年月日)
switch(k) //如果有按键按下,进入设置日期或年月日状态
{
case 2: md++; if(md==8) md = 0; DisplayOneChar(0,md/4,md+48);part = 5; break;
case 1: AddNum(md);part = 5; break;
default:break;
}
if(md) //注释1
{
Bla = 0; // 打开LCD开关
}
else
{
Bla = 1; //关闭LCD开关
}
if(md/4) //注释2
{
DisplayOneChar(0,0,' ');
}
else
{
DisplayOneChar(0,1,' ');
}
if(min == setmin&&hur==sethur) //注释3
{
BiBi();
}
}
}
- 注释1,关于变量md,它的值用来辅助调节时分秒、年月日,因为两个中只有一个能增减时分秒、年月日变量的数值,所以用它来辅助编程,如果实在不理解,可以忽略。
- 注释2,上面说了,当调整设置完时间,延时5s后LCD会自动进入休眠状态(part变量就是完成这个任务的),当然只要有按键按下,会一直处于非休眠状态。
- 注释3,当时间达到预设的定时时间时,蜂鸣器“滴滴”一分钟。
void timer() interrupt 1
{
TH0=(65536-50000)/256; //重新赋值
TL0=(65536-50000)%256;
tt++;
// k = Key_scan(1);
if(tt==20)
{
tt = 0;
sec++;
if(part)
part--;
if(!part)
Bla = 1; //超时将关掉LCD
}
}
上面的代码是定时器中断服务程序里的内容,每50ms中断一次,part变量用于倒计时5s进入休眠状态。
void InitTimer(void)
{
tt=0;
TMOD=0X01; //设置定时器1为模式一,即16位计算模式
TH0=(65536-50000)/256; //给计数寄存器赋值,50毫秒时间
TL0=(65536-50000)%256;
EA=1; //开启总中断
ET0=1; //开启定时器0中断
TR0=1;
sec=0;
min = 0;
hur = 0;
yy = 19;
mm = 11;
dd = 15;
DisplayOneChar(6,0,':');
DisplayOneChar(9,0,':');
DisplayListChar(3,1,"20");
DisplayOneChar(7,1,'-');
DisplayOneChar(10,1,'-');
Bla = 1;
md = 0;
part = 5;
}
从2019年11月15日,0时0分0秒开始计时。
关注微信公众号“24K纯学渣”,回复“电子闹钟”即可获取源码。