单片机课程设计之万年历、闹钟与温度显示设计.docx

上传人:李司机 文档编号:1813325 上传时间:2022-12-20 格式:DOCX 页数:34 大小:307.64KB
返回 下载 相关 举报
单片机课程设计之万年历、闹钟与温度显示设计.docx_第1页
第1页 / 共34页
单片机课程设计之万年历、闹钟与温度显示设计.docx_第2页
第2页 / 共34页
单片机课程设计之万年历、闹钟与温度显示设计.docx_第3页
第3页 / 共34页
单片机课程设计之万年历、闹钟与温度显示设计.docx_第4页
第4页 / 共34页
单片机课程设计之万年历、闹钟与温度显示设计.docx_第5页
第5页 / 共34页
点击查看更多>>
资源描述

《单片机课程设计之万年历、闹钟与温度显示设计.docx》由会员分享,可在线阅读,更多相关《单片机课程设计之万年历、闹钟与温度显示设计.docx(34页珍藏版)》请在三一办公上搜索。

1、我们设计的数码管时钟温度显示系统是一个可以记录时间及温度的系统,该系统是由中央控制器、温度检测器、时钟系统、显示器及键盘部分组成。控制器采用单片机STC89C52,温度检测部分采用DS18B20温度传感器,时钟系统用时钟芯片DS1302,用数码管作为显示器。单片机通过时钟芯片DS1302获取时间数据,对数据处理后显示时间;温度传感器采用DS18B20采集温度信号送给单片机处理,单片机把时间数据和温度数据送到数码管进行显示,键盘可以调时和温度查询。闹钟功能是通过按键设置闹钟的时间使蜂鸣器响。关键词:51单片机,ds1.302,ds1.8b20,闹钟,万年历摘要1一、任务分析与设计思路3二、整体设

2、计方案31、单片机的选择32、单片机的基本结构4三、数字钟的硬件设计41、总体电路设计42、晶振电路设计53、时钟芯片54、温度传感器55、复位电路设计66、数码管显示电路设计77、按键控制电路设计78、制作电路板89、元件清单9四、软件设计101、系统软件设计流程图102、按键控制子程序113、主程序124、时钟设置子程序125、定时器中断子程序与数码管显示程序137、温度传感器DS18B20主程序13五、调试与功能说明141、系统性能测试与功能说明142、系统时钟误差分析153、硬件调试154、软件调试问题及解决16六、心得体会16参考文献17一、任务分析与设计思路设计一个具有报时功能、停

3、电正常运行(来电无需校时)、带有年月日、时分秒以及温度显示、闹钟提醒功能的电子日历。电子万年历是日常生活中常见的小型电子产品,其形式多种多样,小到带有日期的电子腕表,大到公共场所悬挂的大型电子日历,此外,眼下我们还常能在宾馆、饭店等场所见到一种带有年、月、日、时、分、秒、星期甚至节气等信息的电子日历牌。电子日历的主要功能是给人们提供时间和日期信息,无论其形式如何,从外部都可分为显示和校准两部分。为使电子日历协调工作,整个系统从功能上可分为实时时钟、显示和键盘三个模块,分别完成时间和日期的计算以及人机交互的管理等。二、整体设计方案1、单片机的选择单片机是一种集成电路芯片,是采用超大规模集成电路技

4、术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、脉宽调试电路电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的微型计算机系统。特性方面:STC89C52RC单片机,8K字节程序存储空间,512字节数据存储空间内带4K字节EEPROM存储空间,可直接使用串口下载。AT89S52单片机,8K字节程序存储空间,256字节数据存储空间,没有内带叫PROM存储空间。综合考虑选择STC89C52单片机作为本系统的单片机。2、单片机的基本结构STC89C52是一种低功耗、高性能CMo

