基于DHT11的温湿度检测报告_第1页
基于DHT11的温湿度检测报告_第2页
基于DHT11的温湿度检测报告_第3页
基于DHT11的温湿度检测报告_第4页
基于DHT11的温湿度检测报告_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

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

文档简介

1、精选优质文档-倾情为你奉上目录引言由于对生态环境的破坏,导致近几年气候极其不稳定。有时昨天还短衣短裤,过着夏天的生活,一觉醒来,一朝回到寒冷冬季。由于没注意到温、湿度的变化,及时添衣补水,导致感冒频发,所以对温湿度的检测及控制就非常有必要了。51系列单片机由于价格低廉,便于控制,时常用于小型程序的控制。本文便采用AT89C52来进行对DHT11采集到的信号进行分析、控制,使其能实时采集当前温度、湿度,并可通过对应来按键来进行温湿度上下限的设置,若当前温度超过设定的上下限时,产生报警、提醒。将采集信号置于室外,可提醒人们出门需添衣补水;将采集信号置于大棚种植中,可提醒农夫对大棚进行调温、对农作物

2、进行补水,防止农作物死亡。一、设计目的1、掌握AT89C52的控制2、掌握DHT11的控制原理3、掌握数码管的动态扫描4、掌握按键的输入二、设计要求1、温、湿度实时检测及显示:通过4位数码管实时显示传感器DHT11检测到的温度和湿度,并可通过固定时间切换显示温度和湿度。2、温、湿度上下限设置按钮:分配按键,通过对应的按键,可实现对温度上、下限的设置;湿度上、下限的控制。3、自动报警:当温度或湿度超过其上、下限时,蜂鸣器会通过不同的报警对象来产生不同的报警方式。三、DHT11介绍1、基本参数型号测量范围测湿精度测温精度封装建议扫描周期DHT112090%RH050±5%RH±

3、24针单排直插>=1s图一:DHT11实物图图二:DHT11封装尺寸图2、引脚说明正面从左向右数第一根引脚第二根引脚第三根引脚第四根引脚VDD供电35.5VDC串行数据单总线空脚,请悬空GND接地,电源负极3、工作原理3.1数据传输格式单片机发送一次开始信号后,DHT11从低功耗模式转换到高速模式,等待单片机开始信号结束后,DHT11发送40bit的数据,高位先出。数据格式:8bit湿度整数数据+8bit湿度小数数据+8bit温度整数数据+8bit温度小数数据+8bit校验和数据传输正确时,校验和数据等于“8bit湿度整数数据+8bit湿度小数数据+8bit温度整数数据+8bit温度小数

4、数据”所得结果的末八位如果没有接收到单片机发送的开始信号,DHT11不会主动进行温湿度采集,转换到低功耗模式。图三:DHT11工作时序图3.2 采集开始方式DHT11空闲时为高电平,单片机把总线拉低等待DHT11响应,拉低时间需大于18ms,保证DHT11能检测到起始信号。DHT11接收到主机的开始信号后,等待单片机开始信号结束,然后发送80us低电平响应信号。单片机发送开始信号结束后,延时等待2040us后,读取DHT11的响应信号,可以切换到输入模式,或者输出高电平均可,总线由上拉电阻拉高。图四:DHT11启动时序图3.3DHT11信号发送方式图五:“0”信号表示时序图图六:“1”信号表示

5、时序图如果总线为低电平,说明DHT11发送响应信号,DHT11发送响应信号后,会再把总线拉高80us,开始准备数据,每一bit数据都以50us低电平开始,通过判断高电平的时间,来决定采集到的数是“0”还是“1”;当高电平时间为26us28us时,则采集到的数为“0”,如图四所示;当高电平时间大于28us时,则采集到的数 “1”,如图五所示。当最后1bit数据传输完毕后,DHT11拉低总线50us,随后由上拉电阻拉高进入空闲状态。如果总线为高电平,说明DHT11没有响应,有可能是线路没插好。四、方案说明及相关功能电路接线图控制中心AT89C52采集装置DHT11输入装置按键显示装置数码管报警装置

6、蜂鸣器4.1整体框架图4.2控制中心AT89C52单片机图七:AT89C52单片机的最小系统电路图该系统的控制中心,是由一片AT89C52单片机来控制、分析。该款单片机的最小系统由复位电路、晶振电路,IO口电路,完成其它功能的元器件均接在该片单片机的IO口上,由该单片机控制。4.3 采集装置DHT11传感器DHT11信号端接单片机的P2.1口,外加上拉电阻。DHT11与单片机之间的数据传输都是从该P2.1口上传输。电路接法如图八所示。4.4 输入装置按键图八:DHT11接线图按键由一个光电开关和4个普通按键组成。用户可根据固定的按键来设置温湿度报警的上限线,电路解法如图九所示。各个按键的作用如

