多功能电子时钟说明文档文档格式.docx
《多功能电子时钟说明文档文档格式.docx》由会员分享,可在线阅读,更多相关《多功能电子时钟说明文档文档格式.docx(16页珍藏版)》请在冰豆网上搜索。
能将环境的温度显示出来,精确度为0.1℃;
6.能自动提示人体对环境温度的感知程度,分别为“Cold”、“Warm”、“Hot”,即“冷”、“暖和”、“热”;
7.能自动显示当前闹钟所处的状态,即为开还是关闭状态;
8.当前时间与设定的闹钟时间一致时,闹钟闹响。
并能够通过两个按键或者遥控器止闹;
9.整点报时功能;
10.通过短响一下来判断按键是否按下;
11.将星期作为一个单独的显示,并能通过按键或者遥控器调节;
12.看门狗功能,能够在程序跑飞的情况下将系统自动复位,且从程序跑飞到复位不超过1S钟,与I2C配合,最大程度保证了程序跑飞后
时间的准确性;
二、状态显示转换图:
状态1:
当前时间(16:
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:
显示一个停止的时间,这时时间不走了;
三、按键转换图
按键A转换图(红外键A):
1)、1.当前时间->
5.交替显示时间和日期->
7.调年->
8.调月->
9.调日->
10.调星期->
11.调闹钟时->
12.调闹钟分->
13.调小时->
14.调分(停表)->
15.显示停->
1.当前时间;
2)、4(或6).显示秒->
7.调年;
按键B转换图(红外键B):
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"
Display.h"
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);
Hour=RandomRead_I2C(0x02);
Day=RandomRead_I2C(0x03);
Mounth=RandomRead_I2C(0x04);
Year=RandomRead_I2C(0x05);
Alarm_Hour=RandomRead_I2C(0x06);
Alarm_Minute=RandomRead_I2C(0x07);
Week=RandomRead_I2C(0x08);
//Init_Time();
//主循环
while
(1)
{
WDTRST=0x3c;
//由于在按键调节分钟的时候要停定时器2,这时不能在定时器喂狗,故到主程序里喂狗;
SpitTime();
//拆分时间数据
SpitDate();
//拆分日期数据
SpitAlarm();
//拆分闹钟数据
KeyAFunc();
//按键A检测函数
KeyBFunc();
//按键B检测函数
Display();
//显示函数
tmpchange();
//温度转换函数,将其与温度读取函数隔远,让其有充足时间转换;
LCD_WriteNChar(13,1,2,"
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,"
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);
WriteByte_I2C(0x02,Hour);
WriteByte_I2C(0x03,Day);
WriteByte_I2C(0x04,Mounth);
WriteByte_I2C(0x05,Year);
WriteByte_I2C(0x06,Alarm_Hour);
WriteByte_I2C(0x07,Alarm_Minute);
WriteByte_I2C(0x08,Week);
//读取温度
TempValue=tmp();
//拆分温度
temp[0]=TempValue/100+'
;
temp[1]=TempValue%100/10+'
temp[3]=TempValue%10+'
LCD_WriteNChar(0,1,4,temp);
//显示温度
//智能显示环境温度对人体体感模块
if(TempValue>
25)
LCD_WriteNChar(3,0,4,"
Hot"
elseif((TempValue>
=15)&
(TempValue<
=25))
Warm"
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]+='
if(Im[2]==0x01)
IrFlag1=1;
elseif(Im[2]==0x02)
IrFlag2=1;