5、S8位微控制器,具有8K在系统可编程F1.aSh存储器。在单芯片上,拥有灵巧的8位CPU和在系统可编程F1.ash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、非常有效的解决方案。具有晶振电路,复位电路,定时器等结构。三、数字钟的硬件设计图3-1总体电路设计根据方案的选择,数码管时钟温度系统由51单片机、时钟芯片DS1302、测温芯片DS1802、数码管显示电路、键盘电路组成,如图3-1所示。本系统采用C语言编写,控制器采用单片机STC89C52,温度检测部分采用DS18B20温度传感器,时钟系统用时钟芯片DS1302,用八位数码管作为显示器。单片机通过时钟芯片DS1302获取时间

6、数据;通过温度传感器DS18B20采集温度信号送给单片机处理,并在数码管中显示出来,键盘可以切换界面,调时和温度查询与设置闹钟的功能。2、晶振电路设计单片机晶振的作用是为系统提供基本的时钟信号。通常一个系统共用一个晶振,便于各部分保持同步。有些通讯系统的基频和射频使用不同的晶振,而通过电子调整频率的方法保持同步。我们的数码管时钟温度显示系统采用的是12MHz的晶振,如图3-2所示。图3-3时钟芯片与单片机连接3、时钟芯片我们采用DS1302作为主要计时芯片,主要为了提高计时精度,更重要的就是DS1302可以在很小的后备电源下继续计时,并可编程选择充电电流来对后备电源进行充电,可以保证后备电源基

7、本不耗电。我们设计硬件电路时,采用一个纽扣电池进行对时钟芯片供电,达到断电后,时钟继续运行的目的。时钟芯片与单片机的连接如图3-3所示。4、温度传感器采用DS18B20作为温度检测的芯片,DS18B20温度传感器是美国DA1.1.AS半导体公司最新推出的一种改进型智能温度传感器,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现912位的数字值读数方式。由于DS18B20采用的是I-Wire总线协议方式,即在一根数据线实现数据的双向传输,而对STC89C52单片机来说,硬件上并不支持单总线协议,因此,我们必须采用软件的方法来模拟单总线的协议时序来完成对DS18B20芯片的访问。由于DS

8、18B20是在一根I/O线上读写数据,因此,对读写的数据位有着严格的时序要求。DS18B20有严格的通信协议来保证各位数据传输的正确性和完整性。该协议定义了几种信号的时序:初始化时序、读时序、写时序。所有时序都是将主机作为主设备,单总线器件作为从设备。而每一次命令和数据的传输都是从主机主动启动写时序开始,如果要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数据接收。数据和命令的传输都5、复位电路设计由电容串联电阻构成,由图并结合电容电压不能突变的性质,可以知道,当系统一上电,RST脚将会出现高电平,并且,这个高电平持续的时间由电路的RC值来决定.典型的51单片机当RST脚的高电平持

9、续两个机器周期以上就将复位,所以,适当组合RC的取值就可以保证可靠的复位.一般教科书推荐C取10u,R取8.2K.当然也有其他取法的,原则就是要让RC组合可以在RST脚上产生不少于2个机周期的高电平。如图3-5所示。6、数码管显示电路设计数码管内部是由7个条形发光二极管与一个小圆点发光二极管组成,根据这八个二极管的亮暗组成不同的字符。本系统采用八位数码管作为显示模块,数码管相对其他1.CD类的显示器来说,成本比较低廉,省电。两个四位共阴056英寸的数码管作为显示屏。如图3-6所示。图3-6四位共阴数码管图3-7按键电路7、按键控制电路设计本系统采用四个按键作为键盘控制实现界面切换的功能,如图3

10、-7所示。能够实现界面切换、时间校正、闹钟设置等功能。机械式按键再按下或释放时,由于机械弹性作用的影响,通常伴随有一定时间的触点机械抖动,然后其触点才稳定下来。其抖动过程如图3-8所示。抖动时间的长短与开关的机械特性有关,一般为5T0ms。故软件编程时需要注意消除抖动。抖动键盘稳定 后沿抖动图3-8按键抖动过程8、制作电路板制作电路板的过程如下:打印底稿(喷墨/激光打印胶片,或使用光绘菲林)曝光(太阳光30-180秒;紫外线灯4-5分钟)显影(专用显像剂)蚀刻(用热水化开的三氯化铁液体)钻孔(小电钻),焊接。如图3-9所示。图3-9腐蚀与钻孔9、元件清单我们设计的这个系统主要用到STC89C5

