单片机时钟显示温度显示_第1页
单片机时钟显示温度显示_第2页
单片机时钟显示温度显示_第3页
单片机时钟显示温度显示_第4页
单片机时钟显示温度显示_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

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

文档简介

南华大学计算机技术综合课程设计报告学院:湘南学院题目:单片机LCD时钟显示和温度丈量学生姓名:专业班级:指导老师:教研室主任:2012年6月29日一、归纳:本次设计的LCD时钟显示和温度丈量系统是由中央控制器、温度检测器、时钟系统、显示器及键盘部分组成。控制器采纳单片机STC89C51RC,温度检测部分采纳DS18B20温度传感器,时钟系统用时钟芯片DS1302,用LCD液晶1602作为显示器,用蜂鸣器组成闹铃模块。单片机经过时钟芯片

DS1302获取时间数据,对数据办理后显示时间;温度传感器

DS18B20收集温度信号送该给单片机办理;单片机再把时间数据和温度数据送液晶显示器1602显示;键盘是用来调整时间的。二、方案设计及方案论证时钟显示和温度丈量的整体设计思路依据系统的设计功能要求,本时钟显示和温度丈量系统的设计一定采纳单片机软件系统实现,用单片机的自动控制能力配合按键控制,来控制时钟、温度的调整及显示。获取时钟显示和温度丈量数据信息,单片机对其进行一系列的办理,最后经过液晶显示出来。时钟显示和温度丈量系统方案论证时钟系统方案选择方案1:经过单片机内部的准时器/计数器,用软件实现,直接用单片机的准时器编程以实现时钟;方案2:用特意的时钟芯片实现时钟的记时,再把时间数据送入单片机,由单片机控制显示。固然用软件实现时钟硬件线路简单,但是程序运转的每一步都需要时间,多一步或少一步程序都会影响记时的正确度,瞄准时器准时也不是十分正确,时钟精度很低,对于我们实现所需要的功能造成软件编程特别复杂。用专用时钟芯片硬件成真相对较高,但它的精度很高,软件编程很简单。综上所述,选择方案2。本次设计采纳拥有涓细电流充电能力的低功耗实时时钟电路DS1302。它可以对年、月、日、周日、时、分、秒进行计时,且拥有闰年补偿等多种功能。它采纳主电源和备用电源双电源供电。它的工作电压范围~,在时,小于300nA。它内部含有31个字节的静态RAM,可供给用户接见。?DS1302可以对年、月、日、周日、时、分、秒进行计时,可以达到我们设计的基本的要求。内部的寄存器为我们调时,闹钟准时供给了寄存空间。备用用电源也实现了当系统断电后,时钟依旧可以保持。并且它是串行接口,与单片机通讯所需要的接口少。显示系统的方案比较方案1:用数码管或LED显示。方案2:用液晶1602显示。方案3:用液晶12864显示。时钟和温度的显示可以用数码管或LED,并且价格低价。但是数码管的只好显示简单的设计的系统,与我们设计要求也不吻合。有很多东西需要显示,仍是用显示功能更好的液晶显示器比较好,它能显示更多的数据,用12864显示略想复杂,用1602液晶显示可以完整知足本次设计的数据显示要求。温度系统方案选择方案1:用热敏电阻等测温元件测出电压,再变换成对应的温度。需要比很多的外面元件支持,且硬件电路复杂,制作成真相对较高。方案2:用DS18B20直接测温。DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,它能直接读出被测温度,并且可依据实质要求经过简单的编程实现9~12位的数字值读数方式。经比较,我们选择方案2。温度实现只好经过外面的温度传感器来实现。经上网查阅,DS18b20体积小,只有3只脚,电路接法简单。精度为°C,也吻合我们设计的要求。DS18B20也是我们平时使用的型号,所以温度传感器用DS18B20。键盘控制方案选择方案1:购买集成键盘,采纳矩阵形式连接。方案2:购买单个复位开关做成键盘。固然集成键盘雅观,与单片机的接口少,但是它的成本比较高。单片机的IO口对于我们的设计绰绰有余。平时我们采纳价格低价单个复位开关做成键盘。时钟显示和温度丈量系统整体设计初步确立设计系统由单片机主控模块、时钟模块、测温模块、闹铃模块、显示模块、键盘接口模块共6个模块组成,电路系统框图以下列图所示。1602DS18B20主显示系统温度收集系统控器蜂鸣器件闹铃系统DS1320STC89C51时间收集系统键盘控制系统图1:电路系统框图三、硬件电路单元设计1、单片机最小系统设计复位电路:复位电路有两种方式:上电复位和按钮复位,我们主要用按钮复位方式。以下列图所示:图2:复位电路晶振电路晶振电路采用条件:晶振12M,电容20pF到30pF,本电路采用20pF。晶振电路原理以下列图:图3:晶振电路2、时钟系统设计DS1302时钟电路晶振采纳,原理图以下:图4:基于ds1302时钟系统设计电路3、温度系统设计DS18B20温度传感DQ端接单片机口,电路原理图以下:图5:基于DS18b20温度系统设计电路4、液晶显示系统设计1602液晶显示电路由1K电阻和10K的精美电阻组成,控制端接、、口,数据端接P2口,电路图以下:图6:液晶1602显示电路把15脚的10K电阻改成1K电阻5、蜂鸣器系统设计蜂鸣器闹铃电路由蜂鸣器跟1K限流电阻组成,电路图以下:图7:蜂鸣器电路6、电源模块本系统采纳USB供电,用发光二极管显示通电情况,电源电源电路以下:图8:电源电路7、时间调治模块本系统采纳3个按键调治时间。S1是菜单键,选纲要调治的位;S2按一下表示加一;S3按一下表示减一。电路以下:图9:时钟调治电路四、软件调试1、程序流程图以下:图10:程序流程图2、程序见附录五、硬件调试1、原理图以下:图11:总原理图2、PCB图以下:图12:PCB图此中红色部分为跳线;3、实物测试板子制作完成后上电测试发现电源灯没有显示,用万用表丈量此后发现精美电阻接线错误,致使VCC与GND直接连通。修正此后发现电源指示灯仍是没有亮,丈量USB两端电压为,卸掉USB口,插上排针用杜邦线连接单片机的VCC和GND此后,电源灯可以点亮,液晶可以驱动,但是亮度不够。丈量液晶两端的电压发现只有,用导线将液晶背光的VCC直接接上电源VCC后,液晶亮度正常。将程序下载此后经过几次调试和更正,最后实现了想要达到的收效。六、总结与领悟在开始本次课程设计前花销了十多天的时间认真学习了单片机,经过书籍和视频的学习,对单片机有了进一步的掌握并学会C51编程的一些方法。这对于完成本次课程设计供给了很大的帮助。此后次的课程设计中,我真真切正的意识到,在写程序时,逻辑思想要清楚,要有耐心。同时要奇妙的利用C语言的可移植性,这对写程序有很大的帮助。参照文件:1.郭天祥单片机学习板配套资料2.《51单片机C语言教程》郭天祥主编电子工业第一版社3.《C语言程序设计》尹业安,白燕主编国防科技大学第一版社4.《单片机原理与应用及C51程序设计》谢维成杨加国主编清华大学第一版社程序以下:#include<>#include<>#defineucharunsignedchar#defineuintunsignedint#defineLCDIOP2sbitDQ=P1^3;write_com(0x01);write_com(0x80);//设置初始化数据指针,是在读指令的操作里进行的delay(5);write_com(0x80);//初始化显示时间(tabletable1中的内容)for(num=0;num<15;num++){write_date(table[num]);delay(5);}write_com(0x80+0x40);for(num=0;num<15;num++){write_date(table1[num]);delay(5);}}voidWrite1302(uchardat)

