数字温湿度传感器DHT11详解及例程利用串口显示

合集下载

数字温湿度传感器DHT11详解及例程利用串口显示

数字温湿度传感器DHT11详解及例程利用串口显示

数字温湿度传感器DHT111、概述DHTxx 系列数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。

它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。

传感器包括一个电阻式测湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。

因此,该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。

每个DHTxx传感器都在极为精确的湿度校验室中进行校准。

校准系数以程序的形式储存在OTP内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。

单线制串行输出接口,使系统集成变得简易快捷。

超小的体积、极低的功耗,使其成为各类应用甚至最为苛刻的应用场合的最佳选则。

本产品为 4 针单排引脚封装,特殊封装形式可根据用户需求而提供。

2、产品特性湿温度传感器的一体化结构能相对的同时对相对湿度和温度进行测量。

数字信号输出,从而减少用户信号的预处理负担。

单总线结构输出有效的节省用户控制器的I/O口资源。

并且,不需要额外电器元件。

独特的单总数据传输线协议使得读取传感器的数据更加便捷。

全部校准。

编码方式为8位二进制数。

40bit 二进制数据输出。

其中湿度整数部分占1Byte,小数部分1Byte;温度整数部分1Byte,小数部分1Byte。

其中,湿度为高16位。

最后1Byte为校验和。

卓越的长期稳定性,超低功耗。

4引脚安装,超小尺寸。

各型号管脚完全可以互换。

测量湿度范围从20%RH到90%RH;测量温度范围从0℃到50℃。

适用范围包括恒湿控制,消费家电类产品,温湿度计等领域。

3、外型与引脚排列引脚说明:Vcc 正电源Dout 输出NC 空脚GND 地- 1 -图3.0 DHT外型及管脚4、详细引脚说明:传感器管脚方向识别:正面(有通气孔的一面)看过去,从左到右依次为1、2、3、4脚。

电源引脚,DHTxx的供电电压为 3.5~5.5V。

传感器上电后,要等待1s 以越过不稳定状态在此期间不要发送任何指令。

dht11使用手册

dht11使用手册

dht11使用手册DHT11是一款常用的温湿度传感器,它能够测量并监测环境中的温度和湿度。

以下是关于DHT11的使用手册,希望能够帮助您更好地使用这款传感器。

一、简介DHT11是一款由AM2301温湿度传感器和数字模块构成的测温湿度模块。

它采用单总线通信方式,能够同时测量环境中的温度和湿度,具有测量精度高、稳定性好等优点。

DHT11的使用非常方便,只需将其连接到单片机的某个I/O口即可。

二、使用步骤1.硬件连接将DHT11的VCC引脚连接到单片机或开发板的+5V电源,GND引脚连接到地线,OUT引脚连接到单片机的I/O口(推荐使用GPIO)。

2.初始化在开始数据读取之前,需要先对DHT11进行初始化。

将I/O 口初始化为输出模式,然后输出低电平(0)至少18ms,再输出高电平(1)并保持60-400us。

此时DHT11会响应并开始工作。

3.数据读取初始化完成后,DHT11会自动开始测量环境中的温度和湿度。

等待40ms后,DHT11会自动将测量到的数据通过I/O口发送给单片机或开发板。

单片机或开发板可以通过读取I/O口的状态来获取数据。

4.数据解析从DHT11读取的数据是一个8位的湿度数据和一个8位的温度数据,需要对其进行解析才能得到实际的湿度和温度值。

根据DHT11的通信协议,我们可以使用以下公式来计算湿度和温度值:湿度值= (湿度数据×10) % 100 温度值= (温度数据/10) + 25三、注意事项在使用DHT11时,需要注意以下几点:1.DHT11的VCC引脚电压应保持在4.5-5.5V之间。

2.在读取数据时,需要等待一定的时间以保证数据传输的稳定。

通常情况下,建议等待大约80-200ms。

3.如果连续读取几次数据都失败,可能需要重新初始化DHT11。

4.在连接DHT11时,需要保证OUT引脚处于低电平状态。

如果OUT引脚处于高电平状态,可能会导致DHT11无法正常工作。

5.DHT11的工作环境温度应保持在0-50℃之间,如果环境温度过高或过低,可能会导致测量值不准确。

dht11使用手册

dht11使用手册

dht11使用手册摘要:1.DHT11 传感器简介2.DHT11 传感器的应用领域3.DHT11 传感器的工作原理4.DHT11 传感器的接线方式与注意事项5.DHT11 传感器的数据解析与处理6.DHT11 传感器的优缺点分析7.DHT11 传感器的使用与维护正文:DHT11 传感器是一款由我国生产的温湿度传感器,广泛应用于智能家居、农业、工业生产、医疗保健等多个领域。

它具有准确测量温湿度、响应速度快、抗干扰能力强等特点,可以满足各种环境监测需求。

一、DHT11 传感器简介DHT11 传感器是基于湿敏电阻原理,采用单片机技术设计而成的一款温湿度传感器。

它的主要功能是测量环境中的温度和湿度,并将测量结果通过数字信号输出。

DHT11 传感器具有体积小巧、安装简便、成本低廉等优点,可以方便地集成到各种智能设备中。

