毕业设计(论文) (2017届)
设计(论文)题目 基于单片机的电子时钟系统
系 部信息与机电工程学院 专 业 班 级 学 号 姓 名 起 讫 日 期 指导教师龚伟吴学付 职称讲师 工程师
2017年 4月 18日
摘 要 在当今时代,随着社会的进步和计算机技术的不断发展,单片机技术在不断的应用到各行各业,单片机具有功能强大,功耗低,体积小,价格便宜等优点,本文设计的电子时钟系统是一个以单片机AT89C51为核心,并结合相关的电子元器件和应用程序构成的一个应用系统。本系统具有时间显示、字符显示和调整时间的功能,与传统的机械表相比,它具有显示直观、走时精确等特点。适用于家庭、办公室等场所。 本文详细地论述了电子时钟的设计方案以及各种元器件的介绍,本文主要是软硬件相结合,以硬件为基础,并进行各个模块编写。本系统以C语言进行软件设计,并着重介绍了所使用的各个硬件接口技术以及各个接口的功能和工作过程。其次,阐述了各个程序的模块和实现过程,最后进行了软件仿真和调试。
关键词:电子时钟 单片机 液晶显示 仿真
目录 绪 论 1 第一章 设计说明 2 1.1 设计目的 2 1.2 设计方案选择 2 1.3系统框架图 2 第二章 系统硬件设计 3 2.1 AT89C51芯片介绍 3 2.1.1 AT89C51芯片简介 3 2.1.2 封装和引脚说明 3 2.2 显示模块 4 2.2.1 LCD1602模块简介 4 2.2.2 LCD1602的控制指令及操作流程 5 2.3系统电路 7 2.3.1时钟电路 7 2.3.2复位电路 8 2.3.3按键电路 8 2.4系统电路图 9 第三章 系统软件设计 10 3.1 系统程序流程图 10 3.2系统主要程序 11 3.3系统程序 13 第四章 系统调试 14 4.1 Keil软件 14 4.2 Proteus软件仿真 15 第五章 结论与展望 17 5.1 结论 17 5.2 数字时钟的发展趋势 17 结 语 18 参考文献 19 致 谢 20 附录Ⅰ 21 附录Ⅱ 22
绪 论电子时钟是现代社会必不可少的生活用品,随着科学技术和经济的发展,人们的生活水平不断提高,因此对时钟的要求也越来越高,时钟的功能也越来越多。最初的时钟利用机械式的指针来显示时间,而在晚上的时候要通过灯光才能看到时间,而电子时钟无论在白天还是晚上,都可以显示时间,因此给人们带来极大的便利,广泛应用于家庭、办公室等场所。 本文提出了一种基于AT89C51单片机的电子时钟系统,以AT89C51为控制核心,和按键、液晶显示等模块组成了一个完整的硬件系统,可显示字符和时间,还可以根据使用者的需要可以随时对时间进行校对。 综上所述,基于AT89C51的电子时钟系统具有显示直观、成本低、功能实用、电路简单等优点,具有广阔的市场前景。
第一章 设计说明 1.1 设计目的本文目的为了设计出一个基于AT89C51单片机的电子时钟系统,通过单片机和LCD液晶显示屏来实现24小时制的时钟显示和调时功能。通过本次设计巩固以前学的单片机知识,并进行一定的创新,使自己掌握单片机知识,并能将所学的知识应用到实际生活中,提高自己的动手能力。该系统电路较为简单,易于实现,可控性好,操作简单。 1.2 设计方案选择(1)单片机选型 选用AT89C51单片机,指令简单,易学易懂,外围电路简单,硬件设计方便,IO口操作简单,成本低,程序烧写简单,对于设计开发非常实用。 (2)显示方案 LCD液晶显示器是一种功耗极低的显示器件,它不仅省电,还能显示文字、曲线、图形等大量的信息,易于彩色化,所以采用LCD显示器来显示时间。 (3)计时方案 利用AT89C51内部定时/计数器进行中断定时,配合软件延时实现时分秒的计时。该方案可以节省硬件成本。 (4)按键设计 系统采用独立式按键,共设计了三个按键,分别是“设置”、“+”、“-”,用来设置校时功能,这样可以使电路更简单。 1.3系统框架图电子时钟系统的框架图如图1-1所示: file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsDC6B.tmp.jpg 图1-1 系统框架图
第二章 系统硬件设计 2.1 AT89C51芯片介绍2.1.1 AT89C51芯片简介 AT89C51单片机是美国ATMEL公司生产的一种微型计算机芯片,具有高性能、低功耗、低成本等优点。它是EPROM和EEPROM技术有机结合的产物。其既具有EPROM一样的可编程能力,又带有象EEPROM的电可擦除性能,而且还具有不挥发性、访问速度快 (约 60ns)和密度高等特点。由于以上优点使AT89C51可靠性高、实时性好、速度快、系统掉电后重要数据和状态信息不会丢失,其性能价格比远高于同类芯片。它与MCS-51指令系统兼容,片内FPEROM允许对程序存储器在线重复编程,也可用常规的EPROM编程器编程,可循环写入/擦除1000次。 AT89C51芯片的主要特点:具有4K字节可编程闪烁存储器,数据可保留10年,可进行1000写和擦循环,RAM为128*8位,有两个16位的定时器/计数器。
2.1.2 封装和引脚说明 AT89C51单片机的引脚图如图2-1所示,其中P3口作为特殊功能口,备选功能如表2-1所示。 file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsDC6C.tmp.jpg 图2-1 AT89C51单片机引脚图
表2-1 P3特殊功能口
2.2 显示模块2.2.1 LCD1602模块简介 LCD1602字符点阵液晶显示器是一种功耗极低的显示器件,工作电压为5V,可以显示2行16个字符,它不仅省电,而且能够显示文字、曲线、图形等大量信息。其主要特点有:低压微功耗、平板型结构、被动显示、显示信息量大、易于色彩化、寿命长。广泛应用于便携式电子产品中。LCD1602的外部引脚图如图2-2所示,该模块有16个引脚,各引脚功能如表2-2所示。
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsDC6D.tmp.jpg 图2-2 LCD1602外部引脚
表2-2引脚功能 引脚号 | | | | | | | | | | | | | | 数据和指令选择控制器,RS=0:命令/状态;RS=1:数据 | | | | | | 数据读写操作控制位,E线向LCD模块发送一个脉冲,LCD模块与单片机之间将进行一次数据交换 | | | 数据线,可以用8位连接,也可以用高4位连接,节约单片机资源 | | | | | | |
2.2.2 LCD1602的控制指令及操作流程 LCD1602液晶显示屏内部的控制器共11条控制指令,其控制命令如表2-3所示。它的读写操作、光标的操作和屏幕都是通过指令编程来实现的。(注:1为高电平、0为低电平) 表2-3 控制命令表 file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsDC7E.tmp.jpg LCD1602可以在8根I/O线上来读写数据,因此LCD的控制器接口有严格的通信协议来保证其读写数据传输的正确性和完整性。1602字符LCD基本操作有四种: (1)读状态:输入信号:RS=0,RW=1,E=1 输出信号:D0~D7=状态字 (2)读数据:输入信号:RS=1,RW=1,E=1 输出信号:D0~D7=数据 (3)写指令:输入信号:RS=0,RW=0,E=1->0 输出信号:D0~D7=指令 (4)写数据:输入信号:RS=1,RW=0,E=1->0 输出信号:D0~D7=数据 其读写信号的操作时序如图2-3所示,电路连接图如2-4所示。
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsDC7F.tmp.jpg 图2-3 LCD1602的基本操作流程
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsDC80.tmp.jpg 图2-4 LCD1602的电路连接图
2.3系统电路2.3.1时钟电路 时钟电路为单片机的工作提供基本时钟,在单片机内部有一个高增益反向放大器,其输入端引脚为XTAL1,输出端引脚为XTAL2。只要在XTAL1和XTAL2之间跨接晶体振荡器和微调电容,就就可以构成一个稳定的自激振荡器,产生单片机工作所需要的时钟信号。如图2-5所示就是振荡电路,晶振频率越高,系统的运行速度也就越快,本设计中选用了11.0592MHz的晶振。
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsDC81.tmp.jpg 图2-5 时钟振荡电路
2.3.2复位电路 无论是在单片机刚开始接电源的时候,还是断电或发生故障后都要进行复位。单片机复位使CPU和系统中的其他功能器件都要恢复到一个确定的初始状态,并从这个状态开始工作。如图2-6所示为按键复位电路,通过按键实现复位,在接电瞬间,按键端的电位与Vcc相同,随着充电电流的减少,RET的电位逐渐下降,当按下按键时,电源Vcc经电阻分压,在RST端产生一个复位高电平。
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsDC82.tmp.jpg 图2-6 复位电路
2.3.3按键电路 本系统采用的是独立式按键,直接用I/O口线来构成简单的一个按键电路,按键的开关状态是通过一定的电路转换为高、低电平状态。 它也是整个系统中最简单的部分,根据功能要求,本系统设计三个按键:功能选择键、功能加键和功能减键(如图2-7所示)。 P3.0口接开关K1表示功能选择键,选择要调整的时、分﹑秒; P3.1口接开关K2表示“加”键,按一下则对应的数字加1; P3.2口接开关K3表示“减”键,按一下则对应的数字减1。
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsDC83.tmp.jpg
图2-7 按键电路
2.4系统电路图数字时钟系统电路图请见附件Ⅰ。
第三章 系统软件设计 3.1 系统程序流程图用AT89C51单片机通过程序控制的方式来产生时间信号,利用P0口将时间信息显示在LCD1602液晶显示屏上。刚开始的时候,程序进行标识位初始化,并且对时钟单元初始化,开始读取单片机上的时间信息,通过对程序的读取,在液晶显示器上就可以显示时间。当有按键按下的时候进行键值的处理,如果没有按键按下,程序则重新读取时间信息。系统程序流程图如图3-1所示。
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsDC94.tmp.jpg 图3-1 系统程序流程图 3.2系统主要程序数字电子时钟系统是基于C语言的在LCD液晶显示器上显示HH.MM.SS(时分秒),按键1选择调整时间,按键2将增加时间,按键3将减少时间。该系统主要通过以下函数来实现功能: 3.2.1中断函数 函数timer0实现提供时间功能 void timer0() interrupt 1 //定时器中断,提供时间 { TH0=(65536-50000)/256; TL0=(65536-50000)%256; count++; if(count==18) { count=0; miao++; if(miao==60) { miao=0; fen++; if(fen==60) { fen=0; shi++; if(shi==24) { shi=0; } } display(5,shi); //送液晶显示 } display(8,fen); } display(11,miao); }
3.2.2延时函数
函数delay(uint x)实现的延时功能。 delay(uint x) { uint i,j; for(i=x;i>0;i--) for(j=110;j>0;j--); }
3.2.3键盘扫描函数
函数keyscan实现时间的调整功能 void keyscan() ///键盘扫描函数, { uchar num; if(key1==0) { delay(5); if(key1==0) { num++; while(key1==0); switch(num) { case 1:TR0=0;write_com(0x80+0x40+11);write_com(0x0f);break; case 2:write_com(0x80+0x40+8);break; case 3:write_com(0x80+0x40+5);break; case 4:TR0=1;num=0;write_com(0x0c);break; } } } if(num!=0) { if(key2==0) { delay(5); if(key2==0) { while(!key2); switch(num) { case 1:miao++; if(miao==60)miao=0;display(11,miao); write_com(0x80+0x40+11);break; case 2:fen++; if(fen==60)fen=0;display(8,fen); write_com(0x80+0x40+8);break; case 3:shi++; if(shi==24)shi=0;display(5,shi); write_com(0x80+0x40+5);break; } } } if(key3==0) { delay(5); if(key3==0) { while(!key3); switch(num) { case 1:if(miao==0)miao=60;miao--; display(11,miao);write_com(0x80+0x40+11);break; case 2:if(fen==0)fen=60;fen--; display(8,fen);write_com(0x80+0x40+8);break; case 3:if(shi==0)shi=24;shi--; display(5,shi);write_com(0x80+0x40+5);break; } } } } }
3.2.4显示函数
函数display实现显示功能 void display(uchar address,uchar date) //液晶显示函数 { uchar shi,ge; shi=date/10; ge=date%10; write_com(0x80+0x40+address); write_date(0x30+shi); write_date(0x30+ge); } 3.3系统程序时钟控制程序清单请见附件Ⅱ。
第四章 系统调试 完成了系统的硬件设计和软件设计后,要使系统能够按照设计思路正常运行,还必须要进行系统调试。我们将通过基于C语言的Keil软件来进行编程,并通过Proteus软件进行仿真测试,检验系统是否能够实现显示和调整时间的功能。 4.1 Keil软件由于我们使用的是用C语言编写的程序,而Proteus软件并不能直接写入C语言进行仿真,因此我们要使用keil软件,步骤如下: 1.打开keil软件,点击菜单栏的“Project”,新建工程,会出现“Creat New Project”小窗口,我们给工程取名为“test”并点击保存,然后在左边的选择栏中找到AT89C51这个型号,选中并点“确定”按钮。 2.返回到编辑窗口,并新建一个空白文档,出现一个程序编辑框,输入我们写好的C语言程序,然后另存为C语言格式。 3.返回到编辑区,右键工程选择“test.c”,将其添加到工程中去。 4.配置Target,在Output界面中,勾选“Creat HEX Fi”选项,并返回到编辑窗口,单击“运行”,就生成我们需要的“test.hex”文件。 如图4-1和图4-2为keil软件和生成好的hex文件。
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsDC95.tmp.jpg图4-1 keil软件 file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsDC96.tmp.jpg图4-2 生成好的hex文件 4.2 Proteus软件仿真Proteus软件是英国Labcenter electronics公司出版的EDA工具软件,可完成从远离布局图、PCB设计、代码调试到单片机与外围电路的协同仿真,真正实现了从概念到产品的完整设计,是目前世界上唯一将电路仿真软件、PCB设计软件和仿真软件三合一的设计平台,其处理器支持8051、ARM8086等。 (1)具有强大的电路图绘制和仿真的功能。 (2)实现了单片机仿真和SPICE电路仿真相结合。具有数字电路仿真、模拟电路仿真、单片机及其外围电路的系统仿真等。 (3)提供软件调试功能。具有全速、单步、设置断点等调试功能,同时可以观察各变量的当前状态,并支持第三方编译和调试环境,如Keil等软件。 仿真步骤如下: 1.选择好相应的电子元器件,按电路原理图将各个元器件连接。 2.设置各个元器件的参数值。 3.将生成的hex文件添加到单片机中。 4.点击Proteus ISIS窗口下方的Play键可以观察到电路仿真结果(如图4.3所示)。
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsDC97.tmp.jpg
图4-3仿真结果
第五章 结论与展望5.1 结论本文系统的阐述了基于单片机的电子时钟系统从理论到功能的实现的过程,该系统结构简单清晰,操作简单,成本低,易于实现,能够显示字符、时间,走时精准,还可以根据需要任意调整时间,很好的实现了其功能,满足人们日常生活的需要。该系统也能够很好的学习单片机的应用技术知识,满足教学需要,是一个理想的电子产品设计,同时也扩大了单片机应用的领域。 5.2 数字时钟的发展趋势 单片机自问世以来,就以其高性能、低成本的特点受到人们的欢迎,广泛应用于各个行业,目前单片机的应用已渗透到我们生活的各个领域,其应用领域也在不断得扩展。在电子时钟未出现之前,人们采用石英钟,但这种石英钟在夜间的时候无法看到时间,所以电子时钟的出现为人们的生活提供了极大的便利,得到了社会的欢迎,在社会上占有相当一部分市场。而这种基于单片机的电子时钟从简单的电路实现显示功能发展到了多功能数字显示功能,已走过了多年的发展路程,但随着现代计算机技术和新兴产业技术的发展,电子时钟将会融入更多的技术,使其功能更加完善,设计更加人性化,显示的内容更加丰富。 结 语经过几个月不懈的努力,我的毕业设计终于完成了,通过本次论文的设计,我掌握了电子时钟系统从理论到实践的过程,认识了一个完整的系统从最初的设计到最终的完成的过程。毕业设计不仅是对我们前面所学知识的一种检验,更是对自己能力的一种提高,做毕业论文的过程也是一次再系统学习的过程,通过这次毕业设计使我明白了自己原来知识还比较欠缺,自己要学习的东西还太多。学习是一个长期积累的过程,在以后的工作、生活中都应该不断的学习,努力提高自己知识和综合素质。 大学课堂的学习只是让我们掌握理论知识,我们应该把学到的东西应用到我们的实际生活中,而这次的论文设计让我从电子时钟的理论设计成功的转化为实践应用,很好的锻炼了应用能力,我也会在以后的生活、学习中不断的磨练自己,使自己适应于以后的竞争。 毕业设计的完成,也意味着大学生活即将结束,在这三年来,我们不仅学到了专业知识,也认识了不少的同学和老师,在此感谢各位同学和老师给予我的帮助,也感谢学校给我们提供这样一个展现自我的舞台,提高了我们的动手实践能力。在做毕业设计的日子里,也感谢龚伟老师给予我的悉心指导。感谢提供相关技术帮助的老师和同学,你们给了我很大的帮助和支持,我在此深表谢意。
参考文献[1] 佟云峰.《单片机原理及运用》.北京:机械工业出版社,2013 [2] 王贤辰.《单片机应用技术》.北京:机械工业出版社,2015 [3] 王静霞,刘俐等.《单片机应用技术》:北京.电子工业出版社,2015 [4] 孙焕铭,赵会成,王金.《51单片机C程序应用实例详解》.北京:北京航空航天大学出版社,2011
[5] 谢龙汉,莫衍.《Proteus电子电路设计及仿真》.北京:电子工业出版社,2012
致 谢在论文完成之际,我要感谢的人很多。首先要感谢的是我的指导老师龚伟老师,没有老师的悉心指导和宝贵的建议,这篇论文恐怕难以完成。然后我要感谢我的学校江苏城市职业学院给我们提供这样一个展现自我的机会,在这里我也收获了好多。还有感谢这三年来教过我的老师,没有这些年的积淀,我也没有信心完成这篇论文,同时请各位老师对我的论文加以批评指正,及时完善论文的不足。 还有感谢这篇论文所涉及到的各位学者。本文引用了数位学者的研究文献,如果没有各位学者的研究成果的帮助和启发,我将很难完成本篇论文的写作。感谢我的同学和朋友,在我写论文的过程中提供热情的帮助与有价值的建议。 最后要感谢我的父母,没有你们,就没有我的今天,你们的支持与鼓励,永远是支撑我前进的最大动力。 谨以此致谢最后,我要向百忙之中抽时间对本论文进行审阅的各位老师表示衷心的感谢。
附录Ⅰ 硬件系统原理图如下图所示:
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsDCA7.tmp.jpg
附录Ⅱ 系统程序清单如下: #include<reg52.h> #define uchar unsigned char #define uint unsigned int sbit rs=P2^4; sbit rw=P2^5; sbit en=P2^6; sbit key1=P3^0; sbit key2=P3^1; sbit key3=P3^2; sbit sclk=P1^3; sbit rst=P1^5; sbit io=P1^4; uchar code table[]=" ---JSCVC--- "; uchar code table1[]="Time 00:00:00 "; uint count,shi,fen,miao; //uchar num1; delay(uint x) { uint i,j; for(i=x;i>0;i--) for(j=110;j>0;j--); } void write_com(uchar com) //1602液晶写命令 { rw=0; rs=0; P0=com; en=1; delay(5); en=0; delay(5); } void write_date(uchar date) //////1602液晶写数据 { rs=1; rw=0; P0=date; en=1; delay(5); en=0; delay(5); } void init() //初始化函数 { uchar num; en=0; write_com(0x38); write_com(0x0c); write_com(0x06); write_com(0x01); write_com(0x80); for(num=0;num<15;num++) { write_date(table[num]); delay(5); } write_com(0x80+0x40); for(num=0;num<14;num++) { write_date(table1[num]); delay(5); } TMOD=0x01; TH0=(65536-50000)/256; TL0=(65536-50000)%256; EA=1; ET0=1; TR0=1; } void display(uchar address,uchar date) //液晶显示函数 { uchar shi,ge; shi=date/10; ge=date%10; write_com(0x80+0x40+address); write_date(0x30+shi); write_date(0x30+ge); } void keyscan() ///键盘扫描函数,实现时间的调整功能 { uchar num; if(key1==0) { delay(5); if(key1==0) { num++; while(key1==0); switch(num) { case 1:TR0=0;write_com(0x80+0x40+11);write_com(0x0f);break; case 2:write_com(0x80+0x40+8);break; case 3:write_com(0x80+0x40+5);break; case 4:TR0=1;num=0;write_com(0x0c);break; } } } if(num!=0) { if(key2==0) { delay(5); if(key2==0) { while(!key2); switch(num) { case 1:miao++; if(miao==60)miao=0;display(11,miao); write_com(0x80+0x40+11);break; case 2:fen++; if(fen==60)fen=0;display(8,fen); write_com(0x80+0x40+8);break; case 3:shi++; if(shi==24)shi=0;display(5,shi); write_com(0x80+0x40+5);break; } } } if(key3==0) { delay(5); if(key3==0) { while(!key3); switch(num) { case 1:if(miao==0)miao=60;miao--; display(11,miao);write_com(0x80+0x40+11);break; case 2:if(fen==0)fen=60;fen--; display(8,fen);write_com(0x80+0x40+8);break; case 3:if(shi==0)shi=24;shi--; display(5,shi);write_com(0x80+0x40+5);break; } } } } } void main() //主函数 { init(); while(1) { keyscan(); } } void timer0() interrupt 1 //定时器中断,提供时间 { TH0=(65536-50000)/256; TL0=(65536-50000)%256; count++; if(count==18) { count=0; miao++; if(miao==60) { miao=0; fen++; if(fen==60) { fen=0; shi++; if(shi==24) { shi=0; } } display(5,shi); //送液晶显示 } display(8,fen); } display(11,miao); }
|