《课程设计-定时闹钟(共21页).doc》由会员分享,可在线阅读,更多相关《课程设计-定时闹钟(共21页).doc(21页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上XXX大学单片机原理与应用课程设计报告(此处为图片)题 目 定时闹钟的设计 姓 名 院 系 专 业 指导教师 职 称 2014年1月1日专心-专注-专业单片机原理与应用课程设计任务书课程设计题目定时闹钟的设计院(系)物理工程学院专 业通信工程指导教师职 称设计组成员姓 名年 级学 号总体设计;一、课程设计内容及任务1、利用单片机、日历芯片、LCD和按键设计一定时闹钟。2、闹钟可以设置当前时间、闹铃时间。3、闹铃时间到,发出提示音。4、闹铃同时单片机驱动继电器闭合,控制家电的开启或关闭。5、其他功能。二、拟达到的设计要求或主要技术指标1、LCD可显示当前时间(包括年月日
2、时分秒)。2、可自由设置当前时间(包括年月日时分秒)。3、可自由设置闹钟时间,并且准点报时。4、闹钟启动时单片机可控制继电器驱动家电打开。5、闹钟关闭时家电关闭,停止闹铃。6、其它功能为LCD欢迎人性化界面、闹钟音乐铃声、闹钟音乐闪烁灯。三、课程设计总体方案与进度安排 1、前期做好系统的设计工作。 2、按照计划绘制Proteus仿真电路图。 3、编写程序。4、按照仿真电路图焊接电路板。5、烧录程序,进行实体调试。学生签名: 年 月 日 四、指导教师意见指导教师签名: 年 月 日 单片机原理与应用课程设计评阅表评分项评价内容满分得分设计过程1. 任务分工的合理性和对待课程设计的态度52. 团队协
3、作能力和分析解决问题的能力5软件仿真3. 系统仿真电路设计的合理性与可行性104软件编程与仿真结果的正确性15系统制作5. 系统板制作的难度106. 元器件布局的合理性及焊接的规范性15验收答辩7. 系统功能演示、完成程度及创新性158. 知识掌握程度与回答问题的正确性5设计报告9. 系统设计的合理性与内容的科学性、创新性1010. 文字表达水平、文章的逻辑性与写作规范10合 计100一、指导教师评语:指导教师签名: 年 月 日 二、课程设计等级 指导教师签名: 年 月 日 注:课程设计等级:优秀(90-100),良好(80-89),中等(70-79),及格(60-69),不及格(60分以下)
4、。目 录定时闹钟的设计指导教师 摘要:随着社会的发展人们的生活节奏越来越快,每天的工作,学习,休息的时间都安排的很紧,需要一个时钟准确的报时。人们对时钟的要求越来越高,不仅要求每天的的时间误差小于几毫秒,还要求具有定时闹钟,具有万年历等功能。传统的日历电子钟元器件多、维修麻烦、误差大、功能更新不方便。DS12C887时钟芯片能够自动显示年、月、日、时、分、秒等时间信息,同时还具有校时,报时,闹钟等功能。DS12C887也可以很方便的由软件编程进行功能的调整或增加。所以设计基于DS12C887时钟芯片和LCD1602液晶显示的高精度时钟的设计具有十分重要的现实意义和实用价值。关键词:DS12C8
5、87,LCD1602,时钟芯片,单片机STC89C52,高精度时钟The design of the timing alarm clockStudent majoring in Communication Engineering Tutor Abstract:With the development of society, people life rhythm faster and faster, a days work, study and rest time arrangement is very tight, need a clock tell the time accurately.
6、People is higher and higher requirement for the clock, every day not only requires the time error is less than a few milliseconds, also requires a timing alarm clock, a calendar, and other functions. Traditional electronic clock calendar components, maintenance trouble, big error, function more upda
7、te is not convenient. Chip DS12C887 clock automatically display year, month, day, hours, minutes and seconds time information, but also with the school, the time, alarm clock, and other functions. DS12C887 can also be very convenient by the software programming to adjust function or to increase. So
8、the design is based on DS12C887 clock chip and LCD1602,the design of high precision clock has very important practical significance and practical value.Key words: DS12C887,LCD1602,clock chip microcontroller STC89C52,high-precision clock引言 传统时钟芯片在电源断电时内部的时间芯片就会停止计时,所以需要额外使用一个备用的电源向时钟芯片供电,这样会使系统功耗增大,体
9、积变大。单一功能定时时钟只提供年,月,日,时,分,秒的时间信息和日历功能,多功能时钟除了提供时间信息和日历功能以外,通常还具有报警,定时,闹钟等功能。采用单片机STC89C52和时钟日历芯片DS12C887设计并且制作出来的电子钟,一个月的时间里只有1秒内的误差1,比DS1302,DS1307,PCF8485等的芯片设计出来的时钟更精确2时钟按照工具接口方式不同可以分为并行接口时钟和串行接口时钟,并行接口时钟的特点是:传输速度快,但是硬件数目多,接线数目多,产品体积大。串行接口时钟的特点:传输线少,成本低,产品体积小。缺点是传输速度慢。时钟芯片的种类也越来越多,对时钟芯片的要求越来越高,比如精
10、度高,体积小,功耗低,性能稳定,功能齐全,使用方便,技术更新灵活。所以设计一款体积小,工作稳定,时间精确的时钟具有十分重要的意义。1 设计任务与方案选择11 设计任务与指标 通过单片机,DS12C887高精度时钟芯片,LCD1602液晶显示屏制作一可自由调节当前时间与闹钟时间的定时闹钟。在闹钟启动的同时控制继电器驱动家电的打开,闹钟取消时则关闭家电。111 设计任务1、利用单片机、日历芯片、LCD和按键设计一定时闹钟。2、闹钟可以设置当前时间、闹铃时间。3、闹铃时间到,发出提示音。4、闹铃同时单片机驱动继电器闭合,控制家电的开启或关闭。5、其他功能。112 设计指标 1、LCD可显示当前时间(
11、包括年月日时分秒)。2、可自由设置当前时间(包括年月日时分秒)。3、可自由设置闹钟时间,并且准点报时。4、闹钟启动时单片机可控制继电器驱动家电打开。5、闹钟关闭时家电关闭,停止闹铃。6、其它功能为LCD欢迎人性化界面、闹钟音乐铃声、闹钟音乐闪烁灯。12 系统方案选择121 时钟计时的方案选择 方案一:传统的基于单片机的时钟设计可以采用单片机内部的晶振来产生脉冲,然后通过单片机内部的计时器经过分频产生秒脉冲,然后通过软件编程来实现时钟的显示,这种设计方案的优点是外围器件少,电路简单清晰,电路焊接容易,出问题的故障几率小。但是这种方案需由软件编程来实现秒脉冲的产生,编程相对来说比较复杂,而且也不利
12、于排除故障,维修起来不方便。由于单片机内部时钟会产生误差,即使设计时间误差补偿程序也很难实现提供准确时间的功能。这种设计还有一个非常大的缺点就是如果单片机断电,芯片里的时间计时就停止,再次上电时又从初始设定重新计时,这样就需要在每次上电都调整时间,相对较为麻烦。 方案二:在传统的基于单片机的数字时钟设计的基础上经过一些改进,引入DS12C887时间芯片,本次设计可分为两部分:硬件部分包括:体积小功能丰富的STC89C52单片机、具有掉电保护的DS12C887时钟芯片电路简单易于实现的1602LCD液晶显示器,键盘输入电路等。具体说来,系统智能控制部分由单片机及其相关的外围电路组成,外围电路包括
13、解决死机等问题的复位电路、波形稳定的晶振电路、键盘设计、闹铃电路以及合适的直流电源电路。利用单片机将复位电路、能够降低功耗和减少显示器外部引线的显示电路、电源电路等正确的连接在一起,并通过单片机的编程来实现本次设计任务中的要求。软件部分主要包括了主程序模块,DS12C887模块,LCD1602模块,键盘控制模块。DS12C887芯片具有掉电保护功能,内部自带锂电池,能够在断电的情况下保持时间信息,等到外部电路恢复供电之后能够不必调整时间,为时钟的校时操作节省了很多时间,而且这种设计更节能,在需要观察时间的时候比如白天就可以给主电路通电。而在夜晚不需要观察时钟的时候就可以给主电路断电,这样可以节
14、约大量电能。 时间芯片DS12C887采用了内部集成晶振的电路,并且具有内部温漂补偿电路设计。能够准确计时,提供精确的时间,这样就简化了电路的器件选择,另外也使程序的设计更加简洁。在硬件设计方面,由于只增加了一个DS12C887时间芯片,因此并不是特别复杂,而且这种独立计时的设计使得产品排故更加方便。第二种方案更加准确而且电路硬件设计更加简单,软件设计更加简洁,因此采用第二种方案。122 显示部分的方案选择方案一:数码管显示,8段数码管显示虽不需要复杂的驱动程序,可视范围宽,但硬件制作成本高,硬件电路的设计复杂。方案二: LCD1602 液晶显示,液晶显示最大的特点就是界面简洁,已经广泛应用于
15、现代工业控制和智能化仪器仪表等地方,己经成为单片机开发领域典型模块之一。能够方便的显示文字和数字。LCD1602液晶显示时屏幕不会有闪烁。液晶操作方便,且与单片机的接口电路简单,接线面积小,大大提高了万年历的性能。所以最终选择LCD1602液晶显示方案。2 系统设计21 系统总体设计方案本LCD定时闹钟,是以单片机及外围接口电路为核心硬件,辅以其他外围硬件电路,用C语言设计的程序来实现的。根据C51单片机的外围接口特点扩展相应的硬件电路,然后根据单片机的指令设计出数字钟相应的软件,再利用软件执行一定的程序来实现数字钟的功能。由于采用集成芯片性的单片机来制作电子钟,这样设计制作简单而且功能多、精
16、确度高,也可方便扩充其他功能,实现也十分简单。本设计是利用STC89C52单片机为主控芯片,由LCD1602、DS12C887、晶振、电阻、电容、发光二极管、按键、蜂鸣器等元件组成硬件电路,通过Keil 4编写软件程序来实现和控制的数字定时闹钟。在明确本次设计思路之后,画出设计框图,总体框图如图所示。图2-1211 系统硬件设计 主控芯片STC89C52的设计在本LCD电子闹钟设计中就是采用利用我们熟悉的STC89C52单片机为主控芯片。STC89C52单片机由微处理器,存储器,I/O口以及特殊功能寄存器SFR等部分构成。其存储器在物理上设计成程序存储器和数据存储器两个独立的空间。89C52单
17、片机有4个8位的并行I/O口:P0口,P1口,P2口和P3口。各个接口均由接口锁存器,输出驱动器,和输入缓冲器组成。P1口是唯一的单功能口,仅能用作通用的数据输入/输出口。P3口是双功能口除了具有数据输入/输出功能外,每条接口还具有不同的第二功能,如P3.0是串行输入口线,P3.1口是串行输出口线。在需要外部程序存储器和数据存储器扩展时,P0可作为分时复用的低8位地址/数据总线,P2口可作为高8位的地址总线。P3口也可作为STC89C52的一些特殊功能口,同时为闪烁编程和编程校验接收一些控制信号。时钟电路部分设计DS12C887具有DS12R885裸片,32.768HZ石英晶体和一个可充电电池
18、三个部分, DS12C887与计算机常用的时钟芯片MCB和DS12887管脚兼容,同时可直接替换可以用来直接代替IBM PC上的时钟日历芯片DS12887。采用DS12C887芯片设计的时钟电路有良好的微机接口,并且不需要任何外围电路和器件。时钟芯片DS12C887具有如下的特征:(1)DS12C887里面自带一个锂电池,外部掉电时,内部信息还能保持10年的时间,保证不丢失数据。(2)能够自动产生秒、分、时、天、星期、日、月、年、世纪等时间信息, 并有闰年补偿功能。其内部还增加了世纪寄存器,利用硬件电路解决了“千年”问题。(3)具有二进制数码和BCD码两种表示时间的方法、具有日历和定时闹钟功能
19、。(4)一天内的时间记录具有12小时制和24小时制两种,12小时时钟模式中,具有PM和AM用来区分上午和下午。同时可选用夏令时模式;(5)有128个RAM单元与软件接口,其中有11字节RAM用来存储时间信息,4字节RAM用来存储DS12C887的控制信息,称为14个作为字节时钟和控制寄存器,113字节通用RAM使用户使用。(6)用户还可对DS12C887进行以实现多种方波输出,并可对其内部的三路中断通过软件进行屏蔽。 DS12C887引脚功能引脚符号功能说明1MOT模式选择引脚,接Vcc时,选择的是Motorola的总线时序;当接地或悬空,选择的是Intel总线时序4-11AD0-AD7双向地
20、址/数据总线12GND接地13CSDS12887的芯片选选通信号,必须在CS有效的状态下,Motorola时序中数据或地址才可以选通或Intel时序中读写信号才可以有效。14AS地址选通,一个高电平的地址选通信号提给总线时,在AS脉冲的下降沿,DS12887选通地址。15R/W读写信号,有两种操作模式。当MOT引脚接Vcc选择Motorola时序,当MOT接地选择的是Intel时序。17DS数据选通或读出,根据模式选择的不同,DS引脚有两种不同的操作模式。18RESETRESET引脚对时钟,日历,RAM没有影响。在上电时,RESET能一直保持低电平使系统保持稳定。19IRQ中断请求,在DS12
21、887中IRQ是一个低有效信号,它能对处理器发出一个中断信号。23SQW方波输出引脚24VCC接电源(+5V)注:其中NC代表空脚。进入主程序后,DS12C887首先进行初始化设置,当串行口有数据时,则调用函数从日历时钟芯片获取日历时钟信息,调用显示函数显示日历时钟信息显示出来,重复进行。这部分包括DS12C887某个单元写、读DS12C887某个单元的内容和DS12C887设定时间。DS12C887的流程图如图所示。 图2-2 DS12C887读写时序开始DS12C887初始化 调用函数获取时钟信息 送数据显示 图2-3 DS12C887的流程图212 系统软件设计采用keil 4编写本次课
22、程设计的程序,由proteus进行软件电路仿真。仿真电路图与源程序请详见附录一、附录二。3 系统调试31 时间显示 第一行分别为年、月、日、星期(星期一MON、星期二THU、星期三WED、星期五FRI、星期六SAT、星期天SUN);第二行分别显示时、分、秒。32 调节时间按下“功能键”进入调时状态,光标闪烁,此时按动“增加键”或“减小键”进行时加或时减,再按“功能键”依次循环,直到调时结束。33 设置闹钟按下“闹钟键”进入闹钟设置状态,光标闪烁,此时按动“增加键”或“减小键”进行时加或时减,再按“功能键”依次循环,直到闹钟设置结束。34 复位 此次电路设计采用的是上电复位,如需复位则只需要断电
23、之后重新给系统供电即可。 4 总结 41 设计过程中遇到的问题及解决方法问题主要有液晶的不正常显示,通过与同学的交流用万用表检查电路最终使液晶正常工作。由于时间比较紧,本设计虽然基本完成了预期的目标,但是设计成果并不是很完美,还存在很多问题。在本次设计中,从采集元件、软件设计、硬件焊接,外观到论文的编写都是查阅了大量的资料后确定,再经老师指导,最后经过多天的不断努力才完成的。在这次课程设计中,我切身感受到了动手实践的重要性,这对我以后的学习工作将产生深远的影响。42 设计体会设计是培养学生综合运用所学知识,发现、提出、分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和
24、考察过程。随着科学技术发展的日新日异,单片机已经成为当今计算机应用中空前活跃的领域,在生活中可以说得是无处不在,作为二十一世纪的大学生来说掌握单片机的开发技术是十分重要的。通过本次单片机原理及应用设计使我充分认识到了设计的重要性和必要性,本次设计使我对已学过的基础知识有了更深入的理解,学会了独立思考、独立工作以及对应用所学基本理论分析和解决实际问题的能力有了很大的提高。另外,本次设计使我的实际操作技能得到了训练, 同时也进一步培养了我严谨的科学作风。回顾起此次单片机课程设计,从选题到定稿,从理论到实践,可以说得是有苦有甜,但是从中却学到很多很多的的东西,不但巩固了以前所学过的知识,而且对单片机
25、原理课外知识也得到了拓展。做的过程中,开始的确遇到了不少困难的问题,比如说芯片管脚不熟悉怎么放置等,同时在这过程中也发现了自己的许多不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。 通过单片机设计之后,我不仅加深了对单片机理论的理解,将理论很好地应用到实际当中去,而且我们还学会了如何去培养创新精神和严谨的科学作风,从而不断地战胜自己,超越自己。更重要的是,我在这一设计过程中,学会了坚持不懈,绝不放弃。参考文献:1 陈海晏.51单片机原理及应用(第2版)基于Keil C和ProteusM. 北京:北京航空航天大学出版社,2013.3.2 郭天祥.新概念51单片机C语言教程 入门、提高
26、、开发、拓展全攻略M.北京:电子工业出版社,2009.3 谭丙煜.怎样撰写科学论文M.2版.沈阳:辽宁人民出版社,1982:5-6.4 彭伟. 单片机C语言程序设计实训100例M.北京:电子工业出版社,2011附录AProteus仿真图(将该图片另存为BMP格式可以看得更清楚)附录B源程序:#include#define uchar unsigned char #define uint unsigned intuchar code SONG_TONE=212,212,190,212,159,169,212,212,190,212,142,159,212,212,106,126,159,169,
27、190,119,119,126,159,142,159,0;uchar code SONG_LONG=9,3,12,12,12,24,9,3,12,12,12,24,9,3,12,12,12,12,12,9,3,12,12,12,24,0;sbit s1=P30; /选择键sbit s2=P31; /增加键sbit s3=P32; /减小键sbit s4=P36; /闹钟键sbit rs=P35;sbit lcden=P34;sbit beep=P23; /蜂鸣器sbit deng=P10;sbit dscs=P14;sbit dsas=P15;sbit dsrw=P16;sbit dsds=
28、P17;sbit dsirq=P33;sbit ds=P22;bit flag1,flag_ri; /标志位uchar i,count,s1num,flag,t0_num,numtime1,numtime2;char miao,shi,fen,year,month,day,week,amiao,afen,ashi;uchar code table= - - ;/液晶固定显示内容uchar code table1= : : ;uchar table10= HELLO! ;uchar table11=BEST WISH TO YOU;void write_ds(uchar,uchar);void
29、set_alarm(uchar,uchar,uchar);void read_alarm();uchar read_ds(uchar);void set_time();void delay(uint z)/延时函数uint x,y;for(x=z;x0;x-)for(y=110;y0;y-);void di() /蜂鸣器报警声音beep=0;delay(500);beep=1;void DelayMS(uint x) /播放音乐uchar t;while(x-) for(t=0;t120;t+);void PlayMusic()uint a=0,j,k;while(SONG_LONGa!=0|
30、SONG_TONEa!=0) /播放各个音符,SONG_LONG 为拍子长度for(j=0;jSONG_LONGa*20;j+)beep=beep;if(s1=0)|(s2=0)|(s3=0)|(s4=0)delay(5);if(s1=0)|(s2=0)|(s3=0)|(s4=0)while(!(s1&s2&s3&s4); di();deng=1;flag_ri=0;/清除报警标志return; /SONG_TONE 延时表决定了每个音符的频率for(k=0;kSONG_TONEa/3;k+);DelayMS(10);a+;void write_com(uchar com)/写液晶命令函数rs
31、=0;lcden=0;P0=com;delay(3);lcden=1;delay(3);lcden=0;void write_date(uchar date)/写液晶数据函数rs=1;lcden=0;P0=date;delay(3);lcden=1;delay(3);lcden=0;void init()/初始化函数uchar num;EA=1;/打开总中断EX1=1;/开外部中断1IT1=1;/设置负跳变沿触发中断flag1=0;/变量初始化t0_num=0;s1num=0;week=1;lcden=0;write_ds(0x0A,0x20);/打开振荡器write_ds(0x0B,0x26
32、);/设置24小时模式,数据二进制格式/开启闹铃中断set_time();/设置上电默认时间write_com(0x38);/1602液晶初始化write_com(0x0c);write_com(0x06);write_com(0x01);write_com(0x80+4);for(i=0;i9;i+)write_date(table10i);delay(2);write_com(0x80+0x40);for(i=0;i16;i+)write_date(table11i);delay(2);delay(2000);write_com(0x01);write_com(0x80);for(num=
33、0;num15;num+)/写入液晶固定部分显示write_date(tablenum);delay(1);write_com(0x80+0x40);for(num=0;num11;num+)write_date(table1num);delay(1);write_com(0x80+1);write_date(0x30+2);write_com(0x80+2);write_date(0x30+0);write_com(0x80+12);write_date(M);write_date(O);write_date(N);void write_sfm(uchar add,char date)/16
34、02液晶刷新时分秒函数4为时,7为分,10为秒char shi,ge;shi=date/10;ge=date%10;write_com(0x80+0x40+add);write_date(0x30+shi);write_date(0x30+ge);void write_nyr(uchar add,char date)/1602液晶刷新年月日函数3为年,6为分,9为秒char shi,ge;shi=date/10;ge=date%10;write_com(0x80+add);write_date(0x30+shi);write_date(0x30+ge);void write_week(char
35、 we)/写液晶星期显示函数write_com(0x80+12);switch(we)case 7:write_date(M);delay(5);write_date(O);delay(5);write_date(N);break;case 1:write_date(T);delay(5);write_date(U);delay(5);write_date(E);break;case 2:write_date(W);delay(5);write_date(E);delay(5);write_date(D);break;case 3:write_date(T);delay(5);write_da
36、te(H);delay(5);write_date(U);break;case 4:write_date(F);delay(5);write_date(R);delay(5);write_date(I);break;case 5:write_date(S);delay(5);write_date(A);delay(5);write_date(T);break;case 6:write_date(S);delay(5);write_date(U);delay(5);write_date(N);break;void keyscan()if(flag_ri=1)/这里用来取消闹钟报警,任一键取消报警
37、if(s1=0)|(s2=0)|(s3=0)|(s4=0)delay(5);if(s1=0)|(s2=0)|(s3=0)|(s4=0)while(!(s1&s2&s3&s4); di();deng=1;flag_ri=0;/清除报警标志 write_com(0x01); if(s1=0)/检测S1delay(5);if(s1=0)s1num+;/记录按下次数if(flag1=1)if(s1num=4)s1num=1;flag=1;while(!s1);di();switch(s1num)/光标闪烁点定位case 1: write_com(0x80+0x40+10); write_com(0x0
38、f);break;case 2: write_com(0x80+0x40+7);break;case 3: write_com(0x80+0x40+4);break;case 4: write_com(0x80+12);break;case 5: write_com(0x80+9);break;case 6: write_com(0x80+6);break;case 7: write_com(0x80+3);break;case 8: s1num=0;write_com(0x0c);flag=0;write_ds(0,miao);write_ds(2,fen);write_ds(4,shi);
39、write_ds(6,week);write_ds(7,day);write_ds(8,month);write_ds(9,year);break;if(s1num!=0)/只有当S1按下后,才检测S2和S3if(s2=0)delay(1);if(s2=0)while(!s2);di();switch(s1num)/根据功能键次数调节相应数值case 1:miao+;if(miao=60)miao=0;write_sfm(10,miao);write_com(0x80+0x40+10); break;case 2:fen+;if(fen=60)fen=0;write_sfm(7,fen);wr
40、ite_com(0x80+0x40+7); break;case 3:shi+;if(shi=24)shi=0;write_sfm(4,shi);write_com(0x80+0x40+4); break;case 4:week+;if(week=8)week=1;write_week(week);write_com(0x80+12);break;case 5:day+;if(day=32)day=1;write_nyr(9,day);write_com(0x80+9);break;case 6:month+;if(month=13)month=1;write_nyr(6,month);write_com(0x80+6);break;case 7:year+;if(year=100)year=0;write_nyr(3,year);write_com(0x80+3);break;