二、DHT11 传感器的应用领域DHT11 传感器广泛应用于以下领域:1.智能家居:用于监控室内温湿度,调节空调、加湿器等设备的工作状态;2.农业:用于监测温室、大棚等农业生产环境的温湿度,指导农业生产;3.工业生产:用于监测生产线、仓库等工业环境的温湿度,保证产品质量;4.医疗保健:用于监测医院病房、手术室等医疗环境的温湿度,为患者创造舒适的治疗环境。

三、DHT11 传感器的工作原理DHT11 传感器的工作原理主要是基于湿敏电阻。

传感器内部有一对热敏电阻和湿敏电阻,分别用于测量温度和湿度。

当环境中的温湿度发生变化时,热敏电阻和湿敏电阻的电阻值也会随之改变。

传感器内部单片机通过测量这两个电阻值的变化,计算出当前环境的温度和湿度。

四、DHT11 传感器的接线方式与注意事项DHT11 传感器的接线方式分为三线制和两线制。

三线制接线方式为:VCC(电源正极)、GND(电源负极)和DAT(数据输出)。

两线制接线方式为:VCC(电源正极)和DAT(数据输出)。

在接线时,需要注意以下几点:1.接线时,请确保电源电压与传感器的工作电压相匹配;2.接线时,请使用屏蔽线,以减小外部干扰;3.接线时,请保持接线牢固可靠,避免松动。

温湿度传感器DHT11C程序详解

温湿度传感器DHT11C程序详解

#include<at89x52.h>#include<intrins.h>//加上这句下面的_nop_();就能用bit xianshiqiehuan;sbit dht11_dat=P1^6;unsigned char c,count, dht11temp,dht11dat;unsigned char dht11value[5];unsigned int x,y,z;unsigned char code dat[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,};delay(){unsigned char a;for(a=200;a>0;a--);}display(unsigned char x){P0=dat[(x%100)/10];//十位P1_2=0;delay();P1_2=1;P0=dat[(x%100)%10];//个位P1_3=0;delay();P1_3=1;}delay_1s(){unsigned int i=50000;while(i--);}delay_10us() //10us{_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}void delayms(unsigned char x) //1ms单位延时程序{unsigned char j;while(x--){for(j=0;j<123;j++){;}}}read_dht11(){ unsigned char i;dht11_dat=1; _nop_(); //起始dht11_dat=0;//拉低总线delayms(18);//手册要求大于18msdht11_dat=1;//拉高总线等待dht11回应while(dht11_dat); // 等待dht11回应若有回应dht11_dat=0;往下执行while(!dht11_dat);//回应后dht11将总线拉低80us,过后又将总线拉高,进入下一步while(dht11_dat); //拉高80us 又变低,往下执行进入50us延时for(i=0;i<24;i++){while(!dht11_dat);//50us过后...... dht11_dat=1;往下执行delay_10us();delay_10us();delay_10us();//延时30us,查看总线是高是低,dht11temp=0; //先默认为0处理if(dht11_dat) dht11temp=1; //1处理dht11dat=dht11dat<<1; //必须先移动再或若先或再移本次数据就移动了dht11dat=dht11dat|dht11temp;dht11value[i/8]=dht11dat;while(dht11_dat);//如果处理的是1,30us过后总线还是1,那就在此等待总线变为0进入下一个50us低电平,不然会重复进行0处理}}main(){delay_1s(); //要求上电等1秒,让dht11稳定EA=1;//开放中断TMOD=0x01;//设T0 为16位计数方式ET0=1;//定时0中断允许TR0=1;//开启TR0while(1){if(!xianshiqiehuan) //显示温度display(dht11value[2]) ;else{display(dht11value[0]) ; //显示湿度P0=0x92&0x7f; //千位显S 代表湿度P1_0=0;delay();P1_0=1;}}}dingshi() interrupt 1 //定时器0服务程序{TH0=0;TL0=0;count++;if(count==55){count=0;read_dht11();xianshiqiehuan=~xianshiqiehuan; } //在切换显示时采集,以防中断采样带来的显示闪烁}。

DHT11 温湿度传感器说明书

DHT11 温湿度传感器说明书

DHT11说明书温湿度传感器●具有抗冲击性及电气性能优良●完全标定●数字输出,单总线通讯●优异的长期稳定性●响应迅速、恢复时间快、抗干扰能力强产品简述DHT11是一款含有已校准数字信号输出的温湿度复合传感器,采用了自主研发的集成式数字温湿度元件,应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。

DHT11传感器内包含一个温湿度测量元件和一个高性能MCU。

应用范围DHT11温湿度传感器可以应用于农业、家电、汽车、气象、医疗等领域,如暖通空调、除湿机、冷链仓储、测试及检测设备、数据记录仪、湿度调节系统、医疗等。

图1.DHT11温湿度传感器1.传感器性能1.1相对湿度表1.湿度特性表参数测试条件最小典型最大单位量程范围附加说明15-95%RH精度2--±5%RH重复性--±1-%RH互换性-完全互换响应时间3τ(63%)-<6-s迟滞--±0.3-%RH漂移4典型值-<0.5-%RH/yr 1.2电气特性表2.电气特性表符号参数测试条件最小典型最大单位VCC供电电压- 3.35 5.5VI平均电流5休眠-60-µA 测量-1000-µAV OL低电平输出电压I L6=5mA0-300mVV OH高电平输出电压Rp<25kΩ0.9*VCC-VCC VV IL低电平输入电压下降0-0.3VV IH高电平输入电压上升0.7-VCC VRp上拉电阻7VCC=5V1 4.7100kΩT S采样周期-2--s实际使用中的一些特性如功耗、输入和输出的高、低电平电压等都取决于供电电压。