7、下:P3.3口的光电开关:用于切换进入设置界面 还是显示界面P3.4口的普通按键:当前设定对象值减一P3.5口的普通按键:当前设定对象值加一P3.6口的普通按键:切换设置对象的上、下限P3.7口的普通按键:切换设置对象(温湿度) 图九:按键接线图 4.5 显示装置数码管显示部分由四位数码管构成的,用户可根据数码管的显示,看到的温、湿度,以及其当前设置的上、下限。接线图如图十所示。每位数码管的功能如下:首位:当首位灭时,为显示状态;亮时为设置状态 当显示“”时,表示设置当前对象的上限当显示为“”时,表示设置当前对象的下限末尾:用于判别对象:当显示“E”时,则表示 湿度 当显示“C“时,则表示 温

8、度中间两位数:用于显示数值图十:数码管接线图4.6 报警装置蜂鸣器当温湿度的其中一项超过其设定的上下限,蜂鸣器就会产生报警,用户可根据不同的报警方式,判断是温度超过界限,还是湿度超过界限。温度报警:急促的响声湿度报警:缓慢的响声二则同时报警:响停时间一样图十一:蜂鸣器接线图五、主要程序流程图等待响应信号结束把读到的40bit的数,分别放在对应的位置,出来的顺序依次是 湿度整数、湿度小数、温度整数、温度小数、校验码DHT11拉低约50us再拉高,使其进入空闲状态计算四个数据的校验码计算的校验码与读到的是否相等数据正确,把读到的数据,存在对应的位置返回NYDHT11采集程序DHT11先拉低20ms

9、再拉高2040us将DHT11拉高设为输入模式判断有无响应NY主程序中断初始化开启总中断开启定时器中断调用DHT11采集程序调用按键操作程序判断是否采集信号判断显示温度还是湿度调用DHT11采集程序温湿度标志位切换YNNY中断程序各类定时次数加一显示时间到调用数码管显示程序定时次数清零YN返回是否该响蜂鸣器停蜂鸣器响返回YN报警处理程序温、湿度同时报警周期适中温度报警湿度报警周期长周期短YYNN响期清零周期清零Y计数>周期?计数清零YNYN按键操作程序判断是否进入设置界面NY温湿度切换按钮按下上下限切换按钮按下N切换温湿度切换上下限加一按钮按下判断出现在的操作对象、上下限,把该位加一减一

10、按钮按下判断出现在的操作对象、上下限,把该位减一返回NNYYYN首位符号出现显示湿度最大值末位符号出现数码管显示判断程序显示界面?数码管首位灭调用报警判断显示温度?温度整数显示末尾标志出现湿度整数显示末尾标志出现湿度最小值?温度最小值?湿度最大值?首位符号出现显示湿度最小值末位符号出现首位符号出现显示温度最小值末位符号出现首位符号出现显示温度最大值末位符号出现返回YYYYYNNNNN六、调试结果:6.1总体显示:开机上电后,数码管能正常显示当前温度、湿度,并且每隔一段时间会温湿度自动切换。6.2按键调试:1、进入设置界面(光电开关P3.3),后,数码管会自动显示成当前对应对象所设的对应值,再按

11、一次,则又退出设置界面。例如:数码管显示“40C”,则表示当前设置的温度上限为40;显示“50E”则表示当前湿度下限设置值为50%。2、进入设置界面后(光电开关P3.3),按温湿度切换按钮(普通按键P3.7),数码管会自动切换对应对象,并且出现前对应对象所设的对应值。例如:数码管本来显示“50E”,按下按钮后,变成“20C”,则表示数码管本来显示的是湿度下限设置为50%,按下按钮后,则数码管变成显示温度下限当前设置值位20。3、进入设置界面后(光电开关P3.3),按上下限切换按钮(普通按键P3.6),数码管会自动切换显示当前对象所设的对应值。例如:数码管本来显示“40C”,按下该按钮后,数码管

12、会变成“20C”,则表示数码管本来显示的是温度上限为40,按下该按钮后,则数码管会变成显示温度下限当前设置值位20。4、进入设置界面后(光电开关P3.3),按加一按钮(普通按键P3.5),会把当前对象的设置值加一,数码管显示的值也会对应加一。例如:数码管本来显示“20C”,按下该按钮后,数码管显示“21C”。即表示本来当前的温度下限设置值为20,按下该按钮后,温度下限的设置值变为21。5、进入设置界面后(光电开关P3.3),按减一按钮(普通按键P3.4),会把当前对象的设置值减一,数码管显示的值也会对应减一。例如:数码管本来显示“50E”,按下该按钮后,数码管显示“49E”。即表示湿度下限本来