//写

8bit

数据{uchari;SCLK=0;

//拉低

SCLK,为脉冲上升沿写入数据做好准备delay1(2);for(i=0;i<8;i++)

//略微等待,使硬件做好准备//连续写8个二进制位数据{DATA=dat&0x01;

//拿出

dat

的第

0位数据写入

1302delay(2);SCLK=1;

//略微等待,使硬件做好准备//上升沿写入数据delay1(2);SCLK=0;dat>>=1;

//略微等待,使硬件做好准备//重新拉低SCLK,形成脉冲//将dat的各数据位右移1位,准备写入下一个数据位}}voidWriteSet1302(ucharCmd,uchardat)//向cmd相应地址中写入一个字节的数据{RST=0;//严禁数据传达SCLK=0;//保证写数居前SCLK被拉低RST=1;//启动数据传输delay1(2);//略微等待,使硬件做好准备Write1302(Cmd);//写入命令字Write1302(dat);//写数据SCLK=1;//将时钟电平置于已知状态RST=0;//严禁数据传达}ucharRead1302(void)//读8bit数据{uchari,dat;delay(2);//略微等待,使硬件做好准备for(i=0;i<8;i++)//连续读8个二进制位数据{dat>>=1;

//将

dat

的各数据位右移

1位,由于先读出的是字节的最低位if(DATA==1)dat|=0x80;SCLK=1;

//若是读出的数据是1//将1拿出,写在dat的最高位//将SCLK置于高电平,为降落沿读出delay1(2);SCLK=0;

//略微等待//拉低

SCLK,形成脉冲降落沿delay1(2);

//略微等待}returndat;

//将读出的数据返回}ucharReadSet1302(ucharCmd)//从cmd相应地址中读一个字节的数据{uchardat;RST=0;SCLK=0;

//拉低RST//保证写数居前

SCLK

被拉低RST=1;

//启动数据传输Write1302(Cmd);

//写入命令字dat=Read1302( );SCLK=1;

//读出数据//将时钟电平置于已知状态RST=0;

//严禁数据传达returndat;

//将读出的数据返回}voidInit_DS1302(void){WriteSet1302(0x8E,0x00);//依据写状态寄存器命令字,写入不保护指令WriteSet1302(0x80,((0/10)<<4|(0%10)));//依据写秒寄存器命令字,写入秒的初始值WriteSet1302(0x82,((45/10)<<4|(45%10)));//依据写分寄存器命令字,写入分的初始值WriteSet1302(0x84,((8/10)<<4|(8%10)));//依据写小时寄存器命令字,写入小时的初始值WriteSet1302(0x86,((29/10)<<4|(29%10)));//依据写日寄存器命令字,写入日的初始值WriteSet1302(0x88,((6/10)<<4|(6%10)));//依据写月寄存器命令字,写入月的初始值WriteSet1302(0x8c,((12/10)<<4|(12%10)));//依据写年寄存器命令字,写入年的初始值WriteSet1302(0x8a,((1/10)<<4|(1%10)));//依据写礼拜寄存器命令字,写入礼拜的初始值}voidDisplaySecond(ucharx){

//显示秒uchari,j;i=x/10;j=x%10;write_com(0xc7);write_date(0x30+i);write_date(0x30+j);}voidDisplayMinute(ucharx){

//显示分uchari,j;i=x/10;j=x%10;write_com(0xc4);write_date(0x30+i);write_date(0x30+j);}voidDisplayHour(ucharx)

//显示小时{uchari,j;i=x/10;j=x%10;write_com(0xc1);write_date(0x30+i);write_date(0x30+j);}voidDisplayDay(ucharx)//显示日期、天{uchari,j;i=x/10;j=x%10;write_com(0x89);write_date(0x30+i);write_date(0x30+j);}voidDisplayMonth(ucharx)//显示日期、月{uchari,j;i=x/10;j=x%10;write_com(0x86);write_date(0x30+i);write_date(0x30+j);}voidDisplayYear(ucharx)//显示日期、年{uchari,j;i=x/10;j=x%10;write_com(0x83);write_date(0x30+i);write_date(0x30+j);}voidDisplayWeek(ucharx)//显示礼拜{uchari;x=x*3;write_com(0x8c);for(i=0;i<3;i++){write_date(table2[x]);x++;}}voidread_date(void){ReadValue=ReadSet1302(0x81);second=((ReadValue&0x70)>>4)*10

+(ReadValue&0x0F);

//从DS1302读取时间秒ReadValue=ReadSet1302(0x83);minute=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);

//从DS1302读取时间分ReadValue=ReadSet1302(0x85);hour=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);

//从

DS1302读取时间小时ReadValue=ReadSet1302(0x87);day=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);