在使用传感器时,要使系统获得鲁棒性,请确保各参数在表2所给出的范围内。

1正常工作范围:8~85%RH,超出此范围,传感器读数会有偏差(在90%RH湿度下60小时后,漂移>3%RH)。

工作范围进一步限定在-20~60℃。

2此精度为传感器出厂检验时,在25℃、VCC=5V条件下的测试精度。

DHT11指导手册说明书

DHT11指导手册说明书

DHT11指导手册说明书一、产品概述1. 温度测量范围:0℃~50℃2. 湿度测量范围:20%RH~90%RH3. 温度测量精度:±2℃4. 湿度测量精度:±5%RH5. 响应时间:≤1秒6. 工作电压:3.3V~5.5V二、产品外观及接线方法1. VCC:电源正极(3.3V~5.5V)2. GND:电源负极3. OUT:数字信号输出接线方法如下:1. 将DHT11的VCC引脚连接至电源正极。

2. 将DHT11的GND引脚连接至电源负极。

3. 将DHT11的OUT引脚连接至您的控制器(如单片机)的数字输入端口。

三、使用注意事项1. 在使用DHT11前,请确保电源电压在规定范围内,以免损坏传感器。

2. 为了提高测量精度,请在安装DHT11时,避免将其暴露在直射阳光下,并保持传感器周围通风良好。

3. DHT11的OUT引脚输出的是数字信号,请确保控制器端的输入端口兼容数字信号。

4. 在长时间运行过程中,请定期检查DHT11的连接线是否牢固,防止因线缆松动导致的测量数据不准确。

DHT11指导手册说明书四、编程与通信协议1. 初始化:在开始通信前,请确保DHT11已经上电,并将控制器的输入端口设置为输入模式。

2. 开始信号:主机(控制器)将数据线拉低至少18毫秒,然后拉高,以唤醒DHT11。

3. DHT11响应:DHT11在检测到开始信号后,会拉低数据线80微秒,作为响应信号,随后拉高数据线80微秒,准备发送数据。

4. 数据接收:DHT11以每bit 50微秒的低电平表示“0”,以每bit 2628微秒的低电平后跟随70微秒的高电平表示“1”。

数据传输顺序为:湿度整数、湿度小数、温度整数、温度小数、校验和。

5. 校验和计算:校验和是前四个字节的简单累加,用于验证数据传输的正确性。

6. 编程示例:下面是一个简单的伪代码示例,用于读取DHT11的数据: void setup() {pinMode(DHT11_PIN, INPUT);}void loop() {int humidity = readDHT11Humidity();int temperature = readDHT11Temperature();// 处理温湿度数据}int readDHT11Humidity() {// 发送开始信号// 接收数据// 返回湿度值}int readDHT11Temperature() {// 发送开始信号// 接收数据// 返回温度值}五、安装与调试1. 安装位置:选择一个适合的环境进行安装,避免高温、高湿或直射阳光的地方,以确保测量准确性。

利用DHT11测温度湿度实验报告讲解

利用DHT11测温度湿度实验报告讲解

微电子工艺实验题目气压温度测量系统学生姓名洪强学号***********学院电子与信息工程学院专业电子科学与技术指导教师曹鸿霞二O一五年十一月二十二日目录目录................................................ 错误!未定义书签。

1 系统描述.......................................... 错误!未定义书签。

1.1 课程设计题目 (2)1.2 系统设计方案介绍 (2)1.3 方案论证 (3)2 硬件电路设计 (3)2.1 LCD1602液晶显示模块 (3)2.1.1 LCD1602原理图及引脚说明 (4)2.1.2 LCD1602操作时序 (5)2.2 AT89C52单片机 (6)2.3 DHT11传感器模块 (7)2.3.1 DHT11原理图及引脚说明 (7)2.3.2 DHT11数据帧 (8)2.3.3 DHT11电气特性 (8)2.3.4 DHT11操作时序 (9)2.4 蜂鸣器模块 (10)2.5 DHT11温湿度检测设计图 (11)3 软件程序设计 (11)3.1 程序流程图 (11)3.2程序设计 (12)3.2.1主程序 (12)3.2.2 LCD显示程序 (13)3.2.3蜂鸣器程序 (20)4 实验结果 (21)5 实验总结 (22)参考文献 (22)测量气压温度测量系统洪强南京信息工程大学电子科学与技术,南京 210044摘要本实验基于使用STC89C52单片机、DHT11传感器模块、1602液晶显示屏模块以及报警模块。

简单明了的实现的可提要求。

DHT11数字温湿度传感器把采集到的温湿度数据传给单片机。

经过单片机的处理。

准确的显示到液晶屏上。

并对温湿度设置上下限。

越限报警。

)关键词:单片机DHT11传感器1602液晶显示屏STC89C52 报警1 系统描述1.1 课程设计题目温度测量及显示要求:①基于52系列单片机平台和DHT11温湿度传感器完成温湿度的测量;②温度测量数据的显示,可以用LCD1602显示;③对温湿度设置上下限,超过限度报警1.2 系统设计方案介绍电路总体上分为温湿度采集部分、中央处理器、显示模块以及报警模块部分。

温湿度检测器DHT11程序及显示程序