13、设置值为50%,按下该按钮后,湿度下限设置值变49%。6、没有进入设置界面,按其它四个按键无反应。6.3报警调试1、将温度的报警下限调到超过当前温度或者报警上限调低于当前温度时,蜂鸣器会发出急促的报警声。2、将湿度的报警下限调到超过当前湿度或者报警上限调低于当前湿度时,蜂鸣器会发出缓慢的报警声。3、当温湿度同时都报警时,蜂鸣器会发出响停一致的报警声。4、当正处于报警时,进入设置界面,报警声会停止,用户可重新设置上下限,让报警取消,以免扰民。七、调试过程遇到的问题7.1问题:单片机始终未接收到DHT11的信号。现象:运行程序后,数码管始终显示00。分析:硬件原因,1、DHT11坏了,信号未采集,

14、导致单片机无信号。 软件原因,1、采集步骤出错,未理解透DHT11采集原理,导致信号未采集。 2、显示程序错误,未正确赋值显示,以至于DHT11已采集到信号,但未能正确显示,以至于误以为是DHT11未采集信号。问题解决:硬件问题排除,买了几个全新的DHT11,分别接上单片机,发现全都不能使用,所以初步排除了硬件原因。软件原因,最有可能的就是未能正确理解DHT11采集过程,所以特地跟组员规定,先不探讨,各自去看DHT11采集原理,之后再探讨各自认为DHT11如何采集,然后再按各自的理解,一个一个实验,看那个能采集到信号,确定出DHT11正确的采集过程。7.2问题:数码管动态扫描不稳定。现象:本来

15、在主程序调用数码管显示程序,使4位数码管逐个给值、显示,4位数码管都能正常稳定的显示,但经过一次数据采集之后,数码管会有一段时间的晃动,甚至全灭,之后再变稳定。分析:未采集信号前,数码管能正常显示,遇到采集信号时,数码管不能正常显示,推测是DHT11采集时耗时太久,所以数码管更新显示时间边长,所以数码管动态扫描不稳定。问题解决:采用定时器中断,每隔一段时间,中断发生时,扫描数码管的一位,下次扫描时,自动切换到扫描数码管下一位。这样能保证数码管稳定显示。但用中断时,DHT11采集前时,需把中断关掉,防止采集过程中,信号丢失。7.3问题:数码管显示位数太少,要显示的东西太多。现象:数码管只有四位,

16、不仅要显示温度、湿度,还要显示湿度与温度各自的最大值与最小值,数据较多。分析:由于没有标志,不知道当前显示的是什么数,显示是否正确。问题解决:经小组统一决定将四位数码管的中间两位来显示数值,首尾两个数码管用来确定当前显示的是什么数。具体的格式如前面数码管的介绍中所说。在程序中,建立了4个变量,来给数码管显示判断,各个变量各种状态效果如下所述:变量名“0”状态“1”状态bianliang显示界面设置界面bianliang1设置湿度设置温度bianliang2最小值最大值bianliang3显示当前湿度显示当前温度例如:bianliang和bianliang3都为“0”,则数码管显示当前湿度 bi

17、anliang=1并且bianliang1和bianliang2都为0,则数码管显示的湿度的最小值。PS:只有进入设置界面,才能看到温湿度所设置的最大值和最小值。7.4问题:报警太单一,无法区分是湿度报警,还是温度报警。现象:报警时,蜂鸣器产生长鸣,想把上下限调到合适的位置,让报警取消以免扰民,却不知道要跳那个界限。分析:报警只有单一的长鸣,不能辨别解决方案:将报警方式分为,温度报警、湿度报警、两则同时报警三种情况。通过判断响停时间长短来判断报警形式,具体报警形式如前面蜂鸣器中所说。若停止报警,只需进入设置界面,将改报警对象的上下限合适调整即可。八、实验总结经过了这两周的实训,使我收获颇多。首

18、先,使我懂得了DHT11传感器的工作原理,理解其工作时序图。DHT1内部有测温元件和测湿元件,当单片机发送采集信号给DHT11后,DHT11会将采集到的温度、湿度转换成40bit的数据给单片机。其次,让我懂得用定时器中断来实现数码管的动态显示。数码管显示的程序本来是放在主程序里,当扫描到数码管程序时才能显示,最后发现要是主程序程序太多的话,数码管显示出来的数字就会不稳定。经过研究后,发现可以用定时器中断,让每隔一段时间,中断产生时,扫描数码管的其中一位。这样就可以让数码管稳定显示了。最后,使我深刻的意识到了自己在汇编上的不足。该程序本来是打算用汇编语言写的,由于事先没有安排好变量的存储地址,后

