您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 基于单片机的lcd1602电子时钟设计
设计说明书内容1基于单片机的LCD1602电子时钟设计一、设计任务和目的1.1、设计任务(1):用单片机设计基于LCD1602的电子时钟,显示时间和日期;(2):误差精度控制在1s/天;(3):具有时间和日期的校准功能;(4):能区分某年是闰年或平年,并对应显示2月份的天数;(5):根据月份的不同显示不同的最大日数;(6):搭建仿真电路图,模拟单片机要实现的功能;(7):焊接单片机开发板;(8):编写程序,下载并调试,实现要求的功能。1.2、设计目的(1):熟练掌握KEIL软件的使用方法;(2):熟练掌握PROTEUS软件的使用方法;(3):掌握单片机I/O接口的工作原理;(4):掌握LCD显示器的工作原理及编程方法;(5):掌握独立式键盘的工作原理及编程使用方法;(6):掌握单片机的下载使用方法。二、设计思路和方案论证2.1、设计思路电路总体上分为控制和显示部分。以单片机最小系统作为核心控制电路,控制LCD显示,具体显示内容及方式由软件来完成;由于有时钟和日期的调节功能需要校准电路和基本的复位电路,复位电路采用按键复位,调节键、加1键、减1键三个按键完成,共需四个按键;计时功能由固定频率的晶振完成(采用11.0592MHz);显示部分主要采用LCD1602作为显示。2.2、方案论证(1):时钟芯片的选择和论证方案一:采用DS1302时钟芯片实现时钟,DS1302芯片是一种高性能的时钟芯片,可自动对秒、分、时、日、月、年以及闰年补偿的年进行计数,精度也较高,工作电压2.5V~5.5V范围内,功耗也较低,但价格比较贵。方案二:直接采用单片机定时计数器提供秒信号,使用程序实现秒、分、时、日、月、年计数。采用此方案实现虽然有一定的时间误差,但可减少芯片的使用,节约成本,易于实现,符合现实选用,所以采用此种作为时钟信号发生器。(2):显示模块选择方案和论证:方案一:采用点阵式图形LCD12864液晶显示屏,液晶显示屏的显示功能强大,可显示文字,图形,显示多样,清晰可见,但是价格昂贵,需要的接口线多,所以在此设计中不采用点阵式图形LCD12864液晶显示屏。方案二:采用点阵式字符型LCD1602液晶显示屏,LCD1602是专门用于显示字母、数字、符号等的点阵型液晶显示模块,分4位和8位数据传输方式。提供“5×7点阵+光标”和“5×10点阵+光标”的显示模式。价格现对便宜,所以用此种作为显示。设计说明书内容2三、系统的硬件设计与实现3.1电路设计框图图1:整体设计方框图3.2单片机最小系统的设计以AT89C51为核心组成的单片机的最小系统,主要包括时钟振荡电路,复位电路等。正5V电源直接接到89C51的40脚(VCC),20脚(GND)接地。时钟振荡电路的18脚(XTAL1)和19脚(XTAL2)外接11.0592MHZ的晶振和二个30PF的电容,振荡频率就是晶振的固有频率,经过一定的电路连接实现计时的功能。复位电路采用上电自动复位和手动复位相结合的方式接到89C51的9端(RST)。单片机最小系统原理图如图2所示:图2:单片机最小系统原理图AT89C51主控制模块复位电路时钟振荡电路LCD显示模块键盘控制电路设计说明书内容33.3显示电路设计采用LCD1602液晶显示,LCD1602的D0~D7与单片机的P0口相连,P0口作为I/O口输出时必须外接10KΩ的上拉电阻。分别用P1.0、P1.1、P1.2作为LCD1602的RS、RW、E控制线。显示电路如图3所示:图3:液晶显示电路3.4时间调整电路该电路设计有三个轻触式按键,分别命名为:模式设定键S1、加调整键S2、减调整键S3。由P2.0口外接S1,P2.1外接S2,P2.2外接S3,P2.3作为公共端。按一下S1,调整光标开始出现在秒位,再按一下S1光标移动到分,按一下光标移动一个校准位直到年位。S2实现调整加1功能,S3实现调整减1功能。时间调整电路如图4所示:图4:键盘电路3.5复位电路及晶振电路该电路采用按键复位,有一个22uF的电容、一个按键S4、一个10K的电阻设计说明书内容4和一个220Ω的电阻构成。在产品工作期间出现错误或死机现象可采用手动复位,即按下S4,此时无论电路处于何种状态,电路都会恢复到初始状态的显示。晶振电路可以给单片机提供所需要的时钟频率,主要由晶振这个元件固定的精确的频率来实现。复位电路及晶振电路如图5所示:图5复位电路及晶振电路四、系统软件设计软件系统分四个部分:主函数程序部分,键盘扫描部分,定时器中断部分,LCD初始化部分。各部分程序流程图如下所示:4.1主函数程序流程图开始定时器的选择、工作模式设定、给定时器赋值开中断启动定时器调用LCD初始化子程序调用键盘扫描子程序设计说明书内容5图6主函数流程图4.2键盘扫描子程序流程图NOYESNONOYESYES图7键盘扫描程序流程图开始判断S1是否按下判断S2是否按下判断S3是否按下计算S1按下次数并执行相应指令计算S2按下次数并执行相应操作计算S3按下次数并执行相应操作结束设计说明书内容64.3定时器中断子程序流程图NOYESNOYESNOYESNOYESYESNOYESNONOYES开始给定时器再次赋值判断是否计满18次秒加1,判断是否等于60分加1,秒置0,判断分是否等于60时加1,分置0,判断时是否等于24日加1,时置0,判断该年是否为闰年判断日是否到月底月加1,日置1,判断月是否等于13年加1,月置1,判断年是否为100返回执行年、月、日、时、分、秒的显示设计说明书内容7NOYES4.3LCD初始化程序流程图图9LCD初始化流程图开始RW和E都置零设置点阵8位数据接口,两行显示开显示,不显示光标地址指针加一画面不移动刷新,全部清零给地址,表示从第一行开始写显示第一行数据给第二行地址显示第二行数据返回设计说明书内容8五、设计结果分析5.1硬件分析该设计电路系统较大,电路系统中只要出于一处的错误,则会对检测造成很大的不便,而且电路的交线较多。另外,买来的元器件要先进行检测,如果有坏的器件要进行更换,还有就是要注意元器件的正确放置与安装以及布线的合理,便于成品电路的检测与维护。为了减少复杂度,可用Proteus软件进行仿真,按照电路原理图在Proteus中选择元器件并连接,把生产的HEX文件烧入到单片机内部进行仿真,若出现错误及时更改。在本设计中遇到了很多的问题。回想这些问题,其实只要认真思考许多都是可以避免的,以下为主要的问题:(1):在Proteus仿真中提示出错,没有仿真结果。在Proteus中仿真中,提示出现了R1(R2)错误,经过仔细排查,发现有两个电阻命名,是R1,两个电阻命名是R2。修改后就没有出现错误。(2):在Proteus仿真中,LCD不显示在硬件设计上需要用P0口来对LCD进行指令的读写和数据的输入,由于没有在P0口接上拉电阻,LCD屏就一直不显示。最终将在查阅课本时想起P0做输出口使用时外部必须接10KΩ的上拉电阻,接上后LCD就正常显示了。5.2软件分析该设计的功能虽然比较简单,但程序也较为复杂,所以在编写程序和调试时出现了许多问题。最后经过多次的模块子程序的修改,一步一步的完成,最终在KEIL调试成功,解决了软件问题。在软件的调试过程中主要遇到的问题如下:(1):烧入程序后,秒、分、时、年能正常工作,但是日、月出错当秒等于60时显示为00,范围是0~59;当分等于60时显示00,范围是0~59;当时等于24时显示00,范围是0~23;年等于100是显示00,范围是00~99;日和月的显示都不包括0,当由于软件出错,显示时出现了,经过改写最终全能正常显示。(2:):不能正常区分闰年和平年,每月都是31天闰年和平年的2月份分别是29天和28天,1、3、5、7、8、10、12月份显示范围是0~31,4、6、9、11月份显示范围是0~30。刚开始不能区分,最后经过修改能区分显示。六、设计体会通过这次单片机课程设计,发现了自身所学知识存在许多的不足和问题,同时也学到了不少东西,提高了动手实践的能力。在整个设计过程中,从设计方案的确定,到具体电路在Proteus中的设计,最后到总体电路的联接构建以及程序的编写烧制,特别是程序的编写,要求对LCD1602的初始化操作、指令和数据的操作都需要很熟悉。在设计过程中碰到实在不能解决的问题,就问老师或是和同学交流,把问题彻底搞清楚并加以掌握。尽管在这次设计中遇到了许多难题,但也都一一得以解决。比如程序编写中,由于思路不清晰,开始时遇到了许多的问题,经过静下心来思考,和同学们的共设计说明书内容9同讨论,理清了思路,反而得心应手;在硬件方面虽然没有遇到什么大问题,但从中也学到了许多知识。通过此次设计,也使我知道了做任何事都要有一颗平常心,不要想着走捷径,一步一个脚印,把每一步都认认真真做好了,才能取得最后的成功,同时也锻炼了我的耐心,做什么事都要有耐心,不要遇到困难就退缩,而是要静下心来去寻找解决的办法否则很难有最后的成功。在此过程中更要注重自主学习,发挥自己的主观能动性。总之,这次课设是我的又一次全新的尝试,也是一个小小的成功,更是一次很好的锻炼,让我有了全方位的提高和进步。七、proteus仿真图图(10)仿真主界面设计说明书内容10图(11)调节分界面图(12)调节月界面设计说明书内容11图(13)调节年界面八、参考文献[1]周国运。单片机原理及应用(C语言版)。北京:中国水利水电出版社,2009[2]张齐、朱宁西。单片机应用系统设计技术。北京:电子工业出版社,2009[3]汪道辉。单片机系统设计与实践。北京:电子工业出版社,2006[4]杨子文。单片机原理及应用。西安:西安电子科技大学出版社,2006九、程序附录:#includereg52.h#defineucharunsignedchar#defineuintunsignedint#definedatasendP0sbitlcden=P1^2;//LCD使能端sbitlcdrs=P1^0;//LCD数据/指令(H/L)选择端sbitlcdrw=P1^1;ucharmytable0[]=Nanyangligong;ucharmytable1[]=liuhaiyanDIY!!;ucharcodeline0[]=2010-12-01;//初始化显示ucharcodeline1[]=00:00:00;ucharcodemonth0[]={31,28,31,30,31,30,31,31,30,31,30,31};//平年月ucharcodemonth1[]={31,29,31,30,31,30,31,31,30,31,30,31};//闰年月ucharcount,hour,minute,second,year=1,month=1,date=1;设计说明书内容12uchars1num;//s1num:定义功能键按下次数变量voiddelay(unsignedintz)//延时子函数z*1ms{unsignedintx,y;for(x=z;x0;x--)for(y=110;y0;y--);}voidwrite_com(unsignedcharc)//写命令子函数{lcdrs=0;//低电平选择为写指令lcden=0;datasend=c;//把指令写入P0口delay(5);lcden=1;//开使能delay(5);//读取指令lcden=0;//关闭使能}voidwrite_data(unsignedchard)//写数据子函数{lcdrs=1;//高电平选择为写数据datasend=d;//把数据写入P0口delay(5);lcden=1;//开使能delay(5);//读取数据lcden=0;//关闭使能}voidwrite_hms(ucharadd,uchardat)//时分秒写函数add:输入位置设置变量dat:输入时分秒数据{ucharsw,gw;//定义十位,个位变量sw=dat/10;gw=dat%10;write_com(0x80+0x40+add);//从
本文标题:基于单片机的lcd1602电子时钟设计
链接地址:https://www.777doc.com/doc-69445 .html