单片机课程设计(论文)基于DS1302的高精度多功能电子时钟.doc

上传人:仙人指路1688 文档编号:4147434 上传时间:2023-04-07 格式:DOC 页数:43 大小:780.50KB
返回 下载 相关 举报
单片机课程设计(论文)基于DS1302的高精度多功能电子时钟.doc_第1页
第1页 / 共43页
单片机课程设计(论文)基于DS1302的高精度多功能电子时钟.doc_第2页
第2页 / 共43页
单片机课程设计(论文)基于DS1302的高精度多功能电子时钟.doc_第3页
第3页 / 共43页
单片机课程设计(论文)基于DS1302的高精度多功能电子时钟.doc_第4页
第4页 / 共43页
单片机课程设计(论文)基于DS1302的高精度多功能电子时钟.doc_第5页
第5页 / 共43页
点击查看更多>>
资源描述

《单片机课程设计(论文)基于DS1302的高精度多功能电子时钟.doc》由会员分享,可在线阅读,更多相关《单片机课程设计(论文)基于DS1302的高精度多功能电子时钟.doc(43页珍藏版)》请在三一办公上搜索。

1、课程设计论文题 目:电子钟院 (系):电子信息工程与自动化学院专 业:自动化学生姓名: 学 号:指导教师:2011 年 1 月 20 日1 .课程设计题目42 .系统方案设计42.1 系统总体方案设计42.2 主要模块方案选择和论证52.2.1 单片机的选择52.2.2 时间生成模块的选择52.2.3 显示模块的选择52.2.4 定时时间到指示52.2.5 按键的设计53 .硬件电路设计63.1.1 单片机系统电路的设计:63.1.2 时钟芯片和按键电路设计63.1.3 LCM1602模块和蜂鸣器电路的设计63.1.4 系统硬件总电路图:73.1.5 总系统电路的PCB图74 .软件设计84.

2、1 系统软件设计84.1.1 主程序的事件顺序驱动机制84.1.2 网状多级状态结构的按键处理84.1.3 秒表的定时中断94.1.4 系统主程序的流程图104.2 模块软件设计114.2.1 LCM1602的驱动程序114.2.2 DS1302的驱动程序114.2.3 闹钟蜂鸣的驱动程序124.2.4 掉电状态保存设计125 .操作说明和最终实现125.1 整体总装图:125.2 操作说明135.2.1 时间,日期,闹钟的设置135.2.2 闹钟开/关的设置135.2.3 在闹钟蜂鸣时停止闹钟135.2.4 秒表的操作146 .讨论147 .总结15主要元器件清单:152010年上学期单片机

3、课程设计论文电子钟姓名:XX 学号:XXXX 日期2011-1-20摘 要本文叙述了电子钟的整个设计过程,包括硬件设计和软件设计,并重点讨论了模块软件设计和编程思想,并在本文末尾进行了讨论和总结,提出了改进的方面和改进的方法。完成的电子钟具有走时准确;掉电长时间后时间不需重新设置;闹钟时间和开关状态掉电保存;秒表功能计时准确;功耗低,操作界面友好,操作简便;最大的特点是具有人性化的设计。关键词:电子钟 硬件设计 软件设计 编程思想 掉电保存 人性化 Abstract:This article narrated electron clocks entire design process, inc

4、luding the hardware design and the software design, and discussed the module software design and the programming thought with emphasis, and has carried on the discussion and the summary end of this article, proposed the improvement aspect and the improvement method. Completes the electron clock has

5、is in luck accurately; After power failure the long time, the time cannot the reset; Alarm clock time and on-off state power failure preservation; The stopwatch function time is accurate; The power loss is low, the operation contact surface is friendly, the operation is simple; The most major charac

6、teristic has the user-friendly design.Keyword: Electron clock Hardware design Software design Programming thought Power failure preservation User-friendly 1 .课程设计题目电子钟:要求:1.显示和设置时间;2.实现秒表功能;3.实现定时功能2 .系统方案设计2.1 系统总体方案设计本课设题目要求为:1.显示和设置时间;2.实现秒表功能;3.实现定时功能。显示采用LCM1602液晶显示模块,设置时间按键采用简单的单个I/O口键盘,时间生成采用

