单片机课程设计_第1页
单片机课程设计_第2页
单片机课程设计_第3页
单片机课程设计_第4页
单片机课程设计_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

武夷学院课程设计报告 LCD智能电子钟::目录一、设计任务与设计要求 3二、设计原理 3一、lcd实现时间日期显示 3(1)lcd1602介绍 3(2)1602的接口电路与工作时序 3(3)1602字符型LCD驱动程序设计 4二、74LS164实现按键扫描 4(1)74LS164关闭程序 5三、设计方案 6一、硬件部分 6(1)按键扫描的选择 6(2)显示器的选择 6(3)采用元件列表 6二、软件部分 6(1)按键扫描、确认及工作部分 6(2)LCD初始化程序 6(3)中断T0提高时间的更新 7四、调试与性能分析 8一、proteus仿真图 8二、实物调试图 8三、实际调试步骤 9四、性能分析 9五、心得体会 9六、成品展示 10附录部分 11附件一、电路设计原理图 11附件二、系统设计原始代码程序 12

一、设计任务与设计要求 设计一个LCD时钟显示系统。功能要求如下:可以调整时间日期,可设置一个闹钟,当时间到时用蜂鸣器提醒。二、设计原理一、lcd实现时间日期显示(1)lcd1602介绍1602液晶模块内部的控制器共有11条控制指令。如表4-8所示。表4-81602液晶模块指令表(2)1602的接口电路与工作时序LCD与单片机接口电路如图4-48所示。调整电位器RP400可改变LCD的对比度。LCD的工作时序如图4-49所示。从图中可以看出,写入命令或数据时,在LCD使能端E的下降沿时锁存数据;读状态或数据时,在LCD使能端E为高电平时输出数据。图4-481602LCD接口图(a)读时序图(b)写时序图图4-491602LCD读写时序图(3)1602字符型LCD驱动程序设计1602驱动程序设计主要是读写程序的设计。由时序图可知,LCD的工作时序与51单片机的读写时序不同。只能用软件模拟的方式产生工作时序。驱动程序可分为四种情况:LCD写命令、LCD读状态、LCD读数据、LCD写数据。流程图如图4-50所示。LCD读数据RS=1,E=0,RW=1返回输出数据LCD读数据RS=1,E=0,RW=1返回输出数据E产生正脉冲LCD读状态RS=0,E=0,RW=1返回输出数据E产生正脉冲LCD写数据RS=1,E=0,RW=0返回输出数据E产生正脉冲LCD写命令RS=0,E=0,RW=0返回输出数据E产生正脉冲二、74LS164实现按键扫描利用74LS164串入并出的特点,刚上电时先关闭74LS164,然后,先由DIN端移入低电平,后面移入7个高电平,从而对接8个输出口的按键进行扫描,74LS164的clk与单片机P3^4连接,应用软件方法实现时钟输出。其proteus图如下:图1(1)74LS164关闭程序:voidRead_Key() {P1=0xff;Keytemp<<=1; if(Key_InPut==1){ Keytemp++; }}voidkeyscan(){unsignedchartemp=0;if(Keytemp!=0xff)temp=Keytemp;if(temp==0){keyup=1;keybak=0;keyva=0;}elseif(temp==keybak&&keyup==1){keyva=temp;keyup=0;}elsekeybak=temp;}voidKey_job() {switch(Keyval) { case0x7f:x=1;break; case0xbf:y=1;break; case0xdf:m=1;break; case0xef:n=1;break; case0xf7:p=1;break; case0xfb:q=1;break; case0xfd:r=1;break; case0xfe:s=1;break; }}三、设计方案一、硬件部分(1)按键扫描的选择本设计所需的按键不多,如果采用独立式按键会比较浪费单片机I/O口,而采用74LS164作为按键扫描的作用,避免了利用独立式键盘浪费单片机I/O口,优化了单片机外围接口,使得单片机的利用率提高。(2)显示器的选择方案一:采用数码管进行显示,速率比较快,但是显示的数据量有限,并且显示内容有限。方案二:采用LCD1602进行显示,需要读写指令和数据的过程,显示速度相对数码管来说会慢些,但是LCD能显示2行32个字符,所显示的内容较之数码管丰富。本设计采用LCD作为显示器,尽可能的把时间等信息通过LCD显示出来,更直观。(3)采用元件列表74LS164、万利仿真机、按钮、LCD1602、蜂鸣器、电阻、UART口二、软件部分(1)按键扫描、确认及工作部分采用74LS164进行键值扫描,通过P1^0作为按键扫描的输出端,利用以下键值输出程序输出扫描到的按键值:voidRead_Key() //**键值读取函数**//{keytemp<<=1; if(Key_Input==1) {keytemp++;}}当74LS164进行8次移位后,键值输出。(2)LCD初始化程序voidWrite_com(ucharcom){ lcd_rw=0; lcd_rs=0; lcd_date=com; delay_ms(2); lcd_en=1; delay_ms(2); lcd_en=0;}voidWrite_dat(uchardat){ lcd_rw=0; lcd_rs=1; lcd_date=dat; delay_ms(2); lcd_en=1; delay_ms(2); lcd_en=0;}voidlcd_init(){ lcd_en=0; delay_ms(15); Write_com(0x38); delay_ms(5); Write_com(0x38); delay_ms(5); Write_com(0x38);//显示模式设置 Write_com(0x08);//显示关闭 Write_com(0X01);//清屏 Write_com(0x06);//显示光标移动设置 Write_com(0X0c);//显示开及光标设置}(3)中断T0提高时间的更新voidtimer0()interrupt1{TF0=0;TH0=0X3C;TL0=0XB0;t++;if(t==10&&keynum!=0)flag2=~flag2; if(t==20) { t=0; second++; if(second==60) { point++; second=0; if(point==60) { hour++; point=0; if(hour==24) { day++; week++; if(day==31)day=1; if(week==8)week=1; hour=0; }}}}}四、调试与性能分析一、proteus仿真图图2二、实物调试图图3三、实际调试步骤1、将程序代码载进万利仿真软件里,并且使得代码编译无错误;2、将万利仿真机和设计板接入电源,并且通过万利软件将代码输出到万利仿真机进行调试;3、代码输出成功后,根据设计所需要的功能在板上调试,将调试结果拍照进行分析。四、性能分析按键按下时有时候不能实现对应功能,原因是lcd工作频率较慢;P2^3除了用作74LS164的DIN端外还用于LCD1602的RW端,调试时得对代码进行相关的调整,以避免工作紊乱。五、心得体会通过这次设计性试验,知道了80C51、LCD1602以及164做按键扫描的工作原理,加深了对单片机程序设计的理解以及对单片机的硬件电路了解加深。另外学会了如何将课堂上学到的东西应用到实际设计上来,对自己实际操作能力的能有着很大的提高。六、成品展示附录部分附件一、电路设计原理图附件二、系统设计原始代码程序/************************************************P2.3口lcd和按键同时占用lcd时钟显示包括闹钟(响十秒)整点报时时间设置日期设置(只能调日和星期)k0切换显示(时间或年月日)k1切换所要调的0~6(要调的位置会闪烁0什么都不调)k2k3调加减和闹钟开关*************************************************/#include<reg52.h>#include<intrins.h>#defineucharunsignedchar#defineuintunsignedint#definelcd_dateP0sbitLEDCLK=P3^4;sbitLEDDIN=P2^3;sbitPoint=P0^0;sbitBEEP=P1^2;sbitKey_InPut=P1^0;sbitlcd_en=P2^2;sbitlcd_rw=P2^3;sbitlcd_rs=P2^4;ucharkeynum=0;ucharKeytemp;ucharKeyval;ucharA1,A2,A3,A4,A5,A6,g,h,h1,h2,f1,f2,d1,d2,w1;ucharsecond=0;ucharminute=10;ucharhour=14;ucharzhou=2;uchartian=1;ucharshi=0,fen=0;uchart;unsignedcharkeybak=0,keyb;//前一个键盘备份unsignedcharkeyva=0;//按键值存放单元bitx=0,y=0,m=0,n=0,p=0,q=0,r=0,s=0;bitkeyup,flag=0,flag1=0,flag2=0;//按键是否执行标志ucharidatatable1[]={'','','','','','1','4','-','1','0','-','0','0','',''};ucharidatatable2[]={'0','0','-','0','0','','','c'};ucharidatatable3[]={'','2','0','1','3','-','0','1','-','0','1','',''}; ucharidatatable4[]={'','z','h','o','u','-','','2',''};voiddelay_ms(unsignedinttms) {unsignedchari;while(tms--)for(i=123;i>0;i--);}voiddelay_us(unsignedinttt) { while(tt--) { ; }}//蜂鸣器voidBeep(){uchari;for(i=0;i<100;i++){delay_ms(1);BEEP=~BEEP;}BEEP=0;}voidWrite_com(ucharcom){ lcd_rw=0; lcd_rs=0; lcd_date=com; delay_ms(2); lcd_en=1; delay_ms(2); lcd_en=0;}voidWrite_dat(uchardat){ lcd_rw=0; lcd_rs=1; lcd_date=dat; delay_ms(2); lcd_en=1; delay_ms(2); lcd_en=0;}voidlcd_init(){ lcd_en=0; delay_ms(15); Write_com(0x38); delay_ms(5); Write_com(0x38); delay_ms(5); Write_com(0x38);//显示模式设置 Write_com(0x08);//显示关闭 Write_com(0X01);//清屏 Write_com(0x06);//显示光标移动设置 Write_com(0X0c);//显示开及光标设置}voidupdata_table1() //lcd显示更新{ A1=hour/10; A2=hour%10; A3=minute/10; A4=minute%10; A5=second/10; A6=second%10; d1=tian/10; d2=tian%10; w1=zhou%10; h1=shi/10; h2=shi%10; f1=fen/10; f2=fen%10; table1[5]=A1+'0'; table1[6]=A2+'0'; table1[8]=A3+'0'; table1[9]=A4+'0'; table1[11]=A5+'0'; table1[12]=A6+'0'; table2[0]=h1+'0'; table2[1]=h2+'0'; table2[3]=f1+'0'; table2[4]=f2+'0';if(flag1==0)table2[7]='c';if(flag1==1)table2[7]='o'; table3[9]=d1+'0'; table3[10]=d2+'0'; table4[7]=w1+'0';}voidRead_Key() //读按键值{P1=0xff;Keytemp<<=1; if(Key_InPut==1){ Keytemp++; }}voidkeyscan(){unsignedchartemp=0;//临时变量if(Keytemp!=0xff)temp=Keytemp;if(temp==0){keyup=1;//按键已经放开keybak=0;//清除按键备份值keyva=0;}elseif(temp==keybak&&keyup==1)//两次的检测的值一样且按键已经放开{keyva=temp;//存放按键值keyup=0;}else//按键已经执行且还没放开keybak=temp;//把新的键值放入备份单元}voidkey_data(){ucharj;LEDCLK=0;LEDDIN=0;_nop_();LEDCLK=1;for(j=0;j<8;j++){Read_Key();LEDCLK=0;LEDDIN=1;_nop_();LEDCLK=1;}} voidKey_job() //键值{switch(Keyval) { case0x7f:x=1;break; case0xbf:y=1;break; case0xdf:m=1;break; case0xef:n=1;break; case0xf7:p=1;break; case0xfb:q=1;break; case0xfd:r=1;break; case0xfe:s=1;break; }}voidkey_choose(){if(y==1&&Keytemp==0xff) { keynum++; Beep(); if(keynum==7)keynum=0; y=0; } if(flag2==1) { switch(keynum) { case1:table1[6]='';break; case2:table1[9]='';break; case3:table2[1]='';break; case4:table2[4]='';break; case5:table2[7]='';break; case6:table3[10]='';table4[7]='';break; } }}voidkey_updata() {if(x==1&&Keytemp==0xff){ Beep(); x=0; flag=~flag; }if(keynum==1&&Keytemp==0xff&&m==1) { hour++; if(hour==24)hour=0; m=0; }if(keynum==1&&Keytemp==0xff&&n==1) { hour--; if(hour==0xff)hour=23; n=0; }if(keynum==2&&Keytemp==0xff&&m==1){minute++; if(minute==60)minute=0; m=0; }if(keynum==2&&Keytemp==0xff&&n==1) { minute--; if(minute==0xff)minute=59; n=0;}if(keynum==6&&Keytemp==0xff&&m==1){tian++;zhou++;if(tian==32)tian=1; if(zhou==8)zhou=1; m=0; }if(keynum==3&&Keytemp==0xff&&m==1) { shi++; if(shi==24)shi=0; m=0; }if(keynum==3&&Keytemp==0xff&&n==1) { shi--; if(shi==0xff)shi=23; n=0; }if(keynum==4&&Keytemp==0xff&&m==1){fen++; if(fen==60)fen=0; m=0; }if(keynum==4&&Keytemp==0xff&&n==1){fen--; if(fen==0xff)fen=59; n=0; }if(keynum==5&&Keytemp==0xff&&m==1) { flag1=~flag1; m=0;}} voidkey_init(){ uchari;for(i=0;i<8;i++){LEDCLK=0;LEDDIN=1;_nop_();LEDCLK=1;}TMOD=0x01;TH0=0x3C;TL0=0xB0;EA=1;ET0=1;TR0=1;}voidalarm(){if(minute==0x3b&&second==0x3b) Beep(); if(flag1==1) { if(hour==shi&&minute==fen) { Beep(); if(second==10)flag1=0; } }}voidlcd_display(){ucharnum;if(flag==0){ Write_com(0X80+0x00); for(num=0;num<15;num++) { Write_dat(table1[num]); }Wri

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论