温湿度检测器DHT11程序及显示程序

附录1:#include <regx52.h>#include <intrins.h>#include "DHT11.H"#include "DHT11.C"unsigned char range[4]={55,75,10,30}; //温湿度上下限初值unsigned char Humi_Temp_Tab[8]={6,9,0,0,7,8,0,0}; //数码管显示初值unsigned char numt1=0; //T1中断计数标志unsigned char numt0=0;unsigned char codeTab_Seg[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数码管段码 0-9unsigned char code Tab_Dig[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//位选第一位到第八位unsigned char code units[4]={0x39,0x71,0x77,0x76}; //单位C/F/RH/**********************************************//* 温湿度采集函数 *//**********************************************/void getdata(){if(start_DHT11()){read_DHT11();}if(check_sum()){Humi_Temp_Tab[0]=DHT_data.DH_H/10;Humi_Temp_Tab[1]=DHT_data.DH_H%10;Humi_Temp_Tab[2]=DHT_data.DH_L/10; //存储湿度数据if(flag == 0){Humi_Temp_Tab[4]=DHT_data.T_H/10;Humi_Temp_Tab[5]=DHT_data.T_H%10;Humi_Temp_Tab[6]=DHT_data.T_L/10;//存储摄氏温度数据}else{Humi_Temp_Tab[4]=(9*DHT_data.T_H/5+32)/10;Humi_Temp_Tab[5]=(9*DHT_data.T_H/5+32)%10;Humi_Temp_Tab[6]=(18*DHT_data.T_H+320)%100%10;//存储华氏温度数据}}}/**********************************************//* 主函数 *//**********************************************/void main(){delay_ms(500); //先进行延时等待进入稳定状态P0 = 0;P1 = 0x0C; //初始化P1口EA = 0;TR1 = 0;TR0 = 0;TMOD = 0x11; //设置定时器 T0和T1,且工作方式都为方式1TH1 = (65536-5000)/256;TL1 = (65536-5000)%256;TH0 = (65536-2000)/256;TL0 = (65536-2000)%256; //设定初值2msTR1 = 1;TR0 = 1;EA = 1;ET0 = 1;ET1 = 1; //打开中断定时器T0和T1PT1 = 0;PT0 = 1; //强制设置优先级delay_ms(1000);while(1){if(DHT_data.DH_H<range[0]) //湿度小于下限{bee = 0;delay_ms(100);bee = 1;delay_ms(100);}if(DHT_data.DH_H>range[1]) //湿度大于上限{bee = 0;delay_ms(100);bee = 1;delay_ms(100);}if(DHT_data.T_H<range[2]) //温度小于下限{bee = 0;delay_ms(10);bee = 1;delay_ms(10);}if(DHT_data.T_H>range[3]) //温度大于上限{bee = 0;delay_ms(10);bee = 1;delay_ms(10);}}}/**********************************************//* 定时器T0中断 *//**********************************************/void T0_timer() interrupt 1{unsigned char KData = 0x00;TR0 = 0; //进入T0后将T0中断关闭TH0 = (65536-2000)/256;TL0 = (65536-2000)%256;switch(numt0){case 0: P0 = 0; Seg_ce = 1; Seg_ce = 0; //段选开关if(flag2 == 1)P0 = Tab_Seg[range[0]/10];//显示湿度下限的十位elseP0 = Tab_Seg[Humi_Temp_Tab[0]];//显示读取的湿度的十位Seg_ce = 1; Seg_ce = 0;.P0 = Tab_Dig[0]; //位选第一位Dig_ce = 1; Dig_ce = 0;numt0++;break;case 1: P0 = 0; Seg_ce = 1; Seg_ce = 0;if(flag2 == 1)P0 = Tab_Seg[range[0]%10];//显示湿度下限的个位elseP0 = Tab_Seg[Humi_Temp_Tab[1]];//显示读取的湿度的个位Seg_ce = 1; Seg_ce = 0;P0 = Tab_Dig[1]; //位选第二位Dig_ce = 1; Dig_ce = 0;numt0++;break;case 2: P0 = 0; Seg_ce = 1; Seg_ce = 0;if(flag2 == 1)P0 = Tab_Seg[range[1]/10];//显示湿度上限的十位elseP0 = units[2];//显示单位RSeg_ce = 1; Seg_ce = 0;P0 = Tab_Dig[2]; //位选第三位Dig_ce = 1; Dig_ce = 0;numt0++;break;case 3: P0 = 0; Seg_ce = 1; Seg_ce = 0;if(flag2 == 1)P0 = Tab_Seg[range[1]%10];//显示湿度上限的个位elseP0 = units[3]; //显示单位H Seg_ce = 1; Seg_ce = 0;P0 = Tab_Dig[3]; //位选第四位Dig_ce = 1; Dig_ce = 0;numt0++;break;case 4: P0 = 0; Seg_ce = 1; Seg_ce = 0;P0 = Tab_Dig[4];//位选第五位,且同时拉低键盘第四行Dig_ce = 1; Dig_ce = 0;Key_ce = 0;KData = P0; //扫描键盘第四行switch(KData){case 0xfe:case 0xfd:case 0xfb:case 0xf7:default:break;}while(KData != 0xff){KData = P0;}Key_ce = 1;if(flag2 == 1)P0 = Tab_Seg[range[2]/10];//显示温度下限的十位elseP0 = Tab_Seg[Humi_Temp_Tab[4]];//显示读取的温度的十位Seg_ce = 1; Seg_ce = 0;numt0++;break;case 5: P0 = 0; Seg_ce = 1; Seg_ce = 0;P0 = Tab_Dig[5];//位选第六位,且同时拉低键盘第三行Dig_ce = 1; Dig_ce = 0;Key_ce = 0;KData = P0;//扫描键盘第三行switch(KData){case 0xfe:if(range[0]<range[1]&&flag2==1)range[0]++;break; //湿度下限加case 0xfd:if(range[1]<90&&flag2==1)range[1]++;break; //湿度上限加case 0xfb:if(range[2]<range[3]&&flag2==1range[2]++;break; //温度下限加case 0xf7:if(range[3]<50&&flag2==1)range[3]++;break; //温度上限加default:break;}while(KData != 0xff){KData = P0;}Key_ce = 1;if(flag2 == 1)P0 = Tab_Seg[range[2]%10];//显示温度下限的个位elseP0 = Tab_Seg[Humi_Temp_Tab[5]]-0x80; //显示读取温度的个位(带小数点的)Seg_ce = 1; Seg_ce = 0;numt0++;break;case 6: P0 = 0; Seg_ce = 1; Seg_ce = 0;P0 = Tab_Dig[6];//位选第七位,且同时拉低键盘第二行Dig_ce = 1; Dig_ce = 0;Key_ce = 0;KData = P0; //扫描键盘第二行switch(KData){case 0xfe:if(range[0]>20&&flag2==1)range[0]--;break; //湿度下限减case 0xfd:if(range[0]<range[1]&&flag2==1)range[1]--;break; //湿度上限减case 0xfb:if(range[2]>0&&flag2==1)range[2]--;break; //温度下限减case 0xf7:if(range[2]<range[3]&&flag2==1)range[3]--;break; //温度上限减default:break;}while(KData != 0xff){KData = P0;}Key_ce = 1;if(flag2 == 1)P0 = Tab_Seg[range[3]/10];//显示温度上限的十位elseP0 = Tab_Seg[Humi_Temp_Tab[6]];//显示读取温度的小数位的十位Seg_ce = 1; Seg_ce = 0;numt0++;break;case 7: P0 = 0; Seg_ce = 1; Seg_ce = 0;P0 = Tab_Dig[7];//位选第八位,且同时拉低键盘第一行Dig_ce = 1; Dig_ce = 0;Key_ce = 0;KData = P0; //扫描键盘第一行switch(KData){case 0xfe:flag2 = ~flag2;TR1 = ~TR1;break;//进入和退出限制调整模式case 0xfd:flag = ~flag;break;//进行华氏摄氏温度的转换设置case 0xfb:case 0xf7:default:break;}while(KData != 0xff){KData = P0;}Key_ce = 1;if(flag == 0&&flag2 == 0)P0 = units[0]; //显示单位Celse if(flag == 1&&flag2 == 0)P0 = units[1]; //显示单位Felse if(flag2 == 1)P0 = Tab_Seg[range[3]%10];//显示温度上限的个位Seg_ce = 1; Seg_ce = 0;numt0 = 0;break;default:numt0 = 0;break;}TR0 = 1; //打开T0}/**********************************************//* 定时器T1中断 *//**********************************************/void T1_timer() interrupt 3{TR1 = 0; //关闭T0TH1 = (65536-50000)/256;TL1 = (65536-50000)%256;if(numt1 == 25){getdata(); //采集数据numt1 = 0;}elsenumt1++;TR1 = 1; //打开T0}#ifndef __DHT11_h__#define __DHT11_h__#include <REGX52.H>/**********************************************//* 引脚定义 *//**********************************************/sbit DHT_bus = P2^0 ; //DHT11数据传输口sbit Key_ce=P1^3; //按键输出使能sbit Seg_ce=P1^0; //段选位sbit Dig_ce=P1^1; //位选位sbit bee = P2^1; //蜂鸣器控制口/**********************************************//* 函数声明 *//**********************************************/bit start_DHT11(void); //开始void read_DHT11(void); //读取void delay_20us(void); //20us延时void delay_ms(unsigned char m); //N ms延时bit check_sum(void); //和校验/**********************************************//* 宏定义 *//**********************************************/#define HIGH 1#define LOW 0/**********************************************//* 变量定义 *//**********************************************/#define DHT_timeover 5 //高电平维持时间,用于识别“数据0”和“数据1”bit flag2 = 0; //设置调节上下限模式转换标志bit flag=0; //设置摄氏和华氏温度模式转换标志/**********************************************//* 结构体 *//**********************************************/struct DHT_data{unsigned char DH_H; //湿度整数unsigned char DH_L; //湿度小数unsigned char T_H; //温度整数unsigned char T_L; //温度小数unsigned char Checksum; //校验和}DHT_data;#endif#include "DHT11.h"#include <intrins.h>/**********************************************//* 开始 DHT11 温湿度计 *//* 输入:无 *//* 输出:应答标志 0:应答失败 1:应答成功 *//**********************************************/bit start_DHT11(void){bit DHT_start;DHT_start = 0;DHT_bus = HIGH;DHT_bus = LOW; //拉低18ms以上delay_ms(18);TR0 = 0;DHT_bus = HIGH;delay_20us();delay_20us(); //拉高20~40uswhile(!DHT_bus){DHT_start = 1;} //DHT应答,DHT拉低80us后拉高80us,然后开始传输数据//数据(40bit)=8bit湿度整数+8bit湿度小数+8bit温度整数+8bit 温度小数+8bit校验和while(DHT_bus){};return(DHT_start); //应答成功返回1}/**********************************************//* 读取 DHT11 温湿度计 *//* 读取结果存在DHT_data结构体内 *//* 输入:无输出:无 *//**********************************************/void read_DHT11(void){unsigned char m,n,timer_dht;unsigned char *p;p=&DHT_data.DH_H; //数据放在DHT_date的结构体中for(m=0;m<5;m++){for(n=0;n<8;n++){while(~DHT_bus); //DHT拉低12-14us表示1bit数据开始timer_dht=0x00;while(DHT_bus) //随后DHT拉高总线,单片机通过高电平维持的时间判断“数据0”还是“数据1”{ //数据0维持26~28us高电平,数据1维持116~118us高电平timer_dht++; //由于此处对延时时间的长度要求很高,所以采用另一种办法判断}if(timer_dht>DHT_timeover){*p<<=1;*p|=0x01;}else{*p<<=1;*p&=0xfe;}}p++;}TR0 = 1;}/**********************************************//* 20us 精确延时 *//* 51用在12Mhz晶振下 *//* 调用函数使用LCALL和RET指令,共花费4个周期 *//* 因此只有16个NOP *//**********************************************/.void delay_20us(void){_nop_ ();_nop_ ();_nop_ ();_nop_ ();_nop_ ();_nop_ ();_nop_ ();_nop_ ();_nop_ ();_nop_ ();_nop_ ();_nop_ ();_nop_ ();_nop_ ();_nop_ ();_nop_ ();}/**********************************************//* N ms 延时 *//* while()额外占用约5周期 *//* 因此内层while(40--)20us 大约1ms *//* Nms延时函数(未测试) *//**********************************************/void delay_ms(unsigned char m){unsigned char n = 38;while(m--){while(n--){delay_20us();}}}/**********************************************//* 校验和判断 *//* 校验位 = 湿度整数位+湿度小数位+温度整数位+温度小数位之和 *//* 校验正确返回:1 失败返回:0 *//**********************************************/bit check_sum(void){if(DHT_data.Checksum==(DHT_data.DH_H+DHT_data.DH_L+DHT_data.T _H+DHT_data.T_L))return(1); //校验正确elsereturn(0); //校验失败}Word 资料。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数字温湿度传感器DHT111、概述DHTxx 系列数字温湿度传感器就是一款含有已校准数字信号输出得温湿度复合传感器。