7、DS1302时钟芯片,秒表功能采用定时中断实现,蜂鸣器发声。系统整体方案图如下:MCU89S52单片机1602液晶显示模块DS1302时钟芯片模块键盘模块蜂鸣器模块电源滤波及指示模块2.2 主要模块方案选择和论证2.2.1 单片机的选择单片机有多种方案的选择,如飞思卡尔XS128,凌阳SPCE061A语音单片机,AVR等,但51单片机价格便宜,使用方便,操作简单,针对题目的要求,89S52八位单片机已足够胜任,故本设计采用89S52做处理器控制模块。2.2.2 时间生成模块的选择时间生成可采用52单片的定时中断实现,它的优点:软硬件简单,操作简便,缺点:精确度低,掉电不保存。于是选择常用的时钟

8、芯片DS1302来实现时间的生成。DS1302是低功耗实时时钟芯片,附加31字节静态RAM,采用SPI三线接口与MCU进行同步通信,可提供秒,分,时,日,星期,月,年,采用双电源供电(主电源和备用电源),工作电压宽(2.5V5.5V),不仅时间精确,还可以掉电保存时间日期,静态RAM可用来保存闹钟定时时间和重要数据、标记。2.2.3 显示模块的选择显示模块是显示时间等信息和人机交流的设备,好的人机操作界面应该是友好的,显示的信息足够丰富。显示模块可用8位数码管显示,但是数码管显示信息量少,显示不友好,硬件相对复杂,在软件设计中不断扫描显示,占用CPU时间,效率低。因此本方案选用LCM1602液

9、晶显示模块。LCM1602液晶显示模块可显示16x2个字符,显示信息丰富,界面友好,硬件接口简单,驱动程序简单,是理想的显示器件。2.2.4 定时时间到指示定时时间到可用发光二极管指示,但效果不太人性化,而选用了蜂鸣器,定时时间到则蜂鸣以示定时时间到。2.2.5 按键的设计由于电子钟功能的设置简单,只需5个按钮,故不采用矩阵键盘,而是采用简单的单个I/O口键盘,每个按钮占用一个I/O口,程序简单,硬件连接也很简单。3 .硬件电路设计3.1.1 单片机系统电路的设计:图中为单片机最小系统电路图,最小系统设计了手动复位按钮和上电复位电路,ISP下载口,晶振为12Mhz。端口分配:P0:经上拉电阻后

10、作为液晶模块的数据输入端。P2.5作为LCM的RS端P2.6作为LCM的RW端P2.7作为DS1302的EN端P1.5作为DS1302的CLK端P1.6作为DS1302的IO端P1.7作为DS1302的RST端P3.0经上拉电阻后作为设置键P3.1经上拉电阻后作为上调键P3.2经上拉电阻后作为下调键P3.3经上拉电阻后作为退出键P3.4经上拉电阻后作为秒表键3.1.2 时钟芯片和按键电路设计DS1302实时时钟芯片的晶振采用32.768khz,第8引脚经30欧姆电阻与备用纽扣电池连接,作为主电源掉电后给DS1302提供电源,以保证时间的正常运行。接按键的单片机端口接上10k欧姆的上拉电阻,以保

11、证在无按键按下时端口是高电平,而按键按下时对应的I/O口为低电平。3.1.3 LCM1602模块和蜂鸣器电路的设计LCM的数据总线与单片机的P0口相接,控制线分别与P2.7,P2.6,P2.5相接。LCM的第3个引脚接上了10K欧姆的可调电阻,用于调节液晶屏的对比度,而第15,16个引脚用100欧姆电阻与电源串联,做为液晶屏的背光电源。P1.0做为蜂鸣器发声的控制引脚,高低电平经P1.0输出,并经过8050,9015两个三极管组成的复合管驱动蜂鸣器的通与断电,引起蜂鸣器中薄膜的震动从而发出声音,高低电平的频率即为发声的频率。3.1.4 系统硬件总电路图:3.1.5 总系统电路的PCB图 4 .

12、软件设计4.1 系统软件设计整个软件系统采用模块化思想,把1602,DS1302的驱动程序做成头文件,在功能程序中调用。采用这种方法不仅使程序模块化,使程序结构层次分明,便于管理和维护,同时可方便以后开发的调用,只要包含头文件,功能程序模块中再调用接口函数就可以了,而不必关心底层驱动是如何实现的,这样缩短了开发周期,开发效率大大提高。在主程序中采用事件顺序驱动机制的编程方法,按键处理中采用采用网状多级状态结构的编程方法,而秒表功能采用定时中断实现,精确到1ms。4.1.1 主程序的事件顺序驱动机制主程序采用事件驱动机制,事件为某个按键按下,则主程序响应这个按键,并进入相应的功能程序,其编程思想

