您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 单片机电子时钟(LCD显示)
实用文档文案大全单片机综合实验报告题目:电子时钟(LCD)显示班级:0310405班学号:031040514学生姓名:张金龙指导老师:高林2013年6月17日实用文档文案大全一、实验内容:以AT89C51单片机为核心的时钟,在LCD显示器上显示当前的时间:使用字符型LCD显示器显示当前时间。显示格式为“时时:分分:秒秒”。用4个功能键操作来设置当前时间,4个功能键接在P1.0~P1.3引脚上。功能键K1~K4功能如下。K1—进入设置现在的时间。K2—设置小时。K3—设置分钟。K4—确认完成设置。程序执行后工作指示灯LED闪动,表示程序开始执行,LCD显示“00:00:00”,然后开始计时。二、实验电路及功能说明1)单片机主控制模块以AT89C51单片机为核心进行一系列控制。2)时钟显示模块用1602为LCD显示模块,把对应的引脚和最小系统上的引脚相连,连接后用初始化程序对其进行简单的功能测试。测试成功后即可为实验所用,如图:3)时间调整电路用4个功能键操作来设置当前时间,4个功能键接在P1.0~P1.3引脚上。功能键K1~K4功能如下。K1—进入设置现在的时间。K2—设实用文档文案大全置小时。K3—设置分钟。K4—确认完成设置。如图:三、实验程序流程图:主程序:时钟主程序流程实用文档文案大全子程序:保护现场设置计数初值1S到?(40H)=10?0(40H)(40H)+1(40H)(41H)+1(41H)(46H)=4?0(46H)(0)(47H)恢复现场返回NN中断服务流程图(41H)=5?0(41H)(43H)=10?0(43H)(43H)+1(43H)(44H)+1(44H)(44H)=5?0(44H)(46H)+1(46H)(47H)=2?(46H)+1(46H)NN(46H)=10?0(46H)(47)+1(47)NN实用文档文案大全四、实验结果分析实验结果及分析:单片机的晶振可以根据要求设定。6MHZ为和现实时间显示相同。实验采用12MHZ晶振采用方式1定时,选取50ms采用20次中断达到一秒,采用查表方式控制LCD显示。当烧入程序后开始运行,根据初始值设定可以观察到显示的时间,这里为了更明显观察显示数据变化把起始值设为23:59:50运行后显示,K1为进入现在设置时间,当按下K1后显示,和实验要求相比较,实现了按下K1进入现在时间设置,按下K4确认完成时间设置的功能;不同之处:当进入时间设置时在按下K1设置小时,再次按下K1是设置分钟。增加功能:进入时间设置并选择设置位置后K2键位数字增加功能,K3键为数字减小功能。根据仿真结果能够确定编程正确,基本实现了所有功能,而且有所改进。实用文档文案大全五、心得体会每次做单片机实验都会有不同的等收获,而这次的实验让我感觉收获更大。这次的实验让我巩固了以往所学,而且锻炼了自己发现问题解决问题的能力。在编程过程,发现自己对C语言很生疏,很多技巧和函数运用都不会,通过参考资料和询问同学终于让我完成了程序,并实现了程序的功能。这不仅提高了自己动手能力,也培养了自己的思考能力。这次在编程过程中学到了很多新东西,特别是LCD的显示,在设定的显示字符后,正确编译后显示各种设定值,LCD显示16位字符,在最初编程时编译正确但是LCD上的显示字符有缺失,显示不完整,经过不断调试发现空格同样占据字符,只有所有字符不超过16位且位置正确时才能完整正确显示。时间的显示需要每一个显示的位子有定义,而且要给“:”留下特定位子。同时编程时发现还可以显示其他如日期。但本实验不需要且很难完成最终没实现。在仿真过程中发现许多模型不知道名称,最后搜索了一份Proteus元件库,里边有很多元件模型的名称。最后搭建成功了仿真模型,并且运行成功。在这里要感谢老师在以往实验过程中不厌其烦的帮助自己解决所遇到的问题和传授一些知识和小窍门。让我对单片机有机会加深了解,体会到了单片机的强大,学到了很多,感谢。实用文档文案大全六、程序清单#includereg51.h#includeintrins.h#defineucharunsignedchar#defineuintunsignedint#defineDelayNOP(){_nop_();_nop_();_nop_();_nop_();}sbitK1=P1^0;//选择调整小时,分钟sbitK2=P1^1;//增加sbitK3=P1^2;//减小sbitK4=P1^3;sbitSPK=P3^0;sbitRS=P2^0;sbitRW=P2^1;sbitE=P2^2;ucharcodeStr1[]=CurrentTime;//一下两个字符串的串长均为16ucharcodeStr2[]=SetNewTime;ucharHMS_String[]=00:00:00;//带显示的时间串bitSettime=0;//是否修改时间bitChange_H_or_M=1;//1表示修改时.0表示修改分ucharMilliSecond,Hour=23,Minute=59,Second=50;//延时函数voidDelayMS(uintx){uchari;while(x--)for(i=0;i120;i++);}//LCD忙状态检测bitLCD_Busy_Check(){bitresult;RS=0;RW=1;E=1;DelayNOP();result=(bit)(P0&0x80);E=0;returnresult;}//写LCD命令voidLCD_Write_Command(ucharcmd){while(LCD_Busy_Check());//判断LCD是否忙碌RS=0;RW=0;E=0;_nop_();_nop_();P0=cmd;DelayNOP();E=1;DelayNOP();E=0;}//设置LCD显示位置voidLCD_Set_Pos(ucharpos){LCD_Write_Command(pos|0x80);}//写LCD数据实用文档文案大全voidLCD_Write_Data(uchardat){while(LCD_Busy_Check());//判断LCD是否忙碌RS=1;RW=0;E=0;P0=dat;DelayNOP();E=1;DelayNOP();E=0;}//LCD初始化voidLCD_Initialize(){LCD_Write_Command(0x38);DelayMS(1);LCD_Write_Command(0x0c);DelayMS(1);LCD_Write_Command(0x06);DelayMS(1);LCD_Write_Command(0x01);DelayMS(1);}//显示函数,在LCD指定的行上显示字符串voidDisplay_String(uchar*str,ucharLineNo){uchark;LCD_Set_Pos(LineNo);for(k=0;k16;k++)LCD_Write_Data(str[k]);}//时分秒显示voidDisplay_HMS(ucharh,m,s){if(Settime)HMS_String[3]='';//显示修改标志elseHMS_String[3]='';//不显示修改标志HMS_String[4]=h/10+'0';//时十位HMS_String[5]=h/10+'0';HMS_String[5]=h%10+'0';//时个位HMS_String[5]=h%10+'0';HMS_String[7]=m/10+'0';//分HMS_String[8]=m/10+'0';HMS_String[8]=m%10+'0';//分HMS_String[8]=m%10+'0';HMS_String[10]=s/10+'0';//秒HMS_String[11]=s/10+'0';HMS_String[11]=s%10+'0';//秒HMS_String[11]=s%10+'0';Display_String(HMS_String,0x40);}//设置时间voidChange_Time(){Settime=0;if(K1==0)//按下k1键即进入修改状态{TR0=0;Display_String(Str2,0x00);//第一行提示修改时间Settime=1;实用文档文案大全}while(Settime){if(K1==0)//确定调整小时还是分钟{while(K1==0)Change_H_or_M=!Change_H_or_M;}elseif(K2==0)//增加{while(K2==0);if(Change_H_or_M==1){if(++Hour==24)Hour=0;}else{if(++Minute==60)Minute=0;}}elseif(K3==0)//减少{while(K3==0);if(Change_H_or_M==1){if(--Hour==0xff)Hour=23;}else{if(--Minute==0xff)Minute=59;}}elseif(K4==0)//确定{while(K4==0);Display_String(Str1,0x00);//第一行还原显示str1Settime=0;TR0=1;}Display_HMS(Hour,Minute,Second);}//外层While在这里结束}//定时器0中断voidTime0()interrupt1{TH0=(65536-50000)/256;实用文档文案大全TL0=(65536-50000)%256;//重新装入50MS定时if(++MilliSecond==20)//50*20=1s{MilliSecond=0;if(++Second==60){Second=0;if(++Minute==60){Minute=0;if(++Hour==24){Hour=0;Minute=0;Second=0;}}}}}//主函数voidmain(){TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;IE=0x82;SPK=0;LCD_Initialize();Display_String(Str1,0x00);//第一行显示TR0=1;P1=0xFF;while(1){Display_HMS(Hour,Minute,Second);//第二行显示时分秒DelayMS(500);Change_Time();//显示过程中允许修改时间}}
本文标题:单片机电子时钟(LCD显示)
链接地址:https://www.777doc.com/doc-2646164 .html