它应用专用得数字模块采集技术与温湿度传感技术,确保产品具有极高得可靠性与卓越得长期稳定性。

传感器包括一个电阻式测湿元件与一个NTC测温元件,并与一个高性能8位单片机相连接。

因此,该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。

每个DHTxx传感器都在极为精确得湿度校验室中进行校准。

校准系数以程序得形式储存在OTP内存中,传感器内部在检测信号得处理过程中要调用这些校准系数。

单线制串行输出接口,使系统集成变得简易快捷。

超小得体积、极低得功耗,使其成为各类应用甚至最为苛刻得应用场合得最佳选则。

本产品为 4 针单排引脚封装,特殊封装形式可根据用户需求而提供。

2、产品特性湿温度传感器得一体化结构能相对得同时对相对湿度与温度进行测量。

数字信号输出,从而减少用户信号得预处理负担。

单总线结构输出有效得节省用户控制器得I/O口资源。

并且,不需要额外电器元件。

独特得单总数据传输线协议使得读取传感器得数据更加便捷。

全部校准。

编码方式为8位二进制数。

40bit 二进制数据输出。

其中湿度整数部分占1Byte,小数部分1Byte;温度整数部分1Byte,小数部分1Byte。

其中,湿度为高16位。

最后1Byte为校验与。