13、如下;主程序YY设置标记为1?调用设置功能程序设置标记为0?调用时间显示功能程序NN其中改变设置标记的状态为“设置”键:当第一次按下“设置”键时,改变设置标记为1,表示主程序应该响应设置事件,进入设置状态。当退出设置状态时,置设置标志为0,表示主程序响应显示时间事件,进入显示时间状态。4.1.2 网状多级状态结构的按键处理按键处理中采用了基于状态机的程序调度机制,当某个按键按下时,改变其状态,再根据状态散转去执行相应的程序,达到了一键多义的效果。设置键的状态机处理过程为:每按一下“设置”键,则其状态改变一次(标记状态从1改变到8),如图: 状态1状态2状态8设置时间:秒设置时间:分设置闹钟时间

14、各个键态的转移网络图:设置停止退出清零退出-1+1退出分+1秒-1时+1闹钟设置下调键设置键(设置时间日期)退出键秒表键上调键开始4.1.3 秒表的定时中断因为DS1302读出的最小时间是1秒,而秒表功能要求要精确到1毫秒,所以必须采用定时中断来实现。每隔1毫秒中断一次,精确到了1毫秒,达到了设计要求。其初始化如下:初始化:void time_init(void)IE=0x82;TCON=0x00;EA=1;TMOD=0X01; TH0=(56636-1200)/256;TL0=(56636-1200)%256;TR0=0;中断程序:void clok(void) interrupt 14.1

15、.4 系统主程序的流程图YYYN开始I/O初始化DS1302初始化定时中断初始化读取DS1302的静态RAM中的闹钟时间和开关标记标记Done=1?键盘扫描进入设置状态退出?标记Done=0?调用读取时间函数并显示时间定时中断初始化键盘扫描闹钟时间到?显示并蜂鸣20s到?是否改变闹钟的开/关标记?闹钟开关标记存入DS1302的静态RAM,并显示标记中的NNYYYNNN4.2 模块软件设计4.2.1 LCM1602的驱动程序#ifndef LCD_1602#define LCD_1602#include /引脚定义*sbit LcdRs= P25;sbit LcdRw= P26;sbit Lcd

16、En = P27;sfr DBPort = 0x80;/P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口/-接口函数-初始化:void LCD_Initial(void)设定坐标:void GotoXY(unsigned char x, unsigned char y)显示字符串: void Print(unsigned char *str)显示字符:LCD_Write(LCD_DATA,*str)清屏:LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN)4.2.2 DS1302的驱动程序#ifndef _TIMER_DS1302#define

17、 _TIMER_DS1302sbit DS1302_CLK = P15; /实时时钟时钟线引脚 sbit DS1302_IO = P16; /实时时钟数据线引脚 sbit DS1302_RST = P17; /实时时钟复位线引脚/-接口函数-初始化:void Initial_DS1302(void) /时钟芯片初始化写入数据:void Write1302(unsigned char ucAddr, unsigned char ucDa)/ucAddr: DS1302写的地址, ucData: 要写的数据读取数据:unsigned char Read1302(unsigned char ucAd

18、dr)/读取DS1302某地址的数据取时间:void DS1302_GetTime(SYSTEMTIME *Time) /获取时钟芯片的时钟数据到自定义的结构型数组转化为显示数据:void DateToStr(SYSTEMTIME *Time) /将时间年,月,日,星期数据转换成液晶显示字符串,放到数组里DateString转化为显示数据:void TimeToStr(SYSTEMTIME *Time) /将时,分,秒数据转换成液晶显示字符放到数组 TimeString;写RAM函数:void WriteRAM(unsigned char address,unsigned char *dat,

19、unsigned char n)读RAM函数:void ReadRAM(unsigned char address,unsigned char *dat,unsigned char n)4.2.3 闹钟蜂鸣的驱动程序void bz(int co,int h,int l) /co:蜂鸣节拍,h,l:蜂鸣音调 int i;for(i=1;i=co;i+)b=1;mdelay(h);b=0;mdelay(l);调用:bz(100,1,1);/蜂鸣节拍为100,音调为1khz。4.2.4 掉电状态保存设计写数据入RAM:Write1302(0x8e,0x00); /写入允许 WriteRAM(0,st

20、ralarm,9);Write1302(0x8e,0x80); /禁止写入*/读取RAM数据:ReadRAM(0,stralarm,9);ReadRAM(12,alarm_flag_sto,1);alarm_on=alarm_flag_sto0;5 .操作说明和显示界面设计LCM1602液晶显示模块电源指示灯5.1 整体总装图:单片机备用纽扣电池电源输入下载口电源开关上调设置下调退出秒表复位蜂鸣器5.2 操作说明5.2.1 时间,日期,闹钟的设置在时间显示界面下,每按一下“设置”键,依次对应的秒,分,时,星期,日,月,年会闪动,表示对应的属性正在设置,此时按下“上调”键,则数值增加1,按下“下