19、来一写才发现自己被汇编语言的跳转指令,跳得自己都晕了。不像C语言那样,会自动分配变量的存储地址。两周时间,说长也不算长,却让我对控制有了兴趣。当自己所写的程序,如自己所想的那般执行时,那种喜悦是不可言语的。实训虽结束了,但激情还在。之后还应以这次的经历,多多研究控制其它元器件。九、程序清单/*实验目标*采用DHT11实现温湿度的采集,并在4位数码管上显示通过对应的按键,可实现设置温湿度的上下限当温湿度超过上下限时,会产生报警*/*定义区*地址、变量定义*/#include<at89x52.h>/头文件#define uint unsigned int#define uchar un

20、signed charsfr smg=0x80; /数码管显示值,当前定义为P0口sfr esmg=0xa0;/数码管位选地址,当前定义为P2口sbit dht11=0xa1;/DHT11信号端,当前定义为P2_1sbit moshi=0xb7;/设置温度湿度切换按钮,当前定义为P3_7sbit qiehuan=0xb6;/切换上限下限切换按钮,当前定义为P3_6sbit add=0xb5; /设置值加1按钮,当前定义为P3_5sbit sub=0xb4; /设置值减一按钮,当前定义为P3_4sbit shezhi=0xb3; /设置界面显示界面切换按钮sbit fengming=0x93;/

21、蜂鸣器地址,当前定义为P1_3bit bianliang=0; /设置与显示的标志位bit bianliang1=0; /设置温度与湿度的标志位bit bianliang2=0; /设置最大值与最小值的标志位bit bianliang3=1; /显示温度与湿度测定值标志位bit baojing1=0; /温度报警标志位bit baojing2=0; /湿度报警标志位uint bj,bj1,bj2; /报警蜂鸣器低电平时间*50us,周期时间*50usuint xs; /四位数码管中间两位显示的值uint ds,cj,qh;/ 定时次数变量,ds:用于数码管显示频率 cj:用于温湿度采集频率 q

22、h,温湿度显示切换频率uchar max_R=80,min_R=20,max_T=50,min_T=10; /用于设置湿度上限、下限;温度上限、下限uchar shou=0xff,mo=0xff; /数码管首位和末位显示uchar byte,RH,RL,TH,TL; /采集到的 字节、湿度整数、湿度小数;温度整数,温度小数int a=0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90; /数码管字段码/*延时程序区*/void Delay20ms()/11.0592MHzunsigned char i, j;i = 36;j = 217;dowh

23、ile (-j); while (-i);void Delay8ms()/11.0592MHzunsigned char i, j;i = 15;j = 84;dowhile (-j); while (-i);void Delay28us()/11.0592MHzunsigned char i;i = 10;while (-i);/*定时中断设置区*/void Timer0Init(void)/50微秒11.0592MHzTMOD &= 0xF0;/设置定时器模式TMOD |= 0x02;/设置定时器模式TL0 = 0xD2;/设置定时初值TH0 = 0xD2;/设置定时重载值TF0

24、= 0;/清除TF0标志TR0 = 1;/定时器0开始计时/*数码管显示区*/void xianshi (int num) int i; switch (i) case 0:esmg=0xf0|esmg;smg=shou;esmg=0xef&esmg;i+;break; case 1:esmg=0xf0|esmg;smg=anum%100/10;esmg=0xdf&esmg;i+;break; case 2:esmg=0xf0|esmg;smg=anum%10/1;esmg=0xbf&esmg;i+;break; case 3:esmg=0xf0|esmg;smg=mo