卓越得长期稳定性,超低功耗。

4引脚安装,超小尺寸。

各型号管脚完全可以互换。

测量湿度范围从20%RH到90%RH;测量温度范围从0℃到50℃。

适用范围包括恒湿控制,消费家电类产品,温湿度计等领域。

3、外型与引脚排列引脚说明:Vcc 正电源Dout 输出NC 空脚GND 地 1图3、0 DHT外型及管脚4、详细引脚说明:传感器管脚方向识别:正面(有通气孔得一面)瞧过去,从左到右依次为1、2、3、4脚。

表4、0:电源引脚,,要等待1s 以越过不稳定状态在此期间不要发送任何指令。

电源引脚(VDD,GND)之间可增加一个100nF 得电容,用以去耦滤波。

5、订货信息67、连接接口说明DHTxx数字湿温度传感器连接电路简单,只需要占用控制器一个I/O口即可完成上下位得连接。

典型应用电路如下图所示。

另外,建议连接线长度短于20时用5K上拉电阻,大于20米时根据实际情况使用合适得上拉电阻,如图5、0所示。

图5、0 典型电路连接8、数据格式及处理8、1、格式数字湿温度传感器采用单总线数据格式。

即,单个数据引脚端口完成输入输出双向传输。

其数据包由5Byte(40Bit)组成。

一次通讯时间最大3ms,数据分小数部分与整数部分,具体格式在下面说明。

