51单片机时钟显示+温度显示

上传人:jin****ng 文档编号:164542141 上传时间:2022-10-25 格式:DOCX 页数:28 大小:99.83KB
收藏 版权申诉 举报 下载
51单片机时钟显示+温度显示_第1页
第1页 / 共28页
51单片机时钟显示+温度显示_第2页
第2页 / 共28页
51单片机时钟显示+温度显示_第3页
第3页 / 共28页
资源描述:

《51单片机时钟显示+温度显示》由会员分享,可在线阅读,更多相关《51单片机时钟显示+温度显示(28页珍藏版)》请在装配图网上搜索。

1、南华大学计算机技术综合课程设计报告学院:湘南学院题目: 单片机 LCD 时钟显示和温度测量学生姓名:专业班级:指导老师:教研室主任:2012年 6 月 29 日一、概述:本次设计的LCD时钟显示和温度测量系统是由中央控制器、温度检测器、时钟系统、显示器及键 盘部分组成。控制器采用单片机STC89C51RC温度检测部分采用DS18B20温度传感器,时钟系统用 时钟芯片DS1302用LCD液晶1602作为显示器,用蜂鸣器构成闹铃模块。单片机通过时钟芯片DS1302 获取时间数据,对数据处理后显示时间;温度传感器DS18B20 采集温度信号送该给单片机处理;单片机再把时间数据和温度数据送液晶显示器

2、1602显示;键盘是用来调整时间的。二、方案设计及方案论证1. 时钟显示和温度测量的总体设计思路按照系统的设计功能要求,本时钟显示和温度测量系统的设计必须采用单片机软件系统实现, 用单 片机的自动控制能力配合按键控制, 来控制时钟、温度的调整及显示。获得时钟显示和温度测 量数据 信息,单片机对其进行一系列的处理,最后通过液晶显示出来。2. 时钟显示和温度测量系统方案论证2.1 时钟系统方案选择方案1:通过单片机内部的定时器/计数器,用软件实现,直接用单片机的定时器编程以实现时 钟; 方案 2:用专门的时钟芯片实现时钟的记时,再把时间数据送入单片机,由单片机控制显示。虽然用软件实现时钟硬件线路简

3、单,但是程序运行的每一步都需要时间,多一步或少一步程序仅供参考都会影响记时的准确度,对定时器定时也不是十分准确,时钟精度很低,对于我们实现所需要的功 能造 成软件编程非常复杂。用专用时钟芯片硬件成本相对较高,但它的精度很高,软件编程很简单。 综上所 述,选择方案 2。本次设计采用具有涓细电流充电能力的低功耗实时时钟电路DS1302 它可以对年、月、日、周日、时、分、秒进行计时,且具有闰年补偿等多种功能。它采用主电源和备用电源双电源供电。 它的 工作电压范围2.05.5V,在2.2V时,小于300nA。它内部含有31个字节的静态RAM可提供用户访问。?DS1302可以对年、月、日、周日、时、分、

4、秒进行计时,可以达到我们设计的基本的要求。内部 的寄存器为我们调时,闹钟定时提供了寄存空间。备用用电源也实现了当系统断电后, 时钟仍然 可以保 持。而且它是串行接口,与单片机通信所需要的接口少。2.2显示系统的方案比较方案1:用数码管或LED显示。方案2:用液晶1602显示。方案3 :用液晶1 2864显示。时钟和温度的显示可以用数码管或LED而且价格便宜。但是数码管的只能显示简单的设计的系 统,与我们设计要求也不相符。有很多东西需要显示,还是用显示功能更好的液晶显示器比较好,它 能显示更多的数据,用 12864显示略想复杂,用 1602液晶显示可以完全满足本 次设计的数据显示 要求。2.3温

5、度系统方案选择 方案1:用热敏电阻等测温元件测出电压,再转换成对应的温度。需要比较多的外部元件支持, 且硬 件电路复杂,制作成本相对较高。方案2:用DS18B2C直接测温。DS18B20温度传感器是美国DALLAS#导体公司最新推出的一种改 进型智能温度传感器,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现912位的数字值读数方式。经比较,我们选择方案 2。温度实现只能通过外部的温度传感器来实现。经上网查阅,DS18b20体积小,只有3只脚,电路接法简单。精度为0.5 C,也符合我们设计的要求。DS18B20也是我们通常使用的型号,因此温度传 感器用 DS18B202.4 键盘控制