21、调”键,则对应的数值减1,按下“退出”键,则退出设置状态,回到时间显示界面。当设置到年份时,再按一下“设置”键则进入闹钟时间的设置状态,此时数字不闪动,但有“Alarm”提示正在进行闹钟时间设置,此时按下“设置”键为时加1,按下“上调”键为分加1,按下“下调”键则秒加1,按下“退出”键,则退出并保存设置状态,回到时间显示界面。时间,日期设置:2010 -1 -18 Week215: :05 当前设置分钟年-月-日星期闹钟的设置:. 00:00:00-Alarm-闹钟设置标记闹钟定时的时,分,秒-5.2.2 闹钟开/关的设置在时间显示界面下,每按一下“下调”,就会打开或关闭闹钟功能,对应地,当时

22、间界面出现“alarm”时表示闹钟“开”,界面不出现“alarm”时表示闹钟“关”。闹钟的时间和开/关状态具有掉电保存功能,即只需设置一次,掉电后无需再重新设置,上电后自动调出原先的设置。5.2.3 在闹钟蜂鸣时停止闹钟在时间显示界面下,当闹钟时间到时,蜂鸣器会有大约20秒的蜂鸣,液晶显示屏显示闹钟设置时间和提示“Alarm”,此时按下“退出”键则回到时间显示界面,并且蜂鸣器停止蜂鸣。闹钟时间到时的显示界面:.Alarm.15:41:05 闹钟设定的时间显示闹铃标记5.2.4 秒表的操作在时间显示界面下,按下“秒表”键,则进入秒表功能,按下“设置”键则开始计时,按下“上调”键则停止计时,按下“

23、下调”键则清零计时,按下“退出”键则退出并回到时间显示界面。秒表功能界面:-Stopwatch- 00:00:00:00计时的时,分,秒,毫秒秒表标记注:液晶显示模块默认显示的是时间界面:2010 -1 -18 Week215:41:05 alarm闹钟开/关标记当前时间显示年-月-日星期6 .讨论在本次课程设计过程中,虽然非常顺利地完成了软件和硬件的设计和仿真,并最终实现了题目所要求实现的功能。但还有可深入研究和可改进之处。在调试过程中,最让人头痛的是DS1302的驱动,除了注意时序以外,引脚的连接和抗干扰很重要,特别是使用了备份电池,当备份电池直接接在芯片第8脚时,芯片的发热量很大,温度上

24、升达到了100度左右,经过查看数据手册,我认为是电池容量超过了芯片涓细充电电流所容许的容量,于是在第8脚和备用电池之间串联了30欧姆的电阻,减小充电电流,消除了DS1302的发热问题但不影响备用电池的功能。需要改进的地方是按键和闹钟时间的设置。在实际的操作中,按键的反应很慢,原因是为了防抖而在程序中加入只有按键弹起才执行的程序,虽然防抖了,但按键反应迟钝,带来了操作上的不便。另一个是在闹钟时间的设计上没有“减一”功能,也给设置闹钟时带来了不便(好在闹钟不经常设置),这是出于存储空间的节省需要而设计的。如果再增加“减一”功能,代码的长度将会超出89S52的存储空间,解决办法是进一步优化程序,减小

25、代码。以上两方面在以后是需要进一步改进的。7 .总结从最终的作品来看,本电子钟具有如下优点:走时准确;掉电长时间(可达一年)后时间不需要重新设置;闹钟时间和开关状态具有掉电保存功能(掉电后无需重新设置);秒表功能计时准确,精确到1毫秒;功耗低,操作界面友好,操作简便;最大的特点是人性化的设计(如闹钟可以使用“快捷键”随时关闭开启,闹铃声音柔和而不刺耳,各种状态均显示提示语)。本课程设计从软件设计到仿真到硬件制作和调试,我收获不小。特别是在仿真编程和硬件调试方面。在编程过程中一直灌输给自己“编程是一种思想”,一定要用编程的思想去编程,如模块化思想,文件管理思想,头文件和接口函数的思想,设计程序时