DATA 用于微处理器与DHTxx之间得通讯与同步,采用单总线数据格式, 当前小数部分用于以后扩展,现读出为0。

操作流程如下:一次完整得数据传输为40bit,高位先出。

数据格式:8bit湿度整数数据+8bit湿度小数数据+8bit温度整数数据+8bit温度小数数据+8bit校验与校验与数据为前四个字节相加。

具体见表6、1:8、2、数据编码及处理传感器数据输出得就是未编码得二进制数据。

数据(湿度、温度、整数、小数)之间应该分开处理。

如果,某次从传感器中读取如下5Byte数据:byte4 byte3 byte2 byte1 byte000101101 00000 00000整数小数整数小数校验与湿度温度校验与由以上数据就可得到湿度与温度得值,计算方法:humi (湿度)= byte4 、byte3=45、0 (%RH)temp (温度)= byte2 、byte1=28、0 ( ℃)jiaoyan(校验)= byte4+ byte3+ byte2+ byte1=739、时序DHTxx传感器就是通过奥松电子有限公司开发得单总线协议与上位机(控制器)进行数据通信。

DHTxx传感器需要严格得读写协议来确保数据得完整性。

整个读写分为,上位机发送起始信号,上位机接收下位机发来得握手响应信号,读‘0’,与读‘1’四个步骤。

所有得信号除主机启动复位信号外,全部都由DHTxx产生。

通过单总线访问DHTxx顺序归纳如下:主机发开始信号主机等待接收DHTxx响应信号主机连续接收40Bit得数据与校验与数据处理9、1、主机复位信号与DHT响应信号图7、1 DHT复位时序用户主机发送一次开始信号(低电平)DHT从低速模式转换到高速模式,等待主机开始信号结束(拉高)后,DHT发送响应信号,送出40bit得数据,并触发一次信号采集,用户可选择读取部分数据。

注意:总线线空闲状态为高电平,主机把总线线拉低等待DHT响应,主机把总线线拉低必须大于18毫秒,保证DHT能检测到起始信号。

DHT接收到主机得开始信号后,等待主机开始信号结束,然后发送低电平响应信号。

主机发送开始信号结束后,延时等待2040us后, 读取DHT得回应信号,主机发送开始信号后,可以切换到输入模式,或者输出高电平均可,总线线由上拉电阻拉高。

9、2、DHT开始发送数据流程图7、2 读DHT数据流程主机发送开始信号后,延时等待20us40us后读取DHT得回应信号,读取总线为低电平,说明DHT发送响应信号,DHT发送响应信号后,再把总线拉高,准备发送数据,每一bit数据都以低电平开始,格式见下面图示。

如果读取响应信号为高电平,则DHT没有响应,请检查线路就是否连接正常。

9、3、数字‘0’信号表示方法图7、3 信号‘0’时序图数字‘0’表示方法为,首先DHT把总线拉低1214us然后拉高,高电平保持时间在2628us这个范围内。

则此比特为‘0’电平。

9、4、数字‘1’信号表示方法图7、4 信号‘1’时序图数字‘1’表示方法为,首先DHT把总线拉低1214us然后拉高,高电平保持时间在116118us这个范围内。

则此比特为‘1’电平。

10、测量分辨率测量分辨率分别为8bit(温度)、8bit(湿度)。

11、电气特性VDD=5V,T = 25注:采样周期间隔不得低于1秒钟。

12、应用信息12、1工作与贮存条件超出建议得工作范围可能导致高达3%RH得临时性漂移信号。

返回正常工作条后,传感器会缓慢地向校准状态恢复。

要加速恢复进程/可参阅7、3小节得“恢复处理”。

在非正常工作条件下长时间使用会加速产品得老化过程。

12、2暴露在化学物质中电阻式湿度传感器得感应层会受到化学蒸汽得干扰,化学物质在感应层中得扩散可能导致测量值漂移与灵敏度下降。

在一个纯净得环境中,污染物质会缓慢地释放出去。

下文所述得恢复处理将加速实现这一过程。

高浓度得化学污染会导致传感器感应层得彻底损坏。

12、3恢复处理置于极限工作条件下或化学蒸汽中得传感器,通过如下处理程序,可使其恢复到校准时得状态。

在5060℃与< 10%RH得湿度条件下保持2 小时(烘干);随后在2030℃与>70%RH得湿度条件下保持 5小时以上。

12、4温度影响气体得相对湿度,在很大程度上依赖于温度。

因此在测量湿度时,应尽可能保证湿度传感器在同一温度下工作。

如果与释放热量得电子元件共用一个印刷线路板,在安装时应尽可能将DHT11远离电子元件,并安装在热源下方,同时保持外壳得良好通风。

为降低热传导,DHT11与印刷电路板其它部分得铜镀层应尽可能最小,并在两者之间留出一道缝隙。

12、5光线长时间暴露在太阳光下或强烈得紫外线辐射中,会使性能降低。

12、6配线注意事项DATA信号线材质量会影响通讯距离与通讯质量,推荐使用高质量屏蔽线。

13、封装信息14、焊接信息手动焊接,在最高260℃得温度条件下接触时间须少于10秒。

15、注意事项(1)避免结露情况下使用。

(2)长期保存条件:温度10-40℃,湿度60%以下。