6、方案选择方案1:购买集成键盘,采用矩阵形式连接。方案 2:购买单个复位开关做成键盘。 虽然集成键盘美观,与单片机的接口少,但是它的成本比较高。单片机的 10口对于我们的设 计绰绰有余。通常我们选用价格便宜单个复位开关做成键盘。3. 时钟显示和温度测量系统总体设计初步确定设计系统由单片机主控模块、时钟模块、测温模块、闹铃模块、显示模块、键盘接口模块共 6个模块组成,电路系统框图如下图所示图 1 :电路系统框图三、硬件电路单元设计1、单片机最小系统设计1.1 复位电路: 复位电路有两种方式:上电复位和按钮复位,我们主要用按钮复位方式。如下图所示 图 2 :复位电路1.2 晶振电路晶振电路选取条件:

7、晶振12M电容20pF到30pF,本电路选取20pF。晶振电路原理如下图:图3: 晶振电路2、时钟系统设计DS1302时钟电路晶振选用3.2678KHZ原理图如下:图 4:基于 ds1302 时钟系统设计电路3、温度系统设计DS18B2C温度传感DC端接单片机P1.3 口,电路原理图如下:图5:基于DS18b20温度系统设计电路4、液晶显示系统设计1602液晶显示电路由1K电阻和10K的精密电阻组成,控制端接P1.0、P1.1、P1.2 口,数据端 接 P2 口,电路图如下:图 6:液晶 1602 显示电路5、蜂鸣器系统设计蜂鸣器闹铃电路由蜂鸣器跟1K限流电阻组成,电路图如下: 图 7:蜂鸣器

8、电路6、电源模块本系统采用USB供电,用发光二极管显示通电状况,电源电源电路如下:图 8 :电源电路7、时间调节模块本系统采用3个按键调节时间。S1是菜单键,选择要调节的位;S2按一下表示加一;S3按一下表 示减一。电路如下:图 9:时钟调节电路四、软件调试1、程序流程图如下:图1 0:程序流程图2、程序见附录五、硬件调试1、原理图如下:图1 1 :总原理图2、PCB 图如下:图12: PCB图其中红色部分为跳线;3、实物测试 板子制作完成后上电测试发现电源灯没有显示,用万用表测量之后发现精密电阻接线错误,导 致 VCC与GND直接连通。修正之后发现电源指示灯还是没有亮,测量USB两端电压为-

9、4.88V,卸掉USB 口,插上排针用杜邦线连接单片机的VCC和GND之后,电源灯能够点亮,液晶能够驱动,但是亮 度不够。测量液晶两端的电压发现只有2.5V,用导线将液晶背光的VCC直接接上电源VCC后,液晶亮度正常。将程序下载之后经过几次调试和修改,最终实现了想要达到的效果。六、总结与体会在开始本次课程设计前花费了十多天的时间认真学习了单片机,通过书本和视频的学习,对单 片机有了进一步的掌握并学会 C51 编程的一些方法。这对于完成本次课程设计提供了很大的帮助。从这次的课程设计中,我真真正正的意识到,在写程序时,逻辑思维要清晰,要有耐心。同时 要巧 妙的利用C语言的可移植性,这对写程序有很大

10、的帮助。参考文献:1 郭天祥单片机学习板配套资料2. 51单片机C语言教程郭天祥主编电子工业出版社3. C语言程序设计尹业安,白燕主编国防科技大学出版社4. 单片机原理与应用及 C51 程序设计谢维成杨加国主编清华大学出版社 程序如下:#in clude#i ncludevi ntri ns.h#defi ne uchar un sig ned char#defi ne uint un sig ned int#defi ne LCDIOP2sbit DQ=PlA3;/ds18b20 与单片机连接口sbit rs=P1A0;仅供参考sbit rd=P1A1;sbit Icde n=PM2;sbi

11、t acc0=ACCA0; sbit acc7=ACCA7;移位时的第 0 位/移位时用的第 7 位uchar sec ond,minu te,hour,day, mon th,year,week,co un t=0; uchar ReadValue ,nu m,time; uint tvalue;/ 温度值uchar tflag;uchar code table= 2012-06-29 FIR;uchar code table1= 08:45:00 000.0C;uchar code table2= FRISATSUNMONTUEWESTUR;uchar data disdata5;sbit

12、 DATA=P0A1; / 时钟数据接口sbit RST=P0A2;sbit SCLK=P0A0; sbit me nu=P3A5; sbit add=P3A6;sbit dec=P3A7; void delay( uint z)/菜单加一减一uint x,y; for(x=z;x0;x_) for(y=110;y0;y-);void delay1( uint z) for(;z0;z-);void write_com(uchar com) _rs=0;rd=0; lcde n=0;P2=com;delay(5);lcde n=1;delay(5);lcde n=0;/led写命令指令:RS=

13、L,RW=L, D0D7=指令码,E=高脉冲void write_date(uchar date) _rs=1;rd=0; lcde n=0;P2=date;delay(5);仅供参考/led写数据指令:RS=H,RW=L, D0D7=数据,E=高脉冲lcde delay(5); n=0;n=1; lcdevoid init()uchar num; lcden=0;write_com(0x38);H显示模式设置,默认为0x38,不用变。write_com(0x0c);/显示功能设置0x0f为开显示,显示光标,光标闪烁;0x0c为开显示,不显光标,光标不闪write_com(0x06);writ

14、e_com(0x01);write_com(0x80);ii设置光标状态默认0x06,为读一个字符光标加1. 显示清屏,将上次的内容清除,默认为 0x01.II 设置初始化数据指针,是在读指令的操作里进行的delay(5);write_com(0x80);初始化显示时间(table tablel中的内容)for(num=0; num 15; nu m+) write_date(table nu m); delay(5); write_com(0x80+0x40); for(num=0; num 15; nu m+)write_date(table1 nu m); dela y(5);void

15、Write1302(uchar dat)II 写 8bit 数据delay1(2);for(i=0;i=1;II 稍微等待,使硬件做好准备上升沿写入数据II 稍微等待,使硬件做好准备重新拉低SCLK,形成脉冲II将dat的各数据位右移1位,准备写入下一个数据位DATA=dat&0x01; 取出dat的第0位数据写入1302void WriteSet1302(uchar Cmd,uchar dat)II向cmd相应地址中写入一个字节的数据RST=0;仅供参考/禁止数据传递SCLK=O;/确保写数居前 SCLK 被拉低RST=1;/启动数据传输delay1(2);/稍微等待,使硬件做好准备Writ

16、e1302(Cmd); / 写入命令字 Write1302(dat); / 写数据SCLK=1;/将时钟电平置于已知状态RST=O;禁止数据传递uchar Read1302(void)/读 8bit 数据uchar i,dat;delay(2); 稍微等待,使硬件做好准备 for(i=0;i=1;将 dat 的各数据位右移 1 位,因为先读出的是字节的最低位if(DATA=1)如果读出的数据是 1dat|=0x80;/将 1 取出,写在 dat 的最高位SCLK=1;/将 SCLK 置于高电平,为下降沿读出delay1 (2); /稍微等待SCLK=O;拉低SCLK,形成脉冲下降沿delay1

17、 (2); /稍微等待return dat;1将读出的数据返回ucharuchar dat;ReadSet1302(uchar Cmd)RST=0;SCLK=0;RST=1;Write1302(Cmd);/拉低 RSTdat=Read1302();/确保写数居前SCLK=1;/启动数据传输RST=0;/写入命令字return dat;/读出数据/将时钟电平置于已知状态/禁止数据传递/将读出的数据返回/从 cmd 相应地址中读一个字节的数据SCLK 被拉低void In it_DS1302(void)WriteSet1302(0x8E,0x00);WriteSet1302(0x80,(0/10)

18、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);/根据写状态寄存器命令字,写入不保护指令 / 根据写秒寄存器命令字,写入秒的初始值 根据写分寄存器命令字,写入分的初始值 /根据写小时寄存器命令字,写入小时的初始

19、值 根据写日寄存器命令字,写入日的初始值 根据写月寄存器命令字,写入月的初始值根据写年寄存器命令字,写入年的初始值 /根 uchar i,j; i=x/10;j=x%10;write_com(0xc7);write_date(0x30+i);write_date(0x30+j); _void DisplayMi nute(uchar x)uchar i,j;i=x/10;j=x%10;write_com(0xc4);write_date(0x30+i);write_date(0x30+j); _void DisplayHour(uchar x)uchar i,j;i=x/10;j=x%10;w

20、rite_com(0xc1);write_date(0x30+i);write_date(0x30+j); _void DisplayDay(uchar x)uchar i,j;i=x/10;j=x%10;write_com(0x89);write_date(0x30+i);write_date(0x30+j); _void DisplayM on th(uchar x)uchar i,j;i=x/10;j=x%10;write_com(0x86);write_date(0x30+i);write_date(0x30+j); _显示分/显示小时/显示日期、天显示日期、月uchar i,j;i=

21、x/10;j=x%10;write_com(0x83);write_date(0x30+i);write_date(0x30+j); _void DisplayWeek(uchar x) / 显示星期 uchar i;x=x*3;write_com(0x8c);for(i=0;i4)*10 + (ReadValue&0x0F);ReadValue = ReadSet1302(0x83);/从 DS1302 读取时间秒min ute=(ReadValue&0x70)4)*10 + (ReadValue&0x0F);ReadValue = ReadSet1302(0x85); hour=(Read

22、Value&0x70)4)*10 + (ReadValue&0x0F);ReadValue = ReadSet1302(0x87);day=(ReadValue&0x70)4)*10 + (ReadValue&0x0F);ReadValue = ReadSet1302(0x89);mo nth=(ReadValue&0x70)4)*10 + (ReadValue&0x0F);ReadValue = ReadSet1302(0x8d);year=(ReadValue&0x70)4)*10 + (ReadValue&0x0F);ReadValue=ReadSet1302(0x8b);Display

23、Mi nu te(mi nu te);week=ReadValue&0从 DS1302 读星期x07; DisplaySec on d(sec on/显示秒、分、小时、天、月、年、d); 星期DisplayHour(hour);DisplayDay(day);DisplayMo nth(mo nth);DisplayYear(year);DisplayWeek(week);void turn_val(char n ewval,uchar flag,uchar n ewaddr,uchar s1num) / 刷新时间(将改变的时 间显示至厂LCD上)n ewval=ReadSet1302( ne

24、waddr);/ 读取当前时间n ewval=( newval&0x70)4)*10+( newval&0x0f); 制 / 将 bcd 码转换成十进 if(flag) 判断是加一还是减一 n ewval+;switch(s1 num) case 1: if(n ewval99) n ewval=0; DisplayYear( newval); break; case 2: if(n ewval12) n ewval=1; DisplayMo nth( newval); break; case 3: if(n ewval31) n ewval=1; DisplayDay (n ewval);

25、break; case 4: if(n ewval6) n ewval=0;DisplayWeek (n ewval); break;case 5: if(n ewval23) n ewval=0; DisplayH our(n ewval); break; case 6: if(n ewval59) n ewval=0; DisplayMi nute( newval); break; case 7: if(n ewval59) n ewval=0; DisplaySec ond(n ewval); break; defaultbreak;ielsen ewval-;switch(s1 num

26、) case 1: if(n ewval=0) n ewval=99; DisplayYear( newval); break; case 2: if(n ewval=0) n ewval=12; DisplayMo nth( newval); break; case 3: if(n ewval=0) n ewval=31; DisplayDay (n ewval); break; case 4: if(n ewval0) n ewval=6;DisplayWeek (n ewval);break;case 5: if(n ewval0) n ewval=23;DisplayH our(n e

27、wval);break;case 6: if(n ewval0) n ewval=59; DisplayMi nute( newval);break;case 7: if(n ewval0) n ewval=59; DisplaySec ond(n ewval);break;default:break;WriteSet1302( newaddr-1),( newval/10)0;i-) DQ = 0; /给脉冲信号 dat=1;DQ = 1; /给脉冲信号 if(DQ) dat|=0x80; delay_18B20(10);return(dat);void ds1820wr(uchar wda

28、ta)/ 写数据un sig ned char i=0;for (i=8; i0; i-) DQ = 0;DQ = wdata&0x01;delay_18B20(10);DQ = 1;仅供参考wdata=1; read_temp() 读取温度值并转换uchar a,b;ds1820rst();ds1820wr(0xcc); 跳过读序列号ds1820wr(0x44); 启动温度转换 ds1820rst();ds1820wr(0xcc); 跳过读序列号 ds1820wr(0xbe); 读取温度 a=ds1820rd();b=ds1820rd();tvalue=b;tvalue=8;tvalue=t

29、value|a;if(tvalue0x0fff)tflag=0;I elsetvalue=tvalue+1;tflag=1;tvalue=tvalue*(0.625); 温度值扩大1 0倍,精确到1 位小数 return(tvalue);void ds1820disp() 温度值显示 uchar flagdat;disdata0=tvalue/1000+0x30; 百位数 disdata1=tvalue%1000/100+0x30; 十位数 disdata2=tvalue%100/10+0x30; 个位数 disdata3=tvalue%10+0x30;/ 小数位 if(tflag=0)fla

30、gdat=0x20; 正温度不显示符号elseflagdat=0x2d; 负温度显示负号:-if(disdata0=0x30)disdata0=0x20; 如果百位为 0,不显示 if(disdata1=0x30)disdata1=0x20; 如果百位为0,十位为0也不显示write_com(0xc9);write_date(flagdat); 显示符号位 write_com(0xca);write_date(disdata0); 显示百位 write_com(0xcb);write_date(disdata1); 显示十位 write_com(Oxcc);write_date(disdata2); 显示个位 write_com(Oxcd); write_date(0x2e); 显示小数点 write_com(Oxce); write_date(disdata3); 显示小数位 write_com(0xcf); write_date(C); _void mai n()显示显示ini t();/初始化显示Init_DS1302(); /将 1302 初始化 read_temp(); / 读取温度 ds1820disp(); while(1)read_date();key_sca n();read_temp(); 读取温度 ds1820disp();

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!