51单片机_电子时钟&电子万年历&电子闹钟

发布时间:2024年01月12日

实物演示效果:

https://www.bilibili.com/video/BV1RN4y1Q7dK/?vd_source=6ff7cd03af95cd504b60511ef9373a1d

二、液晶对比度的调节
液晶的内容要清晰显示,就要调节电位器来调节液晶的对比度,这个电位器位于液
晶的下面,可以用一字螺丝刀等工具进行转动调节。液晶的供电电压不同,显示的对比
度也不同。所以如果是电池盒供电的话,使用一段时间后,电池的电压会降低,液晶显
示的内容也会变模糊,这个时候,就要微调一下这个电位器了;而如果是 USB 供电的话,
由于电压一直稳定,所以只要在初次使用时调节就可以了。
三、时间的设置
1、上电之后,按下“设置时间按键(按键 1)”,就进入了时间设置的模式。
2、这时可以看到光标在年份的位置闪烁,代表现在在调节年份的大小。
3、可以加过“减键(按键 4)”和“加键(按键 5)”两个按键进行大小的调整。
4、设置好年份之后,当再次按下“设置时间按键”,光标就跳到了月份的位置闪烁,代
表现在在调节月份的大小。类似的操作,分别进行年、月、日、星期、小时、分钟、
秒钟的设置。
5、最后设置好秒钟之后,再按一次“设置时间按键”就退出了时间设置模式。
四、闹钟的设置
1、闹钟设置的方法和前面设置时间的方法类似,只不过这里是通过“设置闹钟按键(按
键 2)”进行切换设置选项的,“减键(按键 4)”和“加键(按键 5)”是共用的。
2、如果想启动闹钟,必须在闹钟的设置界面中,把状态设置为“ON”。
3、闹钟的持续报警时间是 1 分钟,1 分钟后会自动关闭闹钟,明天同样的时间会再次
报警。
4、闹钟响的 1 分钟时间里,如果想手动关闭闹钟的话,可以通过“减键”或“加键”
五、秒表的使用
1、按下“秒表模式键(按键 3)”之后,就进入了秒表模式。
2、按下“开始/暂停秒表键(按键 4)”可以在开始和暂停直接切换秒表的工作状态。
3、按下“秒表清零(按键 5)”之后,就可以把之前的计时清零。
4、再按一次“秒表模式键”之后,就退出了秒表模式。
六、几种工作模式的切换说明
1、本设计有 4 种工作模式,万年历模式、设置时间模式、设置闹钟模式、秒表模式。
2、必须回到万年历模式后,才能进入其他模式。比如不能直接从设置闹钟模式进入秒
表模式,而是要先从闹钟模式先退回到万年历模式,再从万年历模式进入秒表模式。
实物图
原理图(Altium Designer)
仿真图(peoteus 8.6)
时间显示界面
设置闹钟界面
部分代码
void main()
{
	int temp;													// 保存温度值
	
	LcdInit();												// 执行液晶初始化	
	DS1302_Init();										// 时钟芯片的初始化
	LcdShowInit();										// 液晶显示内容的初始化
	TimerInit();											// 定时器初始化
	
	if(DS1302_Read_Byte(0x81)>=128)		// 判断时钟芯片是否正在运行
	{
		DS1302_Write_Time();						// 如果没有,则初始化一个时间
	}
	

	Clock_Hour=EEPROM_Read(0x2000);		// 读取0x2000这个地址的内容,赋值给闹钟的小时变量
	if(Clock_Hour>23)									// 如果读取到的闹钟小时数值不正常,则重新赋值
	{
		Clock_Hour=12;
	}
  Clock_Minute=EEPROM_Read(0x2001);	// 读取0x2001这个地址的内容,赋值给闹钟的分钟变量
	if(Clock_Minute>59)								// 如果读取到的闹钟分钟数值不正常,则重新赋值
	{
		Clock_Minute=30;
	}
	Clock_Swt=EEPROM_Read(0x2002);		// 读取0x2002这个地址的内容,赋值给闹钟的开关变量
	if(Clock_Swt>1)										// 如果读取到的闹钟开关数值不正常,则重新赋值
	{
		Clock_Swt=0;
	}
	
	while(DS18B20_ReadTemp()==850)		// 等待温度传感器初始化完成
	{
		DelayMs(10);
	}
	
	while(1)
	{
		DS1302_Read_Time();				// 获取当前时钟芯片的时间,存在数组time_buf中
		FlashTime();							// 刷新时间显示
		ClockJudge();							// 闹钟工作的判断
		
		temp=DS18B20_ReadTemp();	// 读取温度
		LcdGotoXY(1,9);						// 定位到显示温度的地方
		LcdPrintTemp(temp);				// 显示温度

		KeyScanf1();							// 按键扫描(时间的设置)
		KeyScanf2();							// 按键扫描(闹钟的设置)
		KeyScanf3();							// 按键扫描(进入和退出秒表)
		
		DelayMs(100);							// 延时0.1秒
	}
}

文章来源:https://blog.csdn.net/heilong99/article/details/135540001
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。