用51单片机和LCD显示模块自制电子闹钟

本文主要简单讲解利用51单片机、LCD显示模块等硬件搭建一个可以计时、显示日期的小的电子DIY作品。

硬件资源:
51单片机1个、LCD显示1个、按键2个、蜂鸣器1个、8050三极管2个等。

一、硬件设计

硬件连接图如下:

注意:
51单片机的晶振频率是12MHz的,蜂鸣器电路如下:
有源蜂鸣器电路

为了节能,LCD会自动进入睡眠状态,程序里加的两个按键除了调节时间、日期、定时等功能外,还用于将LCD唤醒。相关电路如下:
唤醒LCD的电路

因为Proteus中找不到LCD1602A模块,所以只能在这里提醒一下大家,如果硬件方面还有疑问,可以在下面留言。

说明一下这些硬件在这个系统里面发挥什么作用:

  1. 51单片机最小系统是主控电路。
  2. LCD是显示电路,软件设计中(下面会讲)默认显示LCD约5s,然后进入休眠状态以减少能耗
  3. 蜂鸣器用于定时使用,达到预设的时间后会发出“滴滴”的声音;
  4. 两个按键是用来调节时间、日期、定时时间、唤醒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();
			}
		}
}

鉴于“注释x”处的安排比较复杂,这里单独拿出来讲一下:

  1. 注释1,关于变量md,它的值用来辅助调节时分秒、年月日,因为两个中只有一个能增减时分秒、年月日变量的数值,所以用它来辅助编程,如果实在不理解,可以忽略。
  2. 注释2,上面说了,当调整设置完时间,延时5s后LCD会自动进入休眠状态(part变量就是完成这个任务的),当然只要有按键按下,会一直处于非休眠状态。
  3. 注释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秒开始计时。

到这里,基本上就完成了原理讲解,如果需要完整C源码,关注微信公众号“24K纯学渣”,回复“电子闹钟”即可获取。

发布了25 篇原创文章 · 获赞 9 · 访问量 6199

猜你喜欢

转载自blog.csdn.net/qq_42144047/article/details/103221686