多功能电子时钟说明文档.docx
《多功能电子时钟说明文档.docx》由会员分享,可在线阅读,更多相关《多功能电子时钟说明文档.docx(16页珍藏版)》请在冰豆网上搜索。
![多功能电子时钟说明文档.docx](https://file1.bdocx.com/fileroot1/2022-11/20/af859794-1d5a-4d1e-93d1-875426d824b7/af859794-1d5a-4d1e-93d1-875426d824b71.gif)
多功能电子时钟说明文档
多功能电子时钟
一、功能:
1.基本时钟功能,显示时间、日期、闹钟、秒
显示方式:
1)、时间:
16:
25:
38,秒显示每秒变动一次;
2)、日期:
090709,日期显示有两种,一种是不动显示,一种是与时间交替显示;
3)、闹钟:
06:
28
4)、秒:
:
30,秒前面的“:
”每秒闪一次
2.按键功能:
能通过两个按键来调节时间,日期,闹钟等
3.遥控功能:
能通过遥控器上的两个按键来调节时间,日期,闹钟等
4.红外解码显示功能:
能将解出来的遥控器红外编码通过两种方式显示出来
1)、通过P1口的8个LED灯,用二进制的形式显示出来;
2)、通过LCD1602,用2位数字将解出来的码显示出来;
5.温度显示功能:
能将环境的温度显示出来,精确度为0.1℃;
6.能自动提示人体对环境温度的感知程度,分别为“Cold”、“Warm”、“Hot”,即“冷”、“暖和”、“热”;
7.能自动显示当前闹钟所处的状态,即为开还是关闭状态;
8.当前时间与设定的闹钟时间一致时,闹钟闹响。
并能够通过两个按键或者遥控器止闹;
9.整点报时功能;
10.通过短响一下来判断按键是否按下;
11.将星期作为一个单独的显示,并能通过按键或者遥控器调节;
12.看门狗功能,能够在程序跑飞的情况下将系统自动复位,且从程序跑飞到复位不超过1S钟,与I2C配合,最大程度保证了程序跑飞后
时间的准确性;
二、状态显示转换图:
状态1:
当前时间(16:
25:
38);
备注:
秒显示每秒变动一次;
状态2:
显示日期(090709);
状态3:
显示闹钟(06:
28);
状态4:
显示秒(:
30);
备注:
秒前面的“:
”每秒闪一次
状态5:
交替显示时间和日期;
备注:
每秒切换显示
状态6:
同状态4;
状态7:
调年(09);
备注:
其它内容(如温度、星期、红外解码等)照常显示
状态8:
调月(09);
备注:
其它内容(如温度、星期、红外解码等)照常显示
状态9:
调日(09);
备注:
其它内容(如温度、星期、红外解码等)照常显示
状态10:
调星期
(1);
备注:
为了区别,调星期的时候星期会每秒闪一次
状态11:
调闹钟时(06);
备注:
其它内容(如温度、星期、红外解码等)照常显示
状态12:
调闹钟分(28);
备注:
其它内容(如温度、星期、红外解码等)照常显示
状态13:
调小时(07);
备注:
其它内容(如温度、星期、红外解码等)照常显示
状态14:
调分钟(30);
备注:
其它内容(如温度、星期、红外解码等)照常显示,这时,秒清零,时间暂停
状态15:
显示停(16:
25:
38);
备注:
显示一个停止的时间,这时时间不走了;
三、按键转换图
按键A转换图(红外键A):
1)、1.当前时间->5.交替显示时间和日期->7.调年->8.调月->9.调日->10.调星期->11.调闹钟时->12.调闹钟分->13.调小时->14.调分(停表)->15.显示停->1.当前时间;
2)、4(或6).显示秒->7.调年;
按键B转换图(红外键B):
1)、1.当前时间->2.显示日期->3.显示脑钟->4.显示秒->1.显示时间;
2)、5.交替显示时间和日期->6.显示秒->5.交替显示时间和日期;
3)、7.调年->年加一;
4)、8.调月->月加一;
5)、9.调日->日加一;
6)、10.调星期->星期加一;
7)、11.调闹钟时->闹钟时加一;
8)、12.调闹钟分->闹钟分加一;
9)、13.调小时->小时加一;
10)、14.调分(停表)->分加一,并将秒清零,停表;
四、硬件电路图
五、实际显示效果图
1、硬件组成
2、显示效果
3、遥控调试时间状态下
4、LED用二进制显示当前红外编码状态;
六、主程序:
(程序比较长,整个代码的CODE为4866Byte,是通过多个C文件来实现,通过调用头文件的方式来调用函数,可以再打开Keil工程文件看)
#include"Initial.h"
#include"Display.h"
#include"KeyandSpeaker.h"
/*******************************************************************************
程序说明:
主函数
入口:
无
返回值:
无
备注:
主循环里面的执行时间过长,有一秒一上了,主要是因为LCD只能用延时的方法来跳过查忙,想办法将里面的时间缩短。
********************************************************************************/
voidmain(void)
{
Init_MCU();//初始化MCU
Init_I2C();//初始化I2C
Init_LCD();//初始化LCD1602
Init_Time();//先初始化时间和先读I2C有区别。
先初始化时间:
以后开机的时间是从I2C读出,初始化失效。
//先读I2C:
第一次读出的是乱码,因为I2C里面没有写入想要的数据。
故第一次下载程序到MCU要后初始化MCU
//然后在把顺序改过来,即先初始化MCU,然后读I2C。
//将I2C里面的时间、日期、星期、闹钟等信息先读出来
Second=RandomRead_I2C(0x00);
Delay_Nms
(1);
Minute=RandomRead_I2C(0x01);
Delay_Nms
(1);
Hour=RandomRead_I2C(0x02);
Delay_Nms
(1);
Day=RandomRead_I2C(0x03);
Delay_Nms
(1);
Mounth=RandomRead_I2C(0x04);
Delay_Nms
(1);
Year=RandomRead_I2C(0x05);
Delay_Nms
(1);
Alarm_Hour=RandomRead_I2C(0x06);
Delay_Nms
(1);
Alarm_Minute=RandomRead_I2C(0x07);
Delay_Nms
(1);
Week=RandomRead_I2C(0x08);
Delay_Nms
(1);
//Init_Time();
//主循环
while
(1)
{
WDTRST=0x3c;//由于在按键调节分钟的时候要停定时器2,这时不能在定时器喂狗,故到主程序里喂狗;
SpitTime();//拆分时间数据
SpitDate();//拆分日期数据
SpitAlarm();//拆分闹钟数据
KeyAFunc();//按键A检测函数
KeyBFunc();//按键B检测函数
Display();//显示函数
tmpchange();//温度转换函数,将其与温度读取函数隔远,让其有充足时间转换;
LCD_WriteNChar(13,1,2,"D:
");//在星期前面写入"D:
",以方便辨认;
//LCD_WriteOneChar(15,1,Week+'0');
//闹钟模块
if((Alarm_Hour==Hour)&&(Alarm_Minute==Minute))
{
if(AlarmStopFlag==0)
{
LCD_WriteNChar(5,1,6,"AR:
On");//智能显示当前闹钟状态
Alarm_SP_Fun();//闹响
}
}//闹钟功能
else
{
LCD_WriteNChar(5,1,6,"AR:
Off");
AlarmStopFlag=0;
}
//整点报时模块;
if((Minute==00)&&(Second<1))
{
Pip_SP_Fun();
}
//将时间、日期、星期、闹钟等信息写入I2C;
if(Write_I2C_Flag==1)
{
Write_I2C_Flag=0;
WriteByte_I2C(0x00,Second);
Delay_Nms
(1);
WriteByte_I2C(0x01,Minute);
Delay_Nms
(1);
WriteByte_I2C(0x02,Hour);
Delay_Nms
(1);
WriteByte_I2C(0x03,Day);
Delay_Nms
(1);
WriteByte_I2C(0x04,Mounth);
Delay_Nms
(1);
WriteByte_I2C(0x05,Year);
Delay_Nms
(1);
WriteByte_I2C(0x06,Alarm_Hour);
Delay_Nms
(1);
WriteByte_I2C(0x07,Alarm_Minute);
Delay_Nms
(1);
WriteByte_I2C(0x08,Week);
Delay_Nms
(1);
}
//读取温度
TempValue=tmp();
//拆分温度
temp[0]=TempValue/100+'0';
temp[1]=TempValue%100/10+'0';
temp[3]=TempValue%10+'0';
LCD_WriteNChar(0,1,4,temp);//显示温度
//智能显示环境温度对人体体感模块
if(TempValue>25)
{
LCD_WriteNChar(3,0,4,"Hot");
}
elseif((TempValue>=15)&&(TempValue<=25))
{
LCD_WriteNChar(3,0,4,"Warm");
}
else
{
LCD_WriteNChar(3,0,4,"Cold");
}
//红外解码模块
if(IrOK==1)
{
show[1]=Im[2]&0x0F;//取键码的低四位
show[0]=Im[2]>>4;
IrOK=0;
if(show[1]>0x09)
{
show[1]='A'+show[1]-0x0a;
}
else
{
show[1]+='0';
}
if(Im[2]==0x01)
{
IrFlag1=1;
}
elseif(Im[2]==0x02)
{
IrFlag2=1;
}
else
{