25、;esmg=0x7f&esmg;i+;break; default:i=0;break; /*报警处理区*/void baojing() if(TH>=max_T|TH<=min_T)baojing1=1;/温度超极限,温度报警标志位置一 else baojing1=0;/否则,温度报警标志位清零 if(RH>=max_R|RH<=min_R)baojing2=1;/湿度超极限,湿度报警标志位置一 else baojing2=0;/否则,湿度报警标志位清零 void baojingchuli() if(baojing1=1&&baojing2=1

26、) /温湿度同时报警 bj1=5000; /响时间 bj2=10000; /周期 else /都无报警 /温湿度都无报警 bj1=0;/响时间 bj2=0;/周期 if(baojing1) /只有温度报警 bj1=1000;/响时间 bj2=5000;/周期 if(baojing2) /只有湿度报警 bj1=9000;/响时间 bj2=30000;/周期 /如果 计数<bj1,响;bj1<计数<bj2,停;计数>bj2,计数清零 if(bj<bj1)fengming=0; else if(bj<bj2) fengming=1; else bj=0;/*数码管

27、显示判断区*/void panduan() if(!bianliang) /进入显示界面 shou=0xff;/数码管首位灭 baojing(); /判断是否报警 if(!bianliang3) /显示界面,显示湿度 xs=RH; /当前湿度给数码管显示 mo=0x86;/数码管末尾出现“E" else /显示界面,显示温度 xs=TH;/当前温度给数码管显示 mo=0xC6; /数码管末尾出现"C" else /设置界面 if(bianliang1=0&&bianliang2=0) / 设置 湿度最小值 shou=0xC8; /数码管首位出现 最

28、小值符号mo=0x86; /数码管末尾出现 湿度符号xs=min_R;/把当前的湿度最小值给数码管显示 else if(bianliang1=1&&bianliang2=0) /设置 温度最小值 shou=0xC8;/数码管首位出现 最小值符号 mo=0xc6; /数码管末尾出现 温度符号 xs=min_T;/把当前的温度最小值给数码管显示 else if(bianliang1=0&&bianliang2=1) /设置 湿度最大值 shou=0xc1;/数码管首位出现 最大值符号 mo=0x86; /数码管末尾出现 湿度符号xs=max_R; /把当前的湿度最大

29、值给数码管显示 else /设置温度最大值 shou=0xC1;/数码管首位出现 最大值符号 mo=0xC6; /数码管末尾出现温度符号 xs=max_T; /把当前的温度最大值给数码显示 /*中断程序*/ void zhongduan() interrupt 1 ds+ ;cj+;bj+;if(ds>=10)/判断是否该显示数码管,改变数字,可改频率 panduan(); xianshi(xs);ds=0; /*DHT11采集区*/*DHT11启动程序*void qidong() dht11=0; /DHT11拉低电平 Delay20ms();/延时20ms,等待响应,需大于18ms

30、dht11=1;/拉高电平 Delay28us();/延时28us,延时范围:20us40us /*读取DHT11一个字节的数*uchar duqu() uchar i,temp; for(i=0;i<8;i+)/接收8bit的数据 while(!dht11); /等待50us低电平开始信号结束 Delay28us(); /高电平时间为28us temp=0; /则读到的数据为“0” if(dht11)temp=1;/28us后仍为高电平,则读到的数据为“1” while(dht11);/等待高电平信号结束 byte<<=1;/数据高位先输出,所以需右移 byte|=temp

31、;/读到的数串在一起 return byte; /返回读到的一个字节的数 /*采集信号*void jieshou() uchar T_H,T_L,R_H,R_L,check,check1; qidong();/DHT11启动子程序 dht11=1; /主机设为输入模式 if(!dht11) /判断DHT11有无低电平响应 while(!dht11);/等待DHT11,低电平显示是否结束while(dht11);/等待DHT11,高电平显示是否结束R_H=duqu();/ 湿度整数位R_L=duqu(); /湿度小数位T_H=duqu();/温度整数位T_L=duqu();/温度小数位check

32、=duqu();/校验位dht11=0; /读取完毕,DHT11拉低电平Delay28us(); /需延时约50usDelay28us();dht11=1; /DHT11拉高,进入空闲状态check1=R_H+R_L+T_H+T_L;/计算读到的四个数据的校验码if(check1=check) /判断计算结果与读到的结果是否一样 /结果一致时,把对应的数,存在对应的位置 RH=R_H; RL=R_L; TH=T_H; TL=T_L; check=check1; /*按键处理程序*/void anjian(void) if( shezhi=0) /判断是显示状态,还是设置状态 Delay8ms(

33、); while(shezhi=0) ; Delay8ms(); bianliang=bianliang; if(bianliang)/如果是设置状态 if(!moshi)/判断温湿度切换按钮是否按下 Delay8ms(); while(!moshi); Delay8ms(); bianliang1=bianliang1; if(!qiehuan)/判断上下限切换按钮是否按下 Delay8ms(); while(!qiehuan) ; Delay8ms(); bianliang2=bianliang2; if(!add)/判断值加一按钮是否按下 Delay8ms(); while(!add); Delay8ms(); /以下为判断设置的对象 if(bianliang1=0&&bianliang2=0) min_R+; else if(bianliang1=1&&bianliang2=0) min_T+;

温馨提示

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

评论

0/150

提交评论