您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 电子时钟(LCD显示)
电气工程及自动化专业单片机原理及应用课程设计报告姓名:XXXXXX学号:XXXXXXX专业班级:XXXXXX题目:电子时钟(LCD显示)电气与电子工程学院二〇一四年十二月三十日1目录一、设计目的……………………………2二、设计任务和要求……………………………2三、设计原理分析……………………………2四、硬件资源及其分配……………………………3五、硬件图……………………………4六、程序框图……………………………5七、程序……………………………7八、调试运行……………………………13九、仿真截图……………………………13十、设计心得体会……………………………142一、设计目的1、设计要求以AT89C51单片机为核心的时钟,在LCD显示器上显示当前的时间。2、使用字符型LCD显示器显示当前时间。显示格式为“时时:分分:秒秒”。3、用4个功能键操作来设置当前时间。4、熟悉掌握proteus编成软件以及keil软件的使用二、设计任务与要求本设计以AT89C51单片机为核心,通过时钟程序的编写,并在LCD显示器上显示出来。该编程的核心在于定时器中断及循环往复判断是否有按键操作,并对每个按键的操作在LCD显示器上作出相应的反应。由于LCD显示器每八位对应一个字符,故把秒、分、时的个位和十位分开表示。该课题中有四个控制开关KM1、KM2、KM3、KM4分别控制时、分、秒、确定的调整,时间按递增的方式调整,每点一次按钮则相应的时间个位加以,且时间调整不干扰其他为调整时间的显示。三、设计原理分析1、按照系统的设计功能要求,本时钟系统的设计必须采用单片机软件系统实现,用单片机的自动控制能力配合按键控制,来控制时钟的调整及显示。图一系统总原理图微型控制器时钟电路数据显示按键调时32、软件主要完成功能(1)显示时间程序用软件调节时间,通过程序的调节,最后用LED现实时钟(2)调节时间程序按键调节时间,能实现时、分的调节3、软件设计主要流程时间控制程序时间控制程序,用中断准确的控制时间,采用60进制,60秒为一分钟,60分钟为一个小时,全天设置为24小时。四、硬件资源及原理图AT89C51芯片AT89C51是美国ATMEL公司生产的8位FlashROM单片机。其最突出的优点是片内ROM为FlashROM,可擦写1000次以上,应用并不复杂的通用ROM写入器就能方便的擦写,读取也很方便,价格低廉,具有片程序ROM二级保密系统。因此可灵活应用于各种控制领域。AT89C51包含以下一些功能部件:1.一个8位CPU;2.一个片内振荡器和时钟电路;3.4KBFlashROM;4.128B内RAM;5.可寻址64KB的外ROM和外RAM控制电路;6.两个16位定时/计数器;7.21个特殊功能寄存器;8.4个8位并行I/O口;9.一个可编程全双工串行口;10.5个中断源,可设置成2个优先级。AT89C51单片机一般采用双列直插DIP封装,共40个引脚,图2-1为其引脚排列图。40个引脚大致可分为4类:电源、时钟、控制各I/O引脚4五、硬件图5六、程序框图设置T0为方式1设中断次数为20清计时单元开中断启动T0调用显示子程序按键程序调用按键显示子程序时钟主程序流程LCD显示6保护现场设置计数初值设置T0为方式1设中断次数为20清计时单元开中断启动T0调用显示子程序按键程序调用按键显示子程序时钟主程序流程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)NN7七、程序#includereg51.h#includeintrins.h#defineucharunsignedchar#defineuintunsignedint#defineDelayNOP(){_nop_();_nop_();_nop_();_nop_();}sbitK1=P0^0;sbitK2=P0^1;sbitK3=P0^2;sbitK4=P0^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=0,Minute=0,Second=0;//延时函数voidDelayMS(uintx){uchari;while(x--)for(i=0;i120;i++);}//LCD忙状态检测bitLCD_Busy_Check(){8bitresult;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);9LCD_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]);}//蜂鸣函数voidBeep(){uchari,j=70;for(i=0;i200;i++){while(--j);SPK=~SPK;}DelayMS(300);SPK=0;}//时分秒显示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[7]=m/10+'0';//分HMS_String[8]=m%10+'0';HMS_String[10]=s/10+'0';//秒HMS_String[11]=s%10+'0';10Display_String(HMS_String,0x40);}//设置时间voidChange_Time(){Settime=0;if(K1==0||K2==0||K3==0)//按下k1k2k3中的任何一个键即进入修改状态{TR0=0;Display_String(Str2,0x00);//第一行提示修改时间Settime=1;}while(Settime){if(K1==0)//确定调整小时还是分钟{Beep();while(K1==0)Change_H_or_M=!Change_H_or_M;}elseif(K2==0)//增加{Beep();while(K2==0);if(Change_H_or_M==1){if(++Hour==24)Hour=0;}else{if(++Minute==60)Minute=0;}}elseif(K3==0)//减少11{Beep();while(K3==0);if(Change_H_or_M==1){if(--Hour==0xff)Hour=23;}else{if(--Minute==0xff)Minute=59;}}elseif(K4==0)//确定{Beep();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)12{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();//显示过程中允许修改时间}}13八、调试运行1、按硬件原理图接线用4个功能键操作来设置当前时间。功能键K1~K4功能如下。K1—进入设置现在的时间。K2—设置小时。K3—设置分钟。K4—确认完成设置。程序执行后工作指示灯LED闪动,表示程序开始执行,LED显示“00:00:00”,然后开始计时九、仿真截图结论:采用12MHZ晶振采用方式1定时,选取50ms采用20次中断达到一秒,采用查表方式控制LCD显示。根据仿真结果可知该编程及硬件电路符合要求:14十、设计心得体会课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.随着科学技术发展的日新日异,单片机已经成为当今计算机应用中空前活跃的领域,在生活中可以说得是无处不在。因此作为二十一世纪的大学来说掌握单片机的开发技术是十分重要的。回顾起此次单片机课程设计,至今我仍感慨颇多,的确,从选题到定稿,从理论到实践,在整整两星期的日子里,可以说得是苦多于甜,但是可以学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。这次课程设计终于顺利完成了,在设计中遇到了很多编程问题,最后在老师的辛勤指导下,终于游逆而解。同时,在老师的身上我学得到很多实用的知识,在次我表示感谢!同时,对给过我帮助的所有同学和各位指导老师再次表示忠心的感谢!
本文标题:电子时钟(LCD显示)
链接地址:https://www.777doc.com/doc-3611833 .html