//从

DS1302读取日期日ReadValue=ReadSet1302(0x89);month=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);DS1302读取日期月ReadValue=ReadSet1302(0x8d);year=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);

//从

//从DS1302读取日期年ReadValue=ReadSet1302(0x8b);week=ReadValue&0x07;

//从

DS1302

读礼拜DisplaySecond(second);

//显示秒、分、小时、天、月、年、礼拜DisplayMinute(minute);DisplayHour(hour);DisplayDay(day);DisplayMonth(month);DisplayYear(year);DisplayWeek(week);}voidturn_val(charnewval,ucharflag,ucharnewaddr,uchars1num)//刷新时间(将改变的时间显示到LCD上){newval=ReadSet1302(newaddr);//读取当前时间newval=((newval&0x70)>>4)*10+(newval&0x0f);//将bcd码变换成十进制if(flag)//判断是加一仍是减一{newval++;switch(s1num){case1:if(newval>99)newval=0;DisplayYear(newval);break;case2:if(newval>12)newval=1;DisplayMonth(newval);break;case3:if(newval>31)newval=1;DisplayDay(newval);break;case4:if(newval>6)newval=0;DisplayWeek(newval);break;case5:if(newval>23)newval=0;DisplayHour(newval);break;case6:if(newval>59)newval=0;DisplayMinute(newval);break;case7:if(newval>59)newval=0;DisplaySecond(newval);break;default:break;}}else{newval--;switch(s1num){case1:if(newval==0)newval=99;DisplayYear(newval);break;case2:if(newval==0)newval=12;DisplayMonth(newval);break;case3:if(newval==0)newval=31;DisplayDay(newval);break;case4:if(newval<0)newval=6;DisplayWeek(newval);break;case5:if(newval<0)newval=23;DisplayHour(newval);break;case6:if(newval<0)newval=59;DisplayMinute(newval);break;case7:if(newval<0)newval=59;DisplaySecond(newval);break;default:break;}}WriteSet1302((newaddr-1),((newval/10)<<4)|(newval%10));//将新数据写入寄存器}voidkey_scan(void)

