1、能将环境的温度显示出来,精确度为0.1;6.能自动提示人体对环境温度的感知程度,分别为“Cold”、“Warm”、“Hot”,即“冷”、“暖和”、“热”; 7.能自动显示当前闹钟所处的状态,即为开还是关闭状态;8.当前时间与设定的闹钟时间一致时,闹钟闹响。并能够通过两个按键或者遥控器止闹; 9.整点报时功能; 10.通过短响一下来判断按键是否按下; 11.将星期作为一个单独的显示,并能通过按键或者遥控器调节;12.看门狗功能,能够在程序跑飞的情况下将系统自动复位,且从程序跑飞到复位不超过1S钟,与I2C配合,最大程度保证了程序跑飞后 时间的准确性; 二、状态显示转换图: 状态1: 当前时间(1
2、6:38); 备注:秒显示每秒变动一次; 状态2: 显示日期(09 07 09); 状态3: 显示闹钟(06:28 ); 状态4: 显示秒 ( :30);秒前面的“: 状态5: 交替显示时间和日期;每秒切换显示 状态6: 同状态4;状态7: 调年 (09 );其它内容(如温度、星期、红外解码等)照常显示状态8: 调月 ( 09 );状态9: 调日 ( 09);状态10:调星期 (1); 为了区别,调星期的时候星期会每秒闪一次状态11:调闹钟时(06 );状态12:调闹钟分( 28 );状态13:调小时 (07 ); 状态14:调分钟 ( 30 );其它内容(如温度、星期、红外解码等)照常显示,
3、这时,秒清零,时间暂停 状态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
4、.调月 - 月加一;5)、9.调日 - 日加一;6)、10.调星期 - 星期加一;7)、11.调闹钟时 - 闹钟时加一;8)、12.调闹钟分 - 闹钟分加一;9)、13.调小时 - 小时加一;10)、14.调分(停表) - 分加一,并将秒清零,停表;四、硬件电路图五、实际显示效果图1、硬件组成2、显示效果3、遥控调试时间状态下4、LED用二进制显示当前红外编码状态;六、主程序:(程序比较长,整个代码的CODE为4866Byte,是通过多个C文件来实现,通过调用头文件的方式来调用函数,可以再打开Keil工程文件看)#include Initial.hDisplay.hKey and Speake
5、r.h/*程序说明:主函数入口: 无返回值: 主循环里面的执行时间过长,有一秒一上了,主要是因为LCD只能用延时的方法来跳过查忙,想办法将里面的时间缩短。*/void main(void) Init_MCU(); /初始化MCU Init_I2C(); /初始化I2C Init_LCD(); /初始化LCD1602 Init_Time(); /先初始化时间和先读I2C有区别。先初始化时间:以后开机的时间是从I2C读出,初始化失效。 /先读I2C:第一次读出的是乱码,因为I2C里面没有写入想要的数据。故第一次下载程序到MCU要后初始化MCU /然后在把顺序改过来,即先初始化MCU,然后读I2C。
6、 /将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 =
7、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:); /在星
8、期前面写入 ,以方便辨认; /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 25) LCD_WriteNChar(3,0,4,Hot else if(TempValue=15) & (TempValue 4; IrOK=0; if(show10x09) show1 = A+show1-0x0a; else show1 += if(Im2 = 0x01) IrFlag1 = 1; else if(Im2 = 0x02) IrFlag2 = 1;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1