例程://****************************************************************//// DHT21使用范例//单片机: AT89S52 或STC89C52RC// 功能:串口发送温湿度数据波特率9600//硬件连接: P2、0口为通讯口连接DHT11,DHT11得电源与地连接单片机得电源与地,单片机串口加MAX232连接电脑//****************************************************************//#include <reg51、h>#include <intrins、h>//typedef unsigned char U8; /* defined for unsigned 8bits integer variable 无符号8位整型变量*/typedef signed char S8; /* defined for signed 8bits integer variable 有符号8位整型变量*/typedef unsigned int U16; /* defined for unsigned 16bits integer variable 无符号16位整型变量*/typedef signed int S16; /* defined for signed 16bits integer variable 有符号16位整型变量*/typedef unsigned long U32; /* defined for unsigned 32bits integer variable 无符号32位整型变量*/typedef signed long S32; /* defined for signed 32bits integer variable 有符号32位整型变量*/typedef float F32; /* single precision floating point variable (32bits) 单精度浮点数(32位长度) */typedef double F64; /* double precision floating point variable (64bits) 双精度浮点数(64位长度) *///#define uchar unsigned char#define uint unsigned int#define Data_0_time 4//////IO口定义区//////sbit P2_0 = P2^0 ;sbit P2_1 = P2^1 ;sbit P2_2 = P2^2 ;sbit P2_3 = P2^3 ;//////定义区//////U8 U8FLAG,k;U8 U8count,U8temp;U8 U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;U8U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_t emp;U8 U8data;U8 outdata[5]; //定义发送得字节数U8 indata[5];U8 count, count_r=0;U8 str[5]={"RS232"};U16 U16temp1,U16temp2;SendData(U8 *a){outdata[0] = a[0];outdata[1] = a[1];outdata[2] = a[2];outdata[3] = a[3];outdata[4] = a[4];count = 1;SBUF=outdata[0];}void Delay(U16 j){ U8 i;for(;j>0;j){for(i=0;i<27;i++);}}void Delay_10us(void){U8 i;i;i;i;i;i;i;}void (void){U8 i;for(i=0;i<8;i++){U8FLAG=2;//P2_1=0 ; //TP2_1=1 ; //T//while((!P2_0)&&U8FLAG++);Delay_10us;Delay_10us;// Delay_10us;U8temp=0;if(P2_0)U8temp=1;U8FLAG=2;while((P2_0)&&U8FLAG++);//P2_1=0 ; //TP2_1=1 ; //T////超时则跳出for循环if(U8FLAG==1)break;//判断数据位就是0还就是1// 如果高电平高过预定0高电平值则数据位为1U8data<<=1;U8data|=U8temp; //0}//rof}////湿度读取子程序////以下变量均为全局变量//温度高8位== U8T_data_H//温度低8位== U8T_data_L//湿度高8位== U8RH_data_H//湿度低8位== U8RH_data_L//校验8位== U8checkdata//调用相关子程序如下// Delay;, Delay_10us;,;//void RH(void){//主机拉低18msP2_0=0;Delay(180);P2_0=1;//总线由上拉电阻拉高主机延时20usDelay_10us;Delay_10us;Delay_10us;Delay_10us;//主机设为输入判断从机响应信号P2_0=1;//判断从机就是否有低电平响应信号如不响应则跳出,响应则向下运行if(!P2_0) //T !{U8FLAG=2;//判断从机就是否发出80us 得低电平响应信号就是否结束while((!P2_0)&&U8FLAG++);U8FLAG=2;//判断从机就是否发出80us 得高电平,如发出则进入数据接收状态while((P2_0)&&U8FLAG++);//数据接收状态;U8RH_data_H_temp=U8data;;U8RH_data_L_temp=U8data;;U8T_data_H_temp=U8data;;U8T_data_L_temp=U8data;;U8checkdata_temp=U8data;P2_0=1;//数据校验U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);if(U8temp==U8checkdata_temp){U8RH_data_H=U8RH_data_H_temp;U8RH_data_L=U8RH_data_L_temp;U8T_data_H=U8T_data_H_temp;U8T_data_L=U8T_data_L_temp;U8checkdata=U8checkdata_temp;}//fi}//fi}////main功能描述: A T89C51 11、0592MHz 串口发//送温湿度数据,波特率9600//void main{U8 i,j;//uchar str[6]={"RS232"};/* 系统初始化*/TMOD = 0x20; //定时器T1使用工作方式2TH1 = 253; // 设置初值TL1 = 253;TR1 = 1; // 开始计时SCON = 0x50; //工作方式1,波特率9600bps,允许接收ES = 1;EA = 1; // 打开所以中断TI = 0;RI = 0;SendData(str) ; //发送到串口Delay(1); //延时100US(12M晶振)while(1){////调用温湿度读取子程序RH;//串口显示程序//str[0]=U8RH_data_H;str[1]=U8RH_data_L;str[2]=U8T_data_H;str[3]=U8T_data_L;str[4]=U8checkdata;SendData(str) ; //发送到串口//读取模块数据周期不易小于2SDelay(20000);}//elihw}// mainvoid RSINTR interrupt 4 using 2{U8 InPut3;if(TI==1) //发送中断{TI=0;if(count!=5) //发送完5位数据{SBUF= outdata[count];count++;}}if(RI==1) //接收中断{InPut3=SBUF;indata[count_r]=InPut3;count_r++;RI=0;if (count_r==5)//接收完4位数据{//数据接收完毕处理。

相关文档
最新文档