//键盘扫描程序{ucharmiao,s1num=0;if(menu==0){delay(5);if(menu==0){while(!menu);s1num++;while(1){if(menu==0){delay(5);if(menu==0){while(!menu);s1num++;}}rd=0;miao=ReadSet1302(0x81);second=miao;WriteSet1302(0x80,miao|0x80);write_com(0x0f);//光标闪射if(s1num==1){year=ReadSet1302(0x8d);write_com(0x80+4);//年光标if(add==0){delay(3);if(add==0){while(!add);turn_val(year,1,0x8d,1);}}if(dec==0){delay(3);if(dec==0){while(!dec);turn_val(year,0,0x8d,1);}}}if(s1num==2){month=ReadSet1302(0x89);write_com(0x80+7);//月光标if(add==0){delay(3);if(add==0){while(!add);turn_val(month,1,0x89,2);}}if(dec==0){delay(3);if(dec==0){while(!dec);turn_val(month,0,0x89,2);}}}if(s1num==3){day=ReadSet1302(0x87);write_com(0x80+10);//日光标if(add==0){delay(3);if(add==0){while(!add);turn_val(day,1,0x87,3);}}if(dec==0){delay(3);if(dec==0){while(!dec);turn_val(day,0,0x87,3);//写入日寄存器}}}if(s1num==4){week=ReadSet1302(0x8b);write_com(0x80+14);//礼拜光标if(add==0){delay(3);if(add==0){while(!add);turn_val(week,1,0x8b,4);}}if(dec==0){delay(3);if(dec==0){while(!dec);turn_val(week,0,0x8b,4);}}}if(s1num==5){hour=ReadSet1302(0x85);write_com(0x80+0x40+2);//岁月标if(add==0){delay(3);if(add==0){while(!add);turn_val(hour,1,0x85,5);}}if(dec==0){delay(3);if(dec==0){while(!dec);turn_val(hour,0,0x85,5);}}}if(s1num==6)//调时间分{minute=ReadSet1302(0x83);write_com(0x80+0x40+5);if(add==0){delay(5);if(add==0){while(!add);turn_val(minute,1,0x83,6);//写入分寄存器}}if(dec==0){delay(3);if(dec==0){while(!dec);turn_val(minute,0,0x83,6);//写入分寄存器}}}if(s1num==7)//调时间秒{second=ReadSet1302(0x81);write_com(0x80+0x40+8);//秒光标if(add==0){delay(3);if(add==0){while(!add);if(second==0x60)second=0x00;turn_val(second,1,0x81,7);}}if(dec==0){delay(3);if(dec==0){while(!dec);turn_val(second,0,0x81,7);}}}if(s1num==8){miao=ReadSet1302(0x81);second=miao;WriteSet1302(0x80,second&0x7f);s1num=0;//s1num清零write_com(0x0c);//光标不闪耀break;}}}}}voiddelay_18B20(unsignedinti)//延时1微秒{while(i--);}voidds1820rst( )//ds1820复位{unsignedcharx=0;DQ=1;

//DQ

复位delay_18B20(4);

//延时DQ=0;

//DQ

拉低delay_18B20(100);//精确延时大于480usDQ=1;

//拉高delay_18B20(40);}uchards1820rd( )///读数据{unsignedchari=0;unsignedchardat=0;for(i=8;i>0;i--){DQ=0;//给脉冲信号dat>>=1;DQ=1;//给脉冲信号if(DQ)dat|=0x80;delay_18B20(10);}return(dat);}voidds1820wr(ucharwdata)//写数据{unsignedchari=0;for(i=8;i>0;i--){DQ=0;DQ=wdata&0x01;delay_18B20(10);DQ=1;wdata>>=1;}}read_temp( )//读取温度值并变换{uchara,b;ds1820rst( );ds1820wr

温馨提示

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

评论

0/150

提交评论