11、2单片机作为主控芯片,还有时钟芯片作为计算时间的芯片,温度测量的温度传感器DS18B20,并用数码管来显示,所以本系统用到的主要元件如表3-1.元器件数量元器件数量单片机1块电阻若干个DS13021块纽扣电池1个DS18B201块电容若干个741.S5731块蜂鸣器1个晶振(12M、按键若干个数码管2块表3-1元件清单四、软件设计1、系统软件设计流程图系统主程序首先对系统进行初始化,包括设置定时器、中断和端口;然后数码管显示省电模式。由于单片机没有停止指令,所以可以设计系统程序不断地循环执行上述显示效果。下图是系统的流程图。2、按键控制子程序本系统按键可以实现的数码管界面切换,系统时钟的校正、

12、闹钟的设定,按键的程序需要进行软件的消抖。按键功能如下图4-2所示。第1次按I匚ZC第。次按省电模式;数码管没显示,时间在跳动按键1.I第2次按第3次校数码管显示“年月日”;1401.10数码管显示“时分、温度”;12-3220第4次按翳置“时分”模式;数码管显示“12-32一”设置“月日”模式;数码管显示“一0110”第5次技设置“时分谭良按按旎4设置哪曲“时钟”加一回到第0次的“制电模式”设置时间的“分钟”加一设置“月日”模式硼慨置,数码管砺-OO-OOm设置的闹钟时,恸口一设置时间的“月”加一设置时间的“日”加一数码管显示“时分秒”;12-32-503、主程序主程序是系统运行的主要程序,

13、包括时钟芯片、温度传感器的读取以及数码管显示的程序。主程序开始时要对定时计数器进行初始化以及一些变量的初始化。其流程图如图4-2所示。图3-2主程序流程图4、时钟设置子程序时钟设置子程序主要是由时钟芯片DS1302计算时间并用数码管显示时间。时钟设计主要函数如下:voidread_rtcO(unsignedchari;for(i=0;i7;i+)timedatai=readds1.302byte(readaddi);_nop_();read_ds1.302_byte(read_add0);_nop_();tdi=time_datai16*10+time_datai%16;)15、定时器中断子程

14、序与数码管显示程序定时器的开启需要五个步骤:首先是设置定时计数器的工作模式与工作方式,这里设置为定时器模式0工作模式1。然后给定时器设置初值。接着是把总中断打开(EA=I);再接着是ETO=I;最后是把定时器打开(TRO=I)0其程序如下程序所示:voidinit()TMOD=OxOI;THO=(65536-1000)/256;T1.O=(65536-1000)%256;EA=I;ETO=I;TRO=I;1J7、温度传感器DS18B20主程序主程序的主要功能是负责温度的实时显示、读出并处理DS18B20的测量温度值,温度测量每IS进行一次,流程图如图4一4。读出温度子程序的主要功能是读出RAM

15、中的9个字节,在读出时需进行CRC校验,校验有错时不进行温度数据的改写。如图4-5所示。图4-4DS18B20主程序流程图图45读出温度子程序流程图五、调试与功能说明1、系统性能测试与功能说明先检查印制板及焊接的质量是否符合要求,有无虚焊点及线路间有无短路、断路。然后用万用表测试,通电检测,检查个芯片电压是否正常,检查无误后,可通电检查数码管亮度情况,一般情况下取背光电压为45.5V即可得到满意的效果。数码管时钟温度系统能够实现预想的功能:用DS1302进行时钟的运行;能够实现界面的切换;能够实现温度检测与显示功能;能够实现设置闹钟与关闭闹钟的功能;能够实现断电后时间继续运行的目的。2、系统时

16、钟误差分析数码管时钟温度系统存在一定的时间误差,但误差非常小,可以忽略;即使由于时间的累计会照成较大的误差,我们可以通过按键去校正时间。3、硬件调试子程序调试包括:DS1302的计时和读写程序、显示程序;DS18B20读出温度子程序、温度转换命令子程序、计算温度子程序、显示数据刷新子程序。根据程序各部份子程序先进行独立调试。由于采用了DS1302作为计时器使用,其计时精度相对来说比较高。用制作的成品与万年历计时比较,基本没有误差。3.根据实验要求记录并显示某些时间的温度值及一天当中的最高、最低温度。硬件测试与方案设计一样,具有一定的稳定性,快速性与准确性。4、软件调试问题及解决由于硬件设计按键

17、太少,调整时间时只能加、不能减;某些芯片不是焊固定在电路板上的,故可能会出现接触不良的问题;若两处电源都断开,则出现“死机”现象;此时要将P6接低电平六、心得体会通过本次的课程设计,我们完成了本课程设计方案设计的要求,能够实现了数码管时钟温度显示系统的基本功能,达到了完成一个小作品,小产品的目的。数码管时钟温度显示系统的实现让我们学会了编程与使用51单片机,时钟芯片ds1.302的控制与温度传感器ds1.8b20的读取与在数码管上显示。完成了以下功能:1、数码管显示“时分秒”;2、数码管显示“年月日”;3、数码管显示“时分温度”;4、设置以及校正时间;5、设置闹钟功能;6、来电无需校正。本系统

18、的开发我们是从方案论证开始,在硬件方面:用Prote1.99画电路板,制作电路板,焊接电路板,基本调试。在软件方面:用kei1.软件进行编程与用STC_ISP软件烧入测试,编程调试等步骤。最后时钟的最终测试与误差分析;得出精确的时间。在完成这个课程设计的过程中,我们遇到了不少问题,然后通过问老师、师兄、同学最终完成了课程设计。问题如下:问题解决方案1、数码管亮度不够驱动电路,用741.S573驱动2、PO口没有上拉电阻在PO口接上上拉电阻3、数码管显示有闪烁的情况把数码管显示时间减少4、温度显示出现乱码读取温度时,先把定时器关了,读完后马上开了定时器5、C语言编程.c文件不能包含.C文件;可以

19、包含.h文件6、两个电源都断了,会出现“死机”现象上电后,把Pr6拉低,然后设置时间7、设置时,参数只能加、不能减预想时没想好,下次实验一定要先想好再制作硬件8、蜂鸣器种类有两种:有源与无源两种参考文献1谭浩强著.C程序设计(第二版).北京:清华大学出版社,20052丁元杰著.单片微机原理及应用.北京:机械工业出版社,20053郭天祥著.新概念51单片机C语言教程:入门、提高、开发、拓展全攻略.北京:电子工业出版社,2009附程序:ttinc1.ude#inc1.udez,jianpan.h4inc1.ude,ds1.302.h,zftinc1.ude,ds1.8b20.hz/sbitkey1

20、.6=P1.6;sbitbuzz=P1.7;蜂鸣器定义unsignedcharsmgweigao=Oxfe,Oxfd,Oxfb,0x7f:/,0xf7,Oxef,Oxdf,Oxbfunsignedcharsmg_weidi=0xf7,Oxef,Oxdf,Oxbf;/Oxfe,Oxfd,Oxfb,0x7f,unsignedcharsmg_duangao-0xeb,0x88,0xb3,Oxba,0xd8,0x7a,0x7b,0xa8,Oxfb,Oxfa,0x10,0x00,Oxff;unsignedcharsmg_duandi=0xfa,0x22,0xb9,Oxab,0x63,Oxcb,Oxdb,

21、0xa2,Oxfb,Oxeb,0x01,0x00,Oxff;unsignedchardisp8;unsignedcharac1.ock8;unsignedchartt;bitttf1.ag;18b20标志位定义unsignedcharkey1.6num=0;voidshifenzhen();voidnianyueri();voidac1.ockset();voidinit()(TMOD=OxOI;THO=(65536-1000)/256;T1.O=(65536-1000)%256;EA=I;ETO=I;TRO=I;)voidmain()initO;/set_rtc();若有则读取全部年月日时分

22、秒;若无则直接是保存的(年月日时分秒)ds1.8b20();第一次读取温度,显示时不会出现一开始乱码的情况whi1.e(1)(/*遇到死机时,P1.6口接地,则可以继续*/if(key16=0)de1.ay(IOO);if(key1.6=0)key1.6num+;whi1.e(!key16);)if(key1.6num=1.)(ds1302();write_ds1.302(0x8e,0x00);关写保护write_ds1302(write_add0,Ox14);把数据写入相应的地址中,比如:write_ds1302(write-add1.,0x03);write_ds1302(write_ad

23、d2,0x01);把数据写入相应的地址中,比如:writeds1302(writeadd3,0x15);write_ds1.302(write_add4,0x22);把数据写入相应的地址中,比如:write_ds1.302(write-add5,0x22);write_ds1302(write_add6,0x22);把数据写入相应的地址中,比如:Write_ds1.302(0x8e,0x80);开写保护if(key1.6num-2)key1.num=O;)jianpan();ds1.302();/*般是省电模式*/if(Rn1.f1.ag=O)(dispO=1.1.;disp1.=1.1.;d

24、isp2=1.1.;disp3=1.1.;disp4=1.1.;disp5=1.1.;disp6=1.1.;disp7=1.1.;)/*第一次按下按键1显示时分秒”*/if(kn1.f1.ag=1.)disp0=td4/10;/timedata4/16;disp1.=td4%10;/timedata4%16;disp2=10;disp3=td5/10;/time_data5/16;disp4=td5%10;/time_data5%16;disp5=10;disp6=td6/10;/time_data6/16;disp7=td6%10;/time_data6%16;/*第二次按下按键i切换到年月

25、日if(kn1.f1.ag=2)(disp0=td010;disp1.=td0%10;disp210;disp3=td210;disp4=td2%10;disp5=10;disp6=td310;disp7=td3%10;)/*第三次按下按键1切换到温度显示的界面*/if(kn1.f1.ag=3)if(ttf1.ag-1.)TRO=O;关闭定时器0;以免影响温度18b20的读取ttfIag=O;ds1.8b20();读取温度TRO=I;读取完毕后打开定时器0disp0=td410;disp1.=td4%10;disp2=10;disp3=td510;disp4=td5%10;disp5=1.1.

26、;disp6=shu100;disp7=shu%10010;/*第四次按下按键1进入时间设置,设置正确的“时分”时间*/if(kn1.f1.ag=4)(ShifenzhenO;设置正常的时分时间disp0=td410;disp1.=td4%10;disp2=10;disp3=td510;disp4=td5%10;disp5=10;disp6=10;disp710;/*第五次按下按键1进入时间设置,设置正确的“月日”时间*/if(kn1.f1.ag=5)(nianyueri();设置正常的年月时间disp0=10;disp1.=10;disp2=10;disp3=td210;disp4=td2%

27、10;disp5=10;disp6=td310;disp7=td3%10;)/*第六次按下按键1回到正常显示,显示时分秒if(kn1.f1.ag=6)kn1.f1.ag=O;返回正常界面)/*第一次按下按键2,进入闹钟设置界面*/if(kn2fIag=D(kn1.f1.ag=O;进入界面“省电”设置闹钟的响应的时间disp0=10;disp1.=10;disp2=10;disp3=ac1.ock4/10;disp4=ac1.ock4%10;disp5=10;disp6=ac1.ock5/10;disp7=ac1.ock5%10;ac1.ockset();闹钟设置程序)/*第二次按下按键2*/i

28、f(kn2f1.ag=2)kn1.fIag=I;界面显示时分秒kn2fIag=O;/*闹钟响应函数*/if(td4=ac1.ock4)&(td5=ac1.ock5)&(ac1.ock4!=0)M(td630)/(buzz=O;有缘蜂鸣器只需要低电平de1.ay(1);当闹钟响后,第二次按下按键2关闭闹钟if(kn2fIag=D(kn1.f1.ag=1.;进入界面“时分秒”kn2fIag=O;buzz=1.;关闭蜂鸣器ac1.ock4=0;凌晨0点不响)/*如果第一次闹钟响不按下闹钟按键2,则2分钟后再次响*/e1.seif(td4=ac1.ock4)&,(td5=ac1.ock5+3)&(ac

29、1.ock4!=0)&(td6=24)(td4=0;)timedata4=td410*16td4%10;timedata5=td510*16+td5%10;write_ds1.302(0x8e,OxOO);关写保护write_ds1302(write_add4,time-data4);把数据写入相应的地址中,比如:write_ds1.302(write_add5time-data5);把数据写入相应的地址中,比如:Write_ds1.302(0x8e,0x80);开写保护)按下按键3减一if(kn4=1.)(td4=time_data416*10+time_data4%16;td5=time_

30、data516*10+time_data5%16;kn4=0;td5+;if(td5=60)td5=0;)time_data4=td410*16+td4%1O;time_data5=td5/10*16+td5%10;write_ds1.302(0x8e,OxOO);关写保护write_ds1.302(write_add4,time_data4);把数据写入相应的地址中,比如:writeds1302(writeadd5,time_data5);把数据写入相应的地址中,比如:write_ds1.302(0x8e,0x80);开写保护)/*设置正确的年月日时间*/voidnianyueri()设置正

31、确的时间(td2=time_data2/16*10+time_data2%16;td3=time_data316*10+time_data3%16;按下按键2加一if(kn3=1.)(td2=time_data2/16*10+time_data2%16;td3=time_data316*10+time_data3%16;kn3=0;td2+;if(td212)(td2=1.;)time_data2=td210*16+td2%1O;time_data3=td3/10*16+td3%10;writeds1302(0x8e,0x00);关写保护writeds1302(writeadd2,time_d

32、ata2);把数据写入相应的地址中,比如:write_ds1302(write_add3,time-data3);把数据写入相应的地址中,比如:write_ds1.302(0x8e,0x80);开写保护按下按键3减一if(kn4=1.)(td2=time_data216*10+time-data2%16;td3=time_data316*10+time_data3%16;kn4=0;td3+;if(td3=32)td3=1.;time_data2=td210*16+td2%1O;time_data3=td3/10*16+td3%10;write_ds1.302(0x8e,OxOO);关写保护w

33、rite_ds1.302(write_add2,time-data2);/把数据写入相应的地址中,比如:write_ds1.302(write_add3,time_data3);把数据写入相应的地址中,比如:writeds1.302(0x8e,0x80);开写保护)voidac1.ockset()(按下按键2加一if(kn3=1.)(kn3=0;ac1.ock4+;if(ac1.ock4=24)(ac1.ock4=0;按下按键3减一if(kn4=1.)(kn4=0;ac1.ock5+;if(ac1.ock5=60)ac1.ock5=0;)/*定时器0与数码管显示*/voidtimer()int

34、errupt1(staticunsignedchari;staticcharti-0;THO=(65536-1000)/256;T1.O=(65536-1000)%256;tt+;if(tt=200)(tt=O;ti+;if(ti=10)ti=O;ttfIag=I;)i+;if(i=1.)(P0=smgduangaodisp0;共阳,位选是O亮;PO位选P2=smg_weigao0;/0亮)if(i=2)(Po=Smg_duangaodisp1;共阳,位选是0亮;PO位选P2=smg_weigao1;。亮)if(i=3)(PO=Smg_duangaodisp2;共阳,位选是0亮;PO位选P2=smg_weigao2;。亮if(i=4)PO=Smg_duangaodisp3;共阳,位选是0亮;PO位选P2=smg_weigao3;。亮)if(i=5)PO=SnIgdUandidisp4;共阳,位选是0亮;PO位选P2=smg_weidi0;。亮)if(i=6)(PO=Smg_duandidisp5;共阳,位选是0亮;PO位选P2=smg_weidi1;。亮if(i=7)(PO=Smg_duandidisp6;共阳,位选是0亮;PO位选P2=smg,weidi2;。亮if(i=8)PO=Smg_duandidisp7;共阳,位选是0亮;PO位选P2=smg_weidi3;。亮i=0;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号