版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于单片机的lcd1602电子时钟设计.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复位电路及晶振电路基于单片机的lcd1602电子时钟设计全文共21页,当前为第3页。该电路采用按键复位,有一个22uF的电容、一个按键S4、一个10K的电阻和一个220Ω的电阻构成。在产品工作期间出现错误或死机现象可采用手动复位,即按下S4,此时无论电路处于何种状态,电路都会恢复到初始状态的显示。基于单片机的lcd1602电子时钟设计全文共21页,当前为第3页。晶振电路可以给单片机提供所需要的时钟频率,主要由晶振这个元件固定的精确的频率来实现。复位电路及晶振电路如图5所示:图5复位电路及晶振电路系统软件设计软件系统分四个部分:主函数程序部分,键盘扫描部分,定时器中断部分,LCD初始化部分。各部分程序流程图如下所示:4.1主函数程序流程图开始定时器的选择、工作模式设定、给定时器赋值定时器的选择、工作模式设定、给定时器赋值开中断开中断启动定时器调用LCD初始化子程序调用LCD初始化子程序调用键盘扫描子程序调用键盘扫描子程序基于单片机的lcd1602电子时钟设计全文共21页,当前为第4页。基于单片机的lcd1602电子时钟设计全文共21页,当前为第4页。图6主函数流程图4.2键盘扫描子程序流程图开始开始判断S1是判断S1是否按下NOYES计算S1按下次数计算S1按下次数并执行相应指令判断S2是否按下判断S2是否按下判断S3是否按下NONOYESYES计算S3按下次数并执行相应操作计算S3按下次数并执行相应操作计算S2按下次数并执行相应操作结束结束图7键盘扫描程序流程图基于单片机的lcd1602电子时钟设计全文共21页,当前为第5页。基于单片机的lcd1602电子时钟设计全文共21页,当前为第5页。4.3定时器中断子程序流程图开始开始给定时器再次赋值给定时器再次赋值判断是判断是否计满18次NO秒加1,判断是否等于60YES秒加1,判断是否等于60返回返回NO分加1,秒置0,判断分是否等于60YES分加1,秒置0,判断分是否等于60NOYES时加1,分置0,判断时是否等于24时加1,分置0,判断时是否等于24NO执行年、月、日、时、分、秒的显示执行年、月、日、时、分、秒的显示日加1,时置0,判断该年是否为闰年YES日加1,时置0,判断该年是否为闰年年加1,月置1,判断年是否为100YES年加1,月置1,判断年是否为100NOYES判断日是否到月底判断日是否到月底NONO基于单片机的lcd1602电子时钟设计全文共21页,当前为第6页。月加1,日置1,判断月是否等于13YES基于单片机的lcd1602电子时钟设计全文共21页,当前为第6页。月加1,日置1,判断月是否等于13NOYES4.3LCD初始化程序流程图开始开始RW和E都置零RW和E都置零设置点阵8位数据接口,两行显示设置点阵8位数据接口,两行显示开显示,不显示光标开显示,不显示光标地址指针加一地址指针加一画面不移动刷新,全部清零刷新,全部清零给地址,表示从给地址,表示从第一行开始写显示第一行数据显示第一行数据给第二行地址给第二行地址显示第二行数据返回返回基于单片机的lcd1602电子时钟设计全文共21页,当前为第7页。图9LCD初始化流程图基于单片机的lcd1602电子时钟设计全文共21页,当前为第7页。设计结果分析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的初始化操作、指令和数据的操作都需要很熟悉。在设计过程中碰到实在不能解决的问题,就问老师或是和同学交流,把问题彻底搞清楚并加以掌握。基于单片机的lcd1602电子时钟设计全文共21页,当前为第8页。尽管在这次设计中遇到了许多难题,但也都一一得以解决。比如程序编写中,由于思路不清晰,开始时遇到了许多的问题,经过静下心来思考,和同学们的共同讨论,理清了思路,反而得心应手;在硬件方面虽然没有遇到什么大问题,但从中也学到了许多知识。基于单片机的lcd1602电子时钟设计全文共21页,当前为第8页。通过此次设计,也使我知道了做任何事都要有一颗平常心,不要想着走捷径,一步一个脚印,把每一步都认认真真做好了,才能取得最后的成功,同时也锻炼了我的耐心,做什么事都要有耐心,不要遇到困难就退缩,而是要静下心来去寻找解决的办法否则很难有最后的成功。在此过程中更要注重自主学习,发挥自己的主观能动性。总之,这次课设是我的又一次全新的尝试,也是一个小小的成功,更是一次很好的锻炼,让我有了全方位的提高和进步。七、proteus仿真图基于单片机的lcd1602电子时钟设计全文共21页,当前为第9页。图(10)仿真主界面基于单片机的lcd1602电子时钟设计全文共21页,当前为第9页。图(11)调节分界面基于单片机的lcd1602电子时钟设计全文共21页,当前为第10页。图(12)调节月界面基于单片机的lcd1602电子时钟设计全文共21页,当前为第10页。图(13)调节年界面八、参考文献[1]周国运。单片机原理及应用(C语言版)。北京:中国水利水电出版社,2009[2]张齐、朱宁西。单片机应用系统设计技术。北京:电子工业出版社,2009[3]汪道辉。单片机系统设计与实践。北京:电子工业出版社,2006[4]杨子文。单片机原理及应用。西安:西安电子科技大学出版社,2006九、程序附录: #include<reg52.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};//闰年月基于单片机的lcd1602电子时钟设计全文共21页,当前为第11页。ucharcount,hour,minute,second,year=1,month=1,date=1;基于单片机的lcd1602电子时钟设计全文共21页,当前为第11页。uchars1num;//s1num:定义功能键按下次数变量voiddelay(unsignedintz)//延时子函数z*1ms{ unsignedintx,y; for(x=z;x>0;x--) for(y=110;y>0;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);//从第二行(add)位开始写数据 write_data(0x30+sw);//写入十位 write_data(0x30+gw);//写入个位}voidwrite_ymd(ucharadd,uchardat)//年月日写函数add:输入位置设置变量dat:输入时分秒数据{基于单片机的lcd1602电子时钟设计全文共21页,当前为第12页。 ucharsw,gw;//定义十位,个位变量基于单片机的lcd1602电子时钟设计全文共21页,当前为第12页。 sw=dat/10; gw=dat%10; write_com(0x80+add);//从第一行(add)位开始写数据 write_data(0x30+sw);//写入十位 write_data(0x30+gw);//写入个位}voidt0()interrupt1//定时器0中断子程序{ TH0=(65536-50000)/256; TL0=(65536-50000)%256; count++;}voidgethms()//时分秒处理子程序{ second++; if(second==60) { second=0; minute++; if(minute==60) { minute=0; hour++; if(hour==24) { hour=0; date++; } write_hms(2,hour);//时输出显示 } write_hms(5,minute);//分输出显示 } write_hms(8,second);//秒输出显示}voidgetymd()//年月日处理子程序{ if(year%4==0) { if(date==month1[month-1]+1) {基于单片机的lcd1602电子时钟设计全文共21页,当前为第13页。基于单片机的lcd1602电子时钟设计全文共21页,当前为第13页。 month++; if(month==13) { month=1; year++; if(year==100) { year=1; } write_ymd(4,year); } write_ymd(7,month); } write_ymd(10,date); }else { if(date==month0[month-1]+1) { date=1; month++; if(month==13) { month=1; year++; if(year==100) { year=1; } write_ymd(4,year); } write_ymd(7,month); } write_ymd(10,date); } }voidkey_process()//按键扫描子程序{ if(P2==0xf6)//功能键 delay(25); if(P2==0xf6)//功能键按下 { while(P2==0xf6);//松手检测基于单片机的lcd1602电子时钟设计全文共21页,当前为第14页。 s1num++;//功能键按下计数基于单片机的lcd1602电子时钟设计全文共21页,当前为第14页。 TR0=0;//T0定时停止,进入时间调整 switch(s1num) { case1:write_com(0x80+0x40+0x09);break;//光标闪烁位定为秒个位 case2:write_com(0x80+0x40+0x06);break;//光标闪烁位定为分个位 case3:write_com(0x80+0x40+0x03);break;//光标闪烁位定为时个位 case4:write_com(0x80+0x0b);break;//光标闪烁位定为日个位 case5:write_com(0x80+0x08);break;//光标闪烁位定为月个位 case6:write_com(0x80+0x05); break; //光标闪烁位定为年个位 } write_com(0x0f);//光标闪烁 if(s1num==7) { s1num=0;//按键计数复位 write_com(0x0c);//光标停止闪烁 TR0=1;//重新启动定时器 } } if(P2==0xee)//时分秒+1模块 { delay(25); if(P2==0xee) { while(P2==0xee); switch(s1num) { case1: second++;//秒+ if(second==60)second=0;//复位 write_hms(8,second);//秒输出显示 write_com(0x80+0x40+0x09);//光标闪烁位定为秒个位 break; case2: minute++; if(minute==60)minute=0;//复位 write_hms(5,minute);//分输出显示基于单片机的lcd1602电子时钟设计全文共21页,当前为第15页。 write_com(0x80+0x40+0x06);//光标闪烁位定为分个位基于单片机的lcd1602电子时钟设计全文共21页,当前为第15页。 break; case3: hour++; if(hour==24)hour=0;//复位 write_hms(2,hour);//时输出显示 write_com(0x80+0x40+0x03);//光标闪烁位定为时个位 break; case4: date++;//日+ if(year%4==0)//平闰年判断 { if(date==month1[month-1]+1) { date=1; } } else { if(date==month0[month-1]+1) { date=1; } } write_ymd(10,date);//日输出显示 write_com(0x80+0x0b);//光标闪烁位定为日个位 break; case5: month++;//月+ if(month==13)month=1; if(year%4==0)//判断日和月的配对关系 { if(date>month1[month-1])date=month1[month-1]; } else { if(date>month0[month-1])date=month0[month-1]; } write_ymd(10,date);//日输出显示基于单片机的lcd1602电子时钟设计全文共21页,当前为第16页。 write_ymd(7,month);//月输出显示基于单片机的lcd1602电子时钟设计全文共21页,当前为第16页。 write_com(0x80+0x08);//光标闪烁位定为月个位 break; case6: year++;//年+ if(year==100)year=1;//复位 write_ymd(4,year);//年输出显示 write_com(0x80+0x05);//光标闪烁位定为年个位 break; } } } if(P2==0xde)//时分秒-1模块 { delay(5); if(P2==0xde) { while(P2==0xde); switch(s1num) { case1: second--;//秒- if(second==255)second=59;//复位 write_hms(8,second);//秒输出显示 write_com(0x80+0x40+0x09);//光标闪烁位定为秒个位 break; case2: minute--; if(minute==255)minute=59;//复位 write_hms(5,minute);//分输出显示 write_com(0x80+0x40+0x06);//光标闪烁位定为分个位 break; case3: hour--; if(hour==255)hour=23;//复位 write_hms(2,hour);//时输出显示 write_com(0x80+0x40+0x03);//光标闪烁位定为时个位 break; case4: date--;//日- if(year%4==0) { if(date==0)基于单片机的lcd1602电子时钟设计全文共21页,当前为第17页。 {基于单片机的lcd1602电子时钟设计全文共21页,当前为第17页。 date=month1[month-1]; } } else { if(date==0) { date=month0[month-1]; } } write_ymd(10,date);//日输出显示 write_com(0x80+0x0b);//光标闪烁位定为日个位 break; case5: month--;//月- if(month==0)month=12; if(year%4==0)//判断日和月的配对关系 { if(date>month1[month-1])date=month1[month-1]; } else { if(date>month0[month-1])date=month0[month-1]; } write_ymd(10,date);//日输出显示 write_ymd(7,month);//月输出显示 write_com(0x80+0x08);//光标闪烁位定为月个位 break; case6: year--;//年- if(year==1)year=99;//复位 write_ymd(4,year);//年输出显示 write_com(0x80+0x05);//光标闪烁位定为年个位 break; } } }}基于单片机的lcd1602电子时钟设计全文共21页,当前为第18页。基于单片机的lcd1602电子时钟设计全文共21页,当前为第18页。voidinitialize()//LCD初始化函数{ ucharnum; lcden=0; write_com(0x38);//设置16x2显示,5x7点阵显示,8位数
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《喜迎中秋模板》课件
- 三年级下册科学教科版课件第1课时 仰望天空
- 增值税及其会计处理教学课件
- 制作课件心得范文
- 土地招商协议书(2篇)
- 《市场机制原理》课件
- 《秘书长办》课件
- 2021年安徽省宿州市公开招聘警务辅助人员(辅警)笔试必刷测试卷(1)含答案
- 2022年山西省临汾市公开招聘警务辅助人员(辅警)笔试摸底测试(2)卷含答案
- 2024年安徽省淮南市公开招聘警务辅助人员(辅警)笔试冲刺自测题二卷含答案
- GB/T 34542.3-2018氢气储存输送系统第3部分:金属材料氢脆敏感度试验方法
- 陕2022TJ 067 厨卫装配式钢丝网混凝土排气道系统建筑构造图集
- 智障学生期末评语
- 彭永新职业决策自我效能感
- MBA《创新管理》课件
- 全新版大学进阶英语第二册-Unit-4-Study-Abroad课件
- 《静女》、《涉江采芙蓉》、《鹊桥仙》联读课件20张-统编版高中语文必修上册
- 国家开放大学英语(3)-期末参考答案
- 2022年辽宁省工程咨询集团有限责任公司校园招聘笔试试题及答案解析
- esprit教程-车铣复合中心手册
- 国家开放大学一网一平台电大《可编程控制器应用实训》形考任务1-7终结性考试题库及答案
评论
0/150
提交评论