26、要考虑到程序的可扩充性,兼容性,可维护性以及重用性,并归纳和总结各种功能算法,各种调度和事件驱动机制等等。在编程方面有了一定的进步。在使用仿真软件时得到了一些启示:仿真只是提供一个实现的大概参考,真正的功能实现仍需在实际硬件调试中完善。参考文献1 周兴华手把手教你学单片机C语言程序设计M北京:北京航空航天大学出版社,2007年2 张俊匠人手记.一个单片机工作者的实践与思考M北京:北京航空航天大学出版社,2008年3 张义和例说51单片机M北京:人民邮电出版社,2010年附录主要元器件清单:89S52单片机 DS1302实时时钟芯片LCM1602液晶显示模块蜂鸣器三极管9015,8050CR20

27、32纽扣电池(3V)轻触开关#include #include #include LCD1602.h#include DS1302.h#include string.h#define uint unsigned int#define uchar unsigned charsbit Set = P30; /模式切换键sbit Up= P31; /加法按钮sbit Down = P32; /减法按钮sbit out = P33; /立刻跳出调整模式按钮sbit stop_watch=P34;sbit b=P10;char done,count,temp,flag,up_flag,down_flag

28、;char settime_flag,stopwatch_flag,stopwatch_count=0;uchar alarm_on=0;uchar week_value2; uchar stop_watch_value= ,0,0,:,0,0,:,0,0,:,0,0,0;uchar stralarm=0,0,:,0,0,:,0,0,0,0x00;uchar DateStr3=0,0,0;uchar alarm_flag2=.,0;ucharalarm_flag_sto1=0x0;SYSTEMTIME CurrentTime;uchar minite=0;uchar second=0;ucha

29、r count_stop=0;uchar iii;void show_time(); /液晶显示程序void disp_alarm(void);void gettime(void);void trasfer(void)stop_watch_value4=minite/10+0x30;stop_watch_value5=minite%10+0x30;stop_watch_value7=second/10+0x30;stop_watch_value8=second%10+0x30;stop_watch_value10=count_stop/10+0x30;stop_watch_value11=co

30、unt_stop%10+0x30;void Delay1ms(unsigned int count)unsigned int i,j;for(i=0;icount;i+)for(j=0;j0;delay-) for(i=0;i62;i+) /1ms延时. ; void bz(int co,int h,int l) int i;for(i=1;i=co;i+)b=1;mdelay(h);b=0;mdelay(l);void disp_alarm(void) LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); /清屏GotoXY(0, 0);Print(alarm_f

31、lag);GotoXY(4, 0);Print(stralarm);GotoXY(0, 1);Print(-Alarm-); Delay1ms(400); void fz(void)int i;if(alarm_on=1)if(strncmp(CurrentTime.TimeString,stralarm,7)=0)for(i=0;i0x59) /超过59秒,清零 temp=0; break; case 2: temp=Read1302(DS1302_MINUTE); /读取分数 temp=temp+1; /分数加1 up_flag=1; if(temp0x59) /超过59分,清零 temp

32、=0; break; case 3: temp=Read1302(DS1302_HOUR); /读取小时数 temp=temp+1; /小时数加1 up_flag=1; if(temp0x23) /超过23小时,清零 temp=0; break; case 4: temp=Read1302(DS1302_WEEK); /读取星期数 temp=temp+1; /星期数加1 up_flag=1; if(temp0x7) temp=1; break; case 5: temp=Read1302(DS1302_DAY); /读取日数 temp=temp+1; /日数加1 up_flag=1; if(t

33、emp0x31) temp=1; break; case 6: temp=Read1302(DS1302_MONTH); /读取月数 temp=temp+1; /月数加1 up_flag=1; if(temp0x12) temp=1; break; case 7: temp=Read1302(DS1302_YEAR); /读取年数 temp=temp+1; /年数加1 up_flag=1; if(temp0x85) temp=0; break; default:break; while(Up=0); /void Downkey()/降序按键 Down=1; if(Down=0) mdelay(8); switch(count) case 1: temp=Read1302(DS1302_SECOND); /读取秒数 temp=temp-1; /秒数减1 down_flag=1; /数据调整后更新标志 if(temp=0x7f) /小于0秒,返回59秒 temp=0x59; break; case 2: temp=Read1302(DS1302_MINUTE

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

当前位置:首页 > 办公文档 > 其他范文


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号