版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、作品名称:时间温湿度传感器显示器设计说明书 制作人:TBL 学号: 1219053109指导老师:欧亚军 前言冬天已经来临,每天的温度也开始有所变化,类似长沙这种大城市,温度的巨变实在让人有点不知所措,拥有一个温度显示提醒器是有一定必要的,南方的冬天是比较干燥的,随着人们的生活水平的不断提高,人们对室内的温湿度有了一定的要求,如果能做一个简易的小型的电子产品来提示人们室内的温度和湿度的曲线变化,这样就能方便我们日常的生活起居,于是,我开始设计了这个简易的时间温湿度传感显示仪,他不仅能显示年月日,还能告知我们室内温度以及湿度的变化,方便我们更好的生活。制作前的准备元器件的认知以及原理的简介1.温
2、湿度传感器温湿度传感器是指能将温度量和湿度量转换成容易被测量处理的电信号的设备或装置。 湿敏元件是最简单的湿度传感器。湿敏元件主要有电阻式、电容式两大类。 基本原理湿敏元件是最简单的湿度传感器。湿敏元件主要有电阻式、电容式两大类。湿敏电阻的特点是在基片上覆盖一层用感湿材料制成的膜,当空气中的水蒸气吸附在感湿膜上时,元件的电阻率和电阻值都发生变化,利用这一特性即可测量湿度。湿敏电容一般是用高分子薄膜电容制成的,常用的高分子材料有聚苯乙烯、聚酰亚胺、酪酸醋酸纤维等。当环境湿度发生改变时,湿敏电容的介电常数发生变化,使其电容量也发生变化,其电容变化量与相对湿度成正比。DHT11数字温湿度传
3、感器相关资料以及程序编写事例请点击是一款含有已校准数字信号输出的温湿度复合传感器,它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性和卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。每个DHT11传感器都在极为精确的湿度校验室中进行校准。校准系数以程序的形式存在OTP内存中,传感器内部在检测型号的处理过程中要调用这些校准系数。单线制串行接口,使系统集成变得简易快捷。超小的体积、极低的功耗,使其成为给类应用甚至最为苛刻的应用场合的最佳选择。产品为4针单排引脚封
4、装,连接方便。DHT11数字温湿度传感器接线图引脚说明pin名称注释1VDD供电 35.5VDC2DATA串行数据,单总线3NC空脚,请悬空4GND接地,电源负极C51单片机的介绍·8位CPU·4kbytes程序存储器(ROM) (52为8K)·128bytes的数据存储器(RAM) (52有256bytes的RAM)·32条I/O口线·111条指令,大部分为单字节指令·21个专用寄存器·2个可编程定时/计数器·5个中断源,2个优先级(52有6个)·一个全双工串行通信口·外部数据存储器寻址空间为
5、64kB·外部程序存储器寻址空间为64kB·逻辑操作位寻址功能·双列直插40PinDIP封装·单一+5V电源供电CPU:由运算和控制逻辑组成,同时还包括中断系统和部分外部特殊功能寄存器;RAM:用以存放可以读写的数据,如运算的中间结果、最终结果以及欲显示的数据;ROM:用以存放程序、一些原始数据和表格;I/O口:四个8位并行I/O口,既可用作输入,也可用作输出T/C:两个定时/记数器,既可以工作在定时模式,也可以工作在记数模式;五个中断源的中断控制系统;一个全双工UART(通用异步接收发送器)的串行I/O口,用于实现单片机之间或单片机与微机之间的串行通信
6、;片内振荡器和时钟产生电路,石英晶体和微调电容需要外接。最佳振荡频率为6M12M。1602LCD的介绍一、关于LCD1602:详细理解请点击在编写LCD1602程序前,我们必须了解其手册上一些非常重要的信息,如果这些信息不能理解透彻,编程可能会遇到或多或少的问题,在此先大致归纳几点。1管脚:1602共16个管脚,但是编程用到的主要管脚不过三个,分别为:RS(数据命令选择端),R/W(读写选择端),E(使能信号);以后编程便主要围绕这三个管脚展开进行初始化,写命令,写数据。以下具体阐述这三个管脚:RS为寄存器选择,高电平选择数据寄存器,低电平选择指令寄存器。R/W为读写选择,高电平进行读操作,低
7、电平进行写操作。E端为使能端,后面和时序联系在一起。 除此外,D0D7分别为8位双向数据线。 2操作时序: RSR/W操作说明00写入指令码D0D701读取输出的D0D7状态字10写入数据D0D711从D0D7读取数据注:关于E=H脉冲开始时初始化E为0,然后置E为1,再清0.读取状态字时,注意D7位,D7=1,禁止读写操作;D7=0,允许读写操作;所以对控制器每次进行读写操作前,必须进行读写检测。(即后面的读忙子程序) 3指令集:LCD_1602 初始化指令小结:0x38
8、0; 设置16*2显示,5*7点阵,8位数据接口0x01 清屏0x0F 开显示,显示光标,光标闪烁0x08 只开显示0x0e 开显示,显示光标,光标不闪烁0x0c 开显示,不显示光标0x06 地址加1,当写入数据的时候光标右移0x02 地址计数器AC=0;(此时地址为0x80) 光标归原点,但是DDRAM中断内容不变0x18 光标和显示一起向左移动 4显示地址:LCD1602内部RAM显示缓冲区
9、地址的映射图,000F、404F分别对应LCD1602的上下两行的每一个字符,只要往对应的RAM地址写入要显示字符的ASCII代码,就可以显示出来。 5读写时序:时序图1602手册中有,这里不引用了。时序图很重要,编程就是根据时序图设置寄存器,让LCD工作。 二、LCD1602程序编写流程:LCD1602在了解完以上信息后便可以编写,这里我们把程序分为以下几步:1定义LCD1602管脚,包括RS,R/W,E。这里定义是指这些管脚分别接在单片机哪些I/O口上。现举例如下:sbit EN=P34;sbit RS=P35;sbit RW=P36; 2显示初始化,在这一步
10、进行初始化及设置显示模式等操作,包括以下步骤:设置显示方式 延时 清理显示缓存 设置显示模式通常推荐的初始化过程如下:延时15ms写指令38H延时5ms写指令38H延时5ms写指令38H延时5ms注:以上写38H指令可以看情况省略12步(以上都不检测忙信号)(以下都要检测忙信号)写指令38H写指令08H 关闭显示写指令01H 显示清屏写指令06H 光标移动设置写指令0cH 显示开及光标设置 3设置显示地址(写显示字符的位置)。 4写显示字符的数据。温湿度显示系统原理图软件设计部分简介#include <reg52.h>#includ
11、e <intrins.h>#include "1602.h"#include "ds1302.h"unsigned char str16;unsigned char str26;unsigned char code dis1 = "TRH RH: "unsigned char code dis2 = "TRH T: "sbit TRH = P21;/温湿度传感器DHT11数据接入uchar TH_data,TL_data,RH_data,RL_data,CK_data;uchar TH_temp,TL_
12、temp,RH_temp,RL_temp,CK_temp;uchar com_data,untemp,temp;uchar respond,q=2;/*/*/ 毫秒级延时子程序/*/void delay_ms(unsigned char ms) unsigned char i;while(ms-)for(i = 0; i< 150; i+)_nop_();_nop_();_nop_();_nop_();/*/*/5us级延时程序/*/void delay_us()uchar i;i-;i-;i-;i-;i-;i-; /*/收发信号检测,数据读取/*/char receive() ucha
13、r i;com_data=0;for(i=0;i<=7;i+) respond=2;while(!TRH)&&respond+);delay_us();delay_us();delay_us();if(TRH)temp=1;respond=2;while(TRH)&&respond+); elsetemp=0;com_data<<=1;com_data|=temp; return(com_data); /*/*/湿度读取子程序 /温度高8位= TL_data/温度低8位= TH_data/湿度高8位= RH_data/湿度低8位= RH_dat
14、a/校验 8位 = CK_data/调用的程序有 delay();, Delay_5us();,RECEIVE(); /*/void read_TRH()/主机拉低18ms TRH=0;delay_ms(18);TRH=1;/DATA总线由上拉电阻拉高 主机延时20usdelay_us();delay_us();delay_us();delay_us();/delay_us();/delay_us();delay_us();delay_us();delay_us();/主机设为输入 判断从机响应信号 TRH=1;/判断DHT11是否有低电平响应信号 如不响应则跳出,响应则向下运行 if(!TR
15、H) respond=2; /判断DHT11发出 80us 的低电平响应信号是否结束 while(!TRH)&& respond+);respond=2; /判断从机是否发出 80us 的高电平,如发出则进入数据接收状态while(TRH && respond+); /数据接收状态 RH_temp = receive(); RL_temp = receive(); TH_temp = receive(); TL_temp = receive(); CK_temp = receive();TRH=1; /数据校验 untemp=(RH_temp+RL_temp+T
16、H_temp+TL_temp);if(untemp=CK_temp)RH_data = RH_temp;RL_data = RL_temp;TH_data = TH_temp; TL_data = TL_temp;CK_data = CK_temp;/湿度整数部分str10 = (0X30+RH_data/10); str11 = (0X30+RH_data%10);str12 = '.' /小数点/湿度小数部分str13 = (0X30+RL_data/10); str14 = '%' /"H"str15 = ' ' /&q
17、uot;%"/温度整数部分str20 = (0X30+TH_data/10); str21 = (0X30+TH_data%10);str22 = '.' /小数点/温度小数部分str23 = (0X30+TL_data/10); str24 = 0X27; /"'"str25 = 'C'/0X43; /"C"/ void shijian()/ / unsigned char i,n=0x40,m;/ m=0x00;/ for(i=0;i<17;i+)/ / lcd_dis_pos(m); / lc
18、d_wdata(dis3i);/ m+;/ / m=0x40;/ for(i=0;i<17;i+) / / lcd_dis_pos(m); / lcd_wdata(dis4i);/ m+;/ / void wenshidu()unsigned char i,n=0x40,m;read_TRH(); /写字符for(i=0;i<=7;i+)lcd_dis_pos(i); /显示字符lcd_wdata(dis1i);lcd_dis_pos(n+i); /显示字符lcd_wdata(dis2i); /写湿度数据m=0x08;for(i=0;i<6;i+) lcd_dis_pos(m
19、); lcd_wdata(str1i);m+;/写温度数据m=0x48;for(i=0;i<6;i+) lcd_dis_pos(m); lcd_wdata(str2i);m+;delay_ms(100) ;/延时void keyscan() if(key1=0)delay_ms(5);if(key1=0)q+;lcd_wcmd(0x01); /清除LCD lcd_wcmd(0x08);delay_ms(5);while(!key1);/*/主函数/TH,TL,RH,RL分别代表温湿度的整数和小数部分/*/void main()lcd_init(); delay_us(); while(1
20、)keyscan();if(q%2=0)shijian();if(q%2=1)wenshidu();ifndef _1602_H_#define _1602_H_typedef unsigned char uchar;typedef unsigned int unint;sbit LCD_RS = P27; sbit LCD_RW = P26;sbit LCD_EN = P25;/*/ 毫秒级延时子程序/*/void delay_m(unsigned char ms) unsigned char i;while(ms-)for(i = 0; i< 150; i+)_nop_();_nop
21、_();_nop_();_nop_();/*/void delayNOP()_nop_();_nop_();_nop_();_nop_();/*/ /*/ 测试LCD忙碌状态/lcd_busy()为1时,忙,等待。lcd_busy()为0时,闲,可写指令与数据。/*/bit lcd_busy() bit result;LCD_RS = 0;LCD_RW = 1;LCD_EN = 1;delayNOP();result = (bit)(P0&0x80);LCD_EN = 0;return(result);/*/*/ 写入指令数据到LCD/*/void lcd_wcmd(unsigned
22、char cmd) while(lcd_busy();LCD_RS = 0;LCD_RW = 0;LCD_EN = 0;_nop_();_nop_(); P0 = cmd;delayNOP();LCD_EN = 1;delayNOP();LCD_EN = 0; /*/*/写显示数据到LCD /RS=高电平,RW=低电平,E=高脉冲,D0-D7=数据。 /*/void lcd_wdata(unsigned char dat) while(lcd_busy();LCD_RS = 1;LCD_RW = 0;LCD_EN = 0;P0 = dat;delayNOP();LCD_EN = 1;delay
23、NOP();LCD_EN = 0; /*/*/LCD初始化设定/*/void lcd_init() delay_m(15); lcd_wcmd(0x38); /16*2显示,5*7点阵,8位数据delay_m(5);lcd_wcmd(0x38); delay_m(5);lcd_wcmd(0x38); delay_m(5);lcd_wcmd(0x0c); /显示开,关光标delay_m(5);lcd_wcmd(0x06); /移动光标delay_m(5);/lcd_wcmd(0x01); /清除LCD的显示内容,如果屏幕过暗,可将这俩句删除/delay_ms(5);/*/*/设定LCD显示位置/
24、*/void lcd_dis_pos(unsigned char pos) lcd_wcmd(pos | 0x80); /数据指针=80+地址变量/*/#endif#ifndef _A1602_H#define _A1602_H#define uint unsigned int #define uchar unsigned char#define RS0 P6OUT&=BIT3; #define RS1 P6OUT|=BIT3;#define RW0 P6OUT&=BIT4; #define RW1 P6OUT|=BIT4;#define EN0 P6OUT&=BIT5
25、; #define EN1 P6OUT|=BIT5;void delay(uint z) uint x,y; for(x=z;x>0;x-) for(y=110;y>0;y-);uchar panman() /判忙函数 uchar man; P1DIR&=0x00; /设置P2为输入 RS0; /命令 RW1; /设置为读 _NOP(); EN1; _NOP(); _NOP(); man=P1IN&0x80; /读第7位是否为1,1忙;0不忙; EN0; P1DIR|=0xFF; /设置P2为输出 RW0; return man; void xieling(ucha
26、r ling) /写命令函数 while(panman(); /判忙函数 RW0; RS0; P1OUT=ling; EN1; delay(1); EN0; void xieshu(uchar shu) /写数据函数 while(panman(); /判忙函数 RW0; RS1; P1OUT=shu; EN1; delay(1); EN0; void init1602() P6DIR = 0XFF;/设置为输出 P6OUT = 0XFF;/初始化端口 P1DIR = 0XFF;/设置为输出 P1OUT = 0XFF;/初始化端口 xieling(0x38); delay(1); xieling
27、(0x0c); delay(1); xieling(0x06); delay(1); xieling(0x01); delay(1);#endif#ifndef _1302_H_#define _1302_H_sbit s1=P11; /功能键设定sbit s2=P12; / 增大键设定sbit s3=P13; / 减小键设定sbit key1=P10;sbit RST=P37; /ds1302 设定sbit SCLK=P35;sbit IO=P36;sbit ACC0 = ACC0;sbit ACC7 = ACC7;uchar num8,enter,shi,fen,miao,nian,yue
28、,ri,week,shi1,fen1,flag1=0,flag2=0,flag3,choice;uchar time=" 20XX-XX-XX XXX" /年月日字符数组uchar time1=" xx:xx:xx " /时分秒字符数组void delay(unsigned int z) /1ms延时函数 unsigned int x,y; for(x=z;x>0;x-) for(y=10;y>0;y-); uchar read(uchar x) /读ds1302数据 uchar i; RST=0; SCLK=0; RST=1; ACC=(x
29、|0x01); for(i=8;i>0;i-) IO=ACC0; SCLK=1; SCLK=0; ACC=ACC>>1; for(i=8;i>0;i-) ACC=ACC>>1; ACC7=IO; SCLK=1; SCLK=0; SCLK=1; RST=0; return ACC; void write (uchar addr,uchar dat) /向ds1302写数据 uchar i; RST=0; SCLK=0; RST=1; ACC=addr; for(i=8;i>0;i-) IO=ACC0; SCLK=1; SCLK=0; ACC=ACC>
30、;>1; ACC=dat; for(i=8;i>0;i-) IO=ACC0; SCLK=1; SCLK=0; ACC=ACC>>1; SCLK=1; RST=0; void getnum() /接收ds1302的数据 uchar j; for(j=0;j<7;j+) numj=read(0x80+0x02*j); time3=(num6&0x70)>>4)+'0'/年 time4=(num6&0x0f)+'0' nian=(num6&0x70)>>4)*10+(num6&0x0
31、f); time6=(num4&0x70)>>4)+'0'/yue time7=(num4&0x0f)+'0' yue=(num4&0x70)>>4)*10+(num4&0x0f); time9=(num3&0x70)>>4)+'0'/ri time10=(num3&0x0f)+'0' ri=(num3&0x70)>>4)*10+(num3&0x0f); time14=(num5&0x0f)+'0'
32、;/week week=(num5&0x0f); switch(time14) /星期字符数组赋值 case '1': time13='S' time14='u' time15='n' break; case '2': time13='M' time14='o' time15='n' break; case '3': time13='T' time14='u' time15='e' break;
33、case '4': time13='W' time14='e' time15='d' break; case '5': time13='T' time14='h' time15='u' break; case '6': time13='F' time14='r' time15='i' break; case '7': time13='S' time14='a'
34、; time15='t' break; time14=(num2&0x70)>>4)+'0' /shi time15=(num2&0x0f)+'0' shi=(num2&0x70)>>4)*10+(num2&0x0f); time17=(num1&0x70)>>4)+'0' /fen time18=(num1&0x0f)+'0' fen=(num1&0x70)>>4)*10+(num1&0x0f); ti
35、me110=(num0&0x70)>>4)+'0' /miao time111=(num0&0x0f)+'0' miao=(num0&0x70)>>4)*10+(num0&0x0f); void display() /显示数据 uchar i; lcd_wcmd(0x0c); /显示方式设定为:无光标,且不闪烁 if(flag1=0) /flag为0时正常显示年、月、日、时、分、秒等 lcd_wcmd(0x80); for(i=0;timei!='0'i+) lcd_wdata(timei)
36、; lcd_wcmd(0xc0); for(i=0;time1i!='0'i+) lcd_wdata(time1i); void keyscan1() / 扫描键盘 getnum(); if(s1=0) /功能键被按下 lcd_wdata(0x0c); delay(10); if(s1=0) enter+; /记录摁下次数 if(flag1=1&&enter=6) enter=2; if(flag1=0&&enter=9) enter=0;while(s1=0); /按键放下时响一下 switch(enter) case 0: lcd_wcmd(
37、0x0c); break; case 1: lcd_wcmd(0xcb); lcd_wcmd(0x0f); delay(2000); /按秒 时 有光标 break; case 2: lcd_wcmd(0xc8); lcd_wcmd(0x0f); delay(2000); /分 break; case 3: lcd_wcmd(0xc5); lcd_wcmd(0x0f); delay(2000); /时 break; case 4: if(flag1=0) lcd_wcmd(0x8D); lcd_wcmd(0x0f); delay(1000); /星期 if(flag1=1) lcd_wcmd(
38、0xc4); lcd_wcmd(0x0f); delay(2000); /NO、OK选项闪烁 break; case 5: if(flag1=0) lcd_wcmd(0x8a); lcd_wcmd(0x0f); delay(2000); /日闪烁 if(flag1=1) lcd_wcmd(0xc1); lcd_wcmd(0x0f); delay(2000); /时钟标志闪烁 break; case 6: lcd_wcmd(0x87); lcd_wcmd(0x0f); delay(2000); /月 break; case 7: lcd_wcmd(0x84); lcd_wcmd(0x0f); d
39、elay(2000); /年 break; if(enter!=0&&s2=0) delay(10); if(enter!=0&&s2=0) switch(enter) case 1: miao+; if(miao=60) miao=0; write(0x80,(miao/10*0x10+miao%10); /秒 break; case 2: if(flag1=0) fen+; if(fen=60) fen=0; write(0x82,(fen/10)*0x10+fen%10); /分 if(flag1=1) fen1+; if(fen1=60) fen1=0; break; case 3: if(flag1=0) shi+; if(shi=24) shi=0; write(0x84,(shi/10*0x10+shi%10); /时 if(flag1=1) shi1+; if(shi1=24) shi1=0; break; case 4: if(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 畜牧业设备采购核准表
- 航空会员账户管理办法
- 2025年度水利工程项目承包合伙合同3篇
- 科技园区房产交易合同
- 建筑工程项目担保细则
- 医疗设备招议标管理办法
- 国际石油勘探招投标详解
- 翻译服务业机构装饰施工合同
- 长途客运司机招聘合同样本
- 智能化煤矿配件管理未来趋势
- 女病人导尿术操作考核评分标准
- 人教版数学上册四年级期末试卷
- 智慧水务系统市场分析及行业前景展望报告
- 小学副校长教学工作总结
- 贵州省情知识考试总题库(含答案)
- 双方之间的合同约束
- 护理组长述职演讲
- 地球科学概论(长安大学)智慧树知到期末考试答案2024年
- 期末(试题)-2023-2024学年剑桥少儿英语一级上册
- 人教版三年级数学下册除数是一位数的除法竖式计算500道题
- 2022-2023学年北京市海淀区高一(上)期末地理试卷
评论
0/150
提交评论