基于51单片机的多功能电子钟的设计 下载本文

内容发布更新时间 : 2024/11/15 7:50:08星期一 下面是文章的全部内容请认真阅读。

6.5 ringlock模块

该模块是铃声响铃模块,该模块能使喇叭发出有节奏的音乐,还能实现红外遥控对闹钟的控制。该模块中对闹钟部分进行了初始化void ClockInit(void),采用定时器中断0来控制音乐节拍void int1() interrupt 1,用了一个延时函数来控制频率延时void delay1 (unsigned char m),还存在一个毫秒延时子程序void delayms1(unsigned char a),接着是这个模块的核心响铃函数void ring() ,最后是红外控制闹钟的一个中断子函数void ReadIr() interrupt 2。

6.6 menu模块和DS18B20模块

这两个模块的内容是自己添加的,也属于一个创新点。menu模块用以进入时钟前显示一个菜单,在菜单中可以选择是运行时钟,还是设置闹钟,这个菜单的设置让使用者能方便的使用这个电子钟,因此具有较强的实用性。DS18B20模块是在显示时间的同时采集当时的温度并且显示出来,由于现在用品追求多样化,多功能化,给系统加上温度测量显示模块,能够方便人们的生活,使该设计具有人性化的特点。

7.测试与结果分析

1)系统上电后,首先显示“多功能电子时钟”的字样,接着进入主菜单,LCD12864显示“功能选择:1 运行时钟 2 设置闹钟”。按各功能键执行相应的功能(时钟操作方法详见附录一)。

2)设定闹铃时间,当闹铃时间到时响铃。 可用红外遥控来停止闹钟。 3)显示时间时通过与秒表对比,测试的系统时钟走时准确,误差很小。 4)上电后记录下时间,然后使单片机断电,隔一段时间再次通电,测得系统时钟仍旧走时准确。

13

8.总结

本次设计的多功能电子钟采用LCD12864液晶屏幕显示系统,以STC89C51单片机为核心,通过DS1302芯片能准确计时,以数字形式显示年月、日、时、分、秒,而且能自动进行平年、闰年的转换,在DS1302中还能编程以实现掉电后存储数据的功能,以使电子钟重新上电时的时间不受掉电的影响。在该时钟中小时以24小时计时形式,分秒计时为60进位。该电子钟可通过矩阵按键和4个独立按键来对电子表进行控制,可进行闹钟设定、控制及时间日期的设定。当闹钟时间一到,新加的喇叭能发出有节奏的音乐,并且LED灯发光节奏随音乐变化,而且可以通过红外遥控来停止闹钟,这在现实生活中显得十分方便。为了更加方便使用者,本设计中还特地加上了温度显示以及主菜单的设计。

总而言之,此多功能电子钟的设计完成了设计任务的基本要求和多数发挥部分的内容,还有一定的创新部分,而且在设计过程中考虑到了现实要求,设计得颇为人性化和智能化,是一个较为完美的设计。

参考文献

[1] 张毅刚,等. 单片机原理及接口技术(第2版).人民邮电出版社,2015. [2] 张毅刚. 单片机原理及接口技术(C51编程).人民邮电出版社,2015. [3] 张义和,等. 例说51单片机(C语言版)(第3版).人民邮电出版社,2013.

14

附录一

多功能电子时钟的操作方法

1)将LCD12864接入单片机,并且把相应的接口用线连接好(接线图如下所示),准备就绪后给单片机上电;

2)单片机上电后,LCD12864上会先显示“多功能电子时钟”的字样,接着会自动跳转至功能选择的主菜单;

3)闹钟设定:按下K16可开始设置闹钟,LCD上会先显示“设置闹钟开始”,然后自动跳转至闹钟设置界面,按K18可选择是设置年月日星期,还是设置时分秒,通过K19、K20来加减位,设置完成后,按下K17可进入时钟,LCD上显示“闹钟设定成功 进入时钟”,当设置的闹钟时间一到,喇叭会发出有节奏的音乐,LED灯闪烁,按下红外遥控开关可停止闹钟。

4)在没设置闹钟时,可以按K17来进行时钟时间的设定,按K15运行时钟。

15

接并行口 接地 接VCC 附录二

多功能电子时钟完整程序 main.c(主程序)

#include\

uchar SetState,SetPlace; uchar renum,x,y,mn,i,nm,m;

uchar code CharCode6[]=\闹钟设定成功 uchar code CharCode7[]=\时间设定中%uchar code CharCode8[]=\闹钟设定中\void IrInit();

void DelayMs2(unsigned int); void redwear(void); void Delay10ms(void);

sbit K1=P2^0; sbit K2=P2^1; sbit K3=P2^2; sbit K4=P2^3;

void main() {

LCD12864_Init(); Ds1302Init1(); ClockInit(); renum=menu(); IT0=1; EX0=1; PX0=0;

EA=1;

while(1) { if(renum==0) { settime(); } else { m=0; setclock();

16

进入时钟\