1、B-1 多功能电子钟设计报告 组员:彭希灵、冯旭鑫、张正鹏 完成时间:2016年5月9日 目录1.摘要42.设计任务4 2.1基本要求4 2.2发挥部分53.方案论证与比较5 3.1显示部分5 3.2时钟部分5 3.3闹铃部分6 3.4温度采集部分64.总体方案7 4.1工作原理 7 4.2总体设计75.系统硬件设计8 5.1 STC89C51单片机最小系统8 5.2时钟模块8 5.3 LCD液晶显示模块9 5.4闹钟响铃模块10 5.5温度测量模块116.系统软件设计11 6.1 main模块11 6.2 ds1302模块12 6.3 lcd12864模块12 6.4 key模块13 6.5
2、 ringlock模块13 6.6 menu模块和DS18B20模块137.测试与结果分析148.总结14参考文献15附录一15附录二161.摘要 本设计采用LCD12864液晶屏幕显示系统,以STC89C52单片机为核心,由铃声响铃模块、DS1302时钟控制模块、LCD12864显示模块、键盘控制模块、菜单模块和DS18B20温度模块等功能模块组成。基于题目的基本要求,本系统对时间显示、闹钟的设定和控制以及时间日期的设定进行了重点设计。此外,还扩展了掉电存储、红外遥控、温度采集等功能。本系统大部分功能由软件来实现。在该设计中不仅成功的实现了题中的基本要求,多数发挥部分也得到了实现,而且还具有
3、一定的创新功能。2.设计任务 2.1基本要求(1)准确计时,以数字形式显示年月、日、时、分、秒。(2)小时以24小时计时形式,分秒计时为60进位,日期平年和闰年将自行更换。(3)采用矩阵按键和4个独立按键对电子表进行控制,可进行闹钟设定、控制及时间日期的设定。 (4)闹钟功能:可任意设定闹钟时间,一旦走时到该时间,能以蜂鸣器发声、LED发光的形式告警提示。 2.2发挥部分 (1)掉电后所显示的时间进行存储,待通电可恢复断电前的时间。 (2)闹钟时间到,蜂鸣器能发出有节奏的音乐,并且LED灯发光节奏随音乐变化。(3)通过红外遥控能使闹钟停止。(4)其它发挥部分:添加了一个主菜单,增加了一个温度模
4、块3.方案论证与比较 3.1显示部分显示部分是本次设计的重要部分,一般有以下两种方案:方案一:采用LED显示,分静态显示和动态显示。对于静态显示方式,所需的译码驱动装置很多,引线多而复杂,且可靠性也较低。而对于动态显示方式,虽可以避免静态显示的问题,但设计上如果处理不当,易造成亮度低,有闪烁等问题。方案二:采用LCD显示。LCD液晶显示具有丰富多样性、灵活性、电路简单、易于控制而且功耗小等优点,对于信息量多的系统,是比较适合的。鉴于上述原因,我们采用方案二。 3.2时钟部分时钟是本设计的核心的部分。根据需要可采用以下两种方案实现:方案一:方案完全用软件实现数字时钟。原理为:在单片机内部存储器设
5、三个字节分别存放时钟的时、分、秒信息。利用定时器与软件结合实现1秒定时中断,每产生一次中断,存储器内相应的秒值加1;若秒值达到60,则将其清零,并将相应的分字节值加1;若分值达到60,则清零分字节,并将时字节值加1;若时值达到24,则将时字节清零。该方案具有硬件电路简单的特点,但当单片机不上电,程序将不执行。而且由于每次执行程序时,定时器都要重新赋初值,所以该时钟精度不高。方案二:方案采用Dallas公司的专用时钟芯片DS1302。该芯片内部采用石英晶体振荡器,其芯片精度不大于10ms/年,且具有完备的时钟闹钟功能,因此,可直接对其以用于显示或设置,使得软件编程相对简单。为保证时钟在电网电压不
6、足或突然掉电等突发情况下仍能正常工作,芯片内部包含锂电池。当电网电压不足或突然掉电时,可使系统自动转换到内部锂电池供电系统。而且即使系统不上电,程序不执行时,锂电池也能保证芯片的正常运行,以备随时提供正确的时间。基于时钟芯片的上述优点,本设计采用方案二完成时钟的功能。 3.3闹铃部分一般的时钟都带有闹铃,实现闹铃方式可采用以下两种:方案一:将闹钟信息存放在单片机自带的存储器中。该方案成本低而且易于实现,但是一但掉电会造成之前信息的丢失。方案二:将闹钟信息存放在非易失储存器AT24C02中。该方案即使在完全的掉电的情况下也不会造成闹钟信息的丢失,可避免方案一带来的麻烦。在此设计中,我们采用的是方
7、案一,为了防止其数据的丢失,我们对掉电后所显示的时间进行了存储。 3.4温度采集部分由于现在用品追求多样化,多功能化,给系统加上温度测量显示模块,能够方便人们的生活,使该设计具有人性化。方案一:采用热敏电阻,可满足40摄氏度至90摄氏度测量范围,但热敏电阻精度、重复性、可靠性较差,对于检测小于1摄氏度的信号是不适用的。方案二:采用温度传感器DS18B20。DS18B20可以满足从-55摄氏度到+125摄氏度测量范围,且DS18B20测量精度高,增值量为0.5摄氏度,在一秒内把温度转化成数字,测得的温度值的存储在两个八位的RAM中,单片机直接从中读出数据转换成十进制就是温度,使用方便。基于DS1
8、8B20的以上优点,我们决定选取DS18B20来测量温度。4.总体方案 4.1工作原理 本设计采用STC89C51单片机作为本系统的控制模块。单片机可把由DS18B20、DS1302中的数据利用软件来进行处理,从而把数据传输到显示模块,实现时间、闹铃和温度的显示。以LCD液晶显示器为显示模块,把单片机传来的数据显示出来,并且显示多样化。在显示电路中,主要靠按键来实现各种显示要求的选择与切换。 4.2总体设计总体框架如图1所示USB转串口P17图1 总体框架5.系统硬件设计本设计采用的是学校实验单片机,由于单片机中蜂鸣器声音较小,现外接一个喇叭的简单电路,当闹钟时间一到时,以能较清晰的听到有节奏
9、的音乐。设计中还将原来的12M晶振换成了24M晶振,用以减小一半的周期,以达到提高单片机运行速度和稳定时钟频率的效果。 5.1 STC89C51单片机最小系统单片机最小系统包括晶体振荡电路、复位开关和电源部分。图2为STC89C51单片机的最小系统。 图2 STC89C51最小系统电路图 5.2时钟模块时钟模块采用DS1302芯片,DS1302是DALLAS公司推出的涓流充电时钟芯片,内含有一个实时时钟/日历和31字节静态RAM,通过简单的串行接口可与单片机进行通信,实时时钟/日历电路能计算2100年前的年、月、日、星期、时、分、秒的信息以及每月的天数和闰年的天数,还可自动调整时钟操作,可通过
10、AM/PM指示决定采用24或12小时格式,DS1302与单片机之间能简单地采用同步串行的方式进行通信,且仅需用到三个口线:RST复位、I/O数据线、SCLK串行时钟。时钟/RAM的读/写数据以一个字节或多达31个字节的字符组方式通信。DS1302工作时功耗很低,保持数据和时钟信息时功率小于1mW,其接线电路如图3所示。图3 时钟电路 5.3 LCD液晶显示模块LCD液晶显示模块采用LCD12864型号,具有很低的功耗,逻辑工作电压为4.5V-5.5V。通过编程实现自动关闭屏幕能够更有效的降低功耗。其接线如图4所示。图4 LCD12864显示电路 5.4闹钟响铃模块在原有的蜂鸣器的基础上并联了一
11、个100K的电阻,用以分压,减少功率的损耗,并且把蜂鸣器换成了喇叭,以增大音量。接线如图5所示P17P17图5 喇叭发声电路 5.5温度测量模块 温度测量传感器采用DALLAS公司DS18B20的单总线数字化温度传感器,测温范围为-55125,可编程为9位12位A/D转换精度,测温分辨率达到0.0625,采用寄生电源工作方式,CPU只需一根口线便能与DS18B20通信,占用CPU口线少,可节省大量引线和逻辑电路。接口电路如图6所示。图6 DS18B20温度测量电路6.系统软件设计整个程序是在Keil 4环境下编写运行的,程序包含了main,ds1302,lcd12864,key,ringloc
12、k,menu,DS18B20等模块组成。整个程序能实现对多功能电子钟的各种操作。下面分别对各个模块进行简要介绍。6.1 main模块该模块是对所有模块的汇总,是整个程序的核心部分。在该模块中包含了主函数,时钟显示函数,中断函数,设置时间函数,延时函数,设置闹钟函数。主函数void main():在该函数开始调用了LCD12864_Init(),Ds1302Init1(),ClockInit(),四个函数对LCD12864,DS1302进行了初始化设置;renum=menu()是菜单返回值控制进入哪个设置;接着对中断作了相应的设置,如打开中断之类的;然后是一个while(1)的无限循环。在该部分
13、中用了两个if语句来判断是进入时间的设定,还是进入闹钟的设定,在设定时间和闹钟的同时,时钟不会停止,仍旧在运行中。时钟显示函数:在void LcdDisplay()、void LcdDisplay1()两个函数中通过LCD12864_SetWindow()函数的调用来确定LCD12864显示的哪一行,通过LCD12864_WriteData()函数的调用来显示时间年、月、日、时、分、秒、星期;中断函数void Int0() interrupt 0:判断有没有按按键K17(单片机上的按键标号,下同),按一下进入设置时间部分,设置好时间后,再按一下,时钟开始从设置的时间运行。6.2 ds1302模
14、块在该模块中包含了向DS1302写入地址和数据的函数void Ds1302Write(uchar addr, uchar dat),从DS1302读取一个地址的数据的函数uchar Ds1302Read(uchar addr),对DS1302进行初始化的函数void Ds1302Init(),读取时钟信息的函数void Ds1302ReadTime(),对DS1302时钟进行设置的函数void Ds1302Set()以及恢复掉电前数据的函数void Ds1302Init1()。该模块能实现对DS1302时钟的控制,其需输入addr,dat两个数据。6.3 lcd12864模块该模块中包含了位接
15、收函数uchar BitReverse32(uchar number),延时函数void LCD12864_Delay1ms(uint c),写命令函数void LCD12864_WriteCmd(uchar cmd),检测LCD12864是否正忙函数uchar LCD12864_Busy(void),写数据函数void LCD12864_WriteData(uchar dat),对LCD12864进行初始化的函数void LCD12864_Init(),读取数据函数uchar LCD12864_ReadData(void)以及在基本指令模式下设置显示坐标的函数void LCD12864_Se
16、tWindow(uchar x, uchar y)(其中,x是设置行,y是设置列)。该模块中对LCD12864进行了相关的操作。6.4 key模块该模块中只包含了两个函数延时函数void delay7(uint z)和键盘控制函数uchar KeyData(void),以实现键盘控制功能。在本设计中一共用到了六个按键(四个独立按键、两个矩阵键盘中的按键),其功能如下表所示: 按键及其功能表按键标号(同单片机上标示)按键功能K15运行时钟K16进入闹钟的设置K17进入中断,设置时钟K18控制设置时间或闹钟的选位K19设置时间或闹钟时的加一键K20设置时间或闹钟时的减一键6.5 ringlock模
17、块该模块是铃声响铃模块,该模块能使喇叭发出有节奏的音乐,还能实现红外遥控对闹钟的控制。该模块中对闹钟部分进行了初始化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模块这两个模
18、块的内容是自己添加的,也属于一个创新点。menu模块用以进入时钟前显示一个菜单,在菜单中可以选择是运行时钟,还是设置闹钟,这个菜单的设置让使用者能方便的使用这个电子钟,因此具有较强的实用性。DS18B20模块是在显示时间的同时采集当时的温度并且显示出来,由于现在用品追求多样化,多功能化,给系统加上温度测量显示模块,能够方便人们的生活,使该设计具有人性化的特点。7.测试与结果分析1)系统上电后,首先显示“多功能电子时钟”的字样,接着进入主菜单,LCD12864显示“功能选择:1 运行时钟 2 设置闹钟”。按各功能键执行相应的功能(时钟操作方法详见附录一)。2)设定闹铃时间,当闹铃时间到时响铃。
19、可用红外遥控来停止闹钟。3)显示时间时通过与秒表对比,测试的系统时钟走时准确,误差很小。4)上电后记录下时间,然后使单片机断电,隔一段时间再次通电,测得系统时钟仍旧走时准确。8.总结本次设计的多功能电子钟采用LCD12864液晶屏幕显示系统,以STC89C51单片机为核心,通过DS1302芯片能准确计时,以数字形式显示年月、日、时、分、秒,而且能自动进行平年、闰年的转换,在DS1302中还能编程以实现掉电后存储数据的功能,以使电子钟重新上电时的时间不受掉电的影响。在该时钟中小时以24小时计时形式,分秒计时为60进位。该电子钟可通过矩阵按键和4个独立按键来对电子表进行控制,可进行闹钟设定、控制及
20、时间日期的设定。当闹钟时间一到,新加的喇叭能发出有节奏的音乐,并且LED灯发光节奏随音乐变化,而且可以通过红外遥控来停止闹钟,这在现实生活中显得十分方便。为了更加方便使用者,本设计中还特地加上了温度显示以及主菜单的设计。总而言之,此多功能电子钟的设计完成了设计任务的基本要求和多数发挥部分的内容,还有一定的创新部分,而且在设计过程中考虑到了现实要求,设计得颇为人性化和智能化,是一个较为完美的设计。参考文献1 张毅刚,等. 单片机原理及接口技术(第2版).人民邮电出版社,2015.2 张毅刚. 单片机原理及接口技术(C51编程).人民邮电出版社,2015.3 张义和,等. 例说51单片机(C语言版
21、)(第3版).人民邮电出版社,2013. 附录一多功能电子时钟的操作方法 1)将LCD12864接入单片机,并且把相应的接口用线连接好(接线图如下所示),准备就绪后给单片机上电; 2)单片机上电后,LCD12864上会先显示“多功能电子时钟”的字样,接着会自动跳转至功能选择的主菜单;3)闹钟设定:按下K16可开始设置闹钟,LCD上会先显示“设置闹钟开始”,然后自动跳转至闹钟设置界面,按K18可选择是设置年月日星期,还是设置时分秒,通过K19、K20来加减位,设置完成后,按下K17可进入时钟,LCD上显示“闹钟设定成功 进入时钟”,当设置的闹钟时间一到,喇叭会发出有节奏的音乐,LED灯闪烁,按下
22、红外遥控开关可停止闹钟。4)在没设置闹钟时,可以按K17来进行时钟时间的设定,按K15运行时钟。接地接并行口接VCC附录二多功能电子时钟完整程序main.c(主程序)#includemain.huchar 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
23、Delay10ms(void);sbit K1=P20;sbit K2=P21;sbit K3=P22;sbit K4=P23; 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(); m+;displaylcd(CharCode6);delay8(3000);settime(); void LcdDisplay()LCD12864_SetWindow(0, 0);
24、 LCD12864_WriteData(2);LCD12864_WriteData(0);LCD12864_WriteData(0+TIME6/16);LCD12864_WriteData(0+(TIME6&0x0f); LCD12864_WriteData(-);LCD12864_WriteData(-);LCD12864_WriteData(0+TIME4/16); LCD12864_WriteData(0+(TIME4&0x0f);LCD12864_WriteData(-);LCD12864_WriteData(-);LCD12864_WriteData(0+TIME3/16); LCD
25、12864_WriteData(0+(TIME3&0x0f); LCD12864_WriteData( ); LCD12864_WriteData( ); LCD12864_WriteData( ); LCD12864_WriteData( );LCD12864_SetWindow(1, 0); LCD12864_WriteData(0+TIME2/16);LCD12864_WriteData(0+(TIME2&0x0f); LCD12864_WriteData(-);LCD12864_WriteData(-);LCD12864_WriteData(0+TIME1/16);LCD12864_W
26、riteData(0+(TIME1&0x0f);LCD12864_WriteData(-);LCD12864_WriteData(-);LCD12864_WriteData(0+TIME0/16);LCD12864_WriteData(0+(TIME0&0x0f); LCD12864_SetWindow(2, 0);LCD12864_WriteData(w);LCD12864_WriteData(e);LCD12864_WriteData(e);LCD12864_WriteData(k); LCD12864_WriteData( );LCD12864_WriteData(0+(TIME5&0x
27、07); DS18B20(); void Int0() interrupt 0 Delay10ms();if(K1=0) LCD12864_WriteCmd(0x0c);SetState=SetState;SetPlace=0;nm=0;if(mn=0)displaylcd(CharCode7);delay8(3000);mn+; if(m=0)Ds1302Init1();elseDs1302Init();void Delay10ms(void) unsigned char a,b,c; for(c=1;c0;c-) for(b=38;b0;b-) for(a=130;a0;a-);void
28、settime() po=0;b:while(clock()=0)if(SetState=0)mn=0;Ds1302ReadTime(); LcdDisplay();elsemn+; if(K2=0) SetPlace+;if(SetPlace=7)SetPlace=0;while(i9) TIMESetPlace=TIMESetPlace+6; elseTIMESetPlace-;if(TIMESetPlace&0x0f)9) TIMESetPlace=TIMESetPlace-6;if(TIMESetPlace=0x60)&(SetPlace=0x24)&(SetPlace=2) TIME
29、SetPlace=0;if(TIMESetPlace=0x32)&(SetPlace=3) TIMESetPlace=0;if(TIMESetPlace=0x13)&(SetPlace=4) TIMESetPlace=0;if(TIMESetPlace=0x8)&(SetPlace=5) TIMESetPlace=1;while(i=7)numb=0;while(i9) CLKnumb=CLKnumb+6; elseCLKnumb-;if(CLKnumb&0x0f)9) CLKnumb=CLKnumb-6; if(CLKnumb=0x60)&(numb=0x24)&(numb=2) CLKnu
30、mb=0;if(CLKnumb=0x32)&(numb=3)CLKnumb=0;if(CLKnumb=0x13)&(numb=4)CLKnumb=0;if(CLKnumb=0x8)&(numb=5)CLKnumb=1;while(i50)&(K3=0)|(K4=0) Delay10ms();i+;i=0;LcdDisplay1();if(nm=0) LcdDisplay1(); nm+; switch (numb) case 0: y=4;x=1; break; case 1: y=2;x=1; break; case 2: y=0;x=1; break; case 3: y=5;x=0; b
31、reak; case 4: y=3;x=0; break; case 5: y=2;x=2; break; case 6: y=1;x=0; break;LCD12864_SetWindow(x,y);LCD12864_WriteCmd(0x0f);uchar clock()uint pi; for (pi = 0; pi 7; pi+) if (CLKpi != TIMEpi) return 0; break; return 1;ds1302.c(时钟控制)#includeds1302.h#includelcd12864.huchar code READ_RTC_ADDR7 = 0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d; uchar code WRITE_RTC_ADDR7 = 0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c;void Ds1302Write(uchar addr, uchar dat)uchar n;RST = 0;_nop_();SCLK = 0;_nop_();RST = 1; _nop_();for (n=0; n= 1;SCLK = 1;_nop_();SCLK = 0;_nop_();for (n=0; n= 1;SC
©2010-2024 宁波自信网络信息技术有限公司 版权所有
客服电话:4008-655-100 投诉/维权电话:4009-655-100