一、DHT11传感器概述
DHT11传感器概述
DHT11数字温湿度传感器是一种含有校准数字信号输出的温湿度复合传感器。采用特殊的数字模块采集技术和温湿度传感技术,确保产品具有高可靠性和优异的长期稳定性。 传感器包括电阻式感湿元件和NTC测温元件,并与高性能8位单片机连接 。
DHT传感器体积小,功耗极低,信号传输距离可达20米以上。具有质量优良、响应超快、抗干扰能力强、性价比高等优点。 产品为 4 针单排引脚封:
DHT11与MCU连接图:
二、DHT11通信协议分析
1. DHT11数据传输协议
DHT11通过DATA线与MCU实现半双工通信。每次通信时间4ms左右,数据分小数部分和整数部分,具体格式在下面说明(当前小数部分用于以后扩展,现读出为零)。 操作流程如下:一次完整的数据传输为40bit,高位先出。 数据格式: 40bits = 8bit湿度整数据 8bit湿度小数据 8bit整个温度数据 8bit 8温度小数据bit校验和
当数据传输正确时,校验和数据 8bit湿度整数据 8bit湿度小数据 8bi整个温度数据 8bit 获得结果的最后8位是温度小数据。 即: 校准和数据 =( 8bit湿度整数据 8bit湿度小数据 8bi整个温度数据 8bit温度小数据)% 256。
2. DHT11数据通信过程
(1)总线空闲状态为高电平,主机将总线降低18毫秒,向DHT11发送开始信号。
(2)DHT11收到主机的开始信号后,等待主机开始信号结束,然后发送80us低电平响应信号。
(3)主机发送开始信号后,延迟等待20-40us后,读取DHT11响应信号,主机发送开始信号后,可切换到输入模式,或平均输出高电,总线由上拉电阻拉高。
(4) DHT11发送响应信号后,将总线拉高80us,准备发送数据。
(1)DHT11总共会发送40bits每一个数据bit数据都以50us低电平时间隙开始。
(2)50us低电平间隙结束后,下一个高电平的长度决定了数据位是0还是1。
(3)高电平时长26~28us左右0,70us左右表示1,格式见下图。
(4)如果读取响应信号总是高电平,则表示DHT11无响应,请检查线路连接是否正常.当最后一bit数据传输后,DHT11拉低总线50us,然后总线从上拉电阻拉高到空闲状态。
整个通讯过程如图所示:
3.微秒级延迟函数
#include “OnBoard.h” MicroWait(t)
三、实例演示
#ifndef __DHT11_H__#define __DHT11_H__#include "iocc2530.h"extern unsigned char temperature,humidity;extern int Start_DHT11(void);#endif
#include "dht11.h"#include "OnBoard.h"#define DATA P0_4unsigned char temperature=0,humidity=0;void DATA_IO_input_Cfg(void)//设置为上拉输入模式{
P0SEL &= 0xEF; // 1110 1111 把P04设置为普通IO模式 P0DIR &= 0xEF; // 1110 1111 把P04设置为输入模式 P0INP &= 0xEF; // 1110 1111 把P04设置为上下拉模式 P2INP &= 0xDF; // 1101 1111 把P0组设置为上拉模式}void DATA_IO_output_Cfg(void)//设置为输出模式{
P0SEL &= 0xEF; // 1110 1111 把P04设置为普通IO模式 P0DIR |= 0x10; // 0001 0000 把P04设置为输出模式// P0INP |= 0x10; // 0001 0000 把P04设置为三态模式}unsigned char Read_Byte(void){
unsigned char tmp=0,i; for(i=0;i<8;i++) {
while(!(DATA ==0));//每个bit都是从50us的低电平开始 while(!(DATA ==1)); MicroWait(30);//延时30us if(DATA == 1) {
tmp |= 1<<(7-i);//把该bit设置为1 } } return tmp;}/*@Start_DHT11 : 采集一次温湿度数据@retval : 如果成功,把温湿度的值保存到全局变量,并返回1 如果失败,返回0*/int Start_DHT11(void)//开始采集数据{
unsigned char buf[5]; DATA_IO_output_Cfg();//设置为输出模式 DATA = 0;//发送开始信号 MicroWait(20000);//延时至少18ms DATA = 1;//拉高20~40us MicroWait(40); DATA_IO_input_Cfg();//设置为输入模式 while(!(DATA ==0));//等DHT11回响应信号 while(!(DATA ==1));//等DHT11把总线拉高,准备接收数据 buf[0] = Read_Byte(); buf[1] = Read_Byte(); buf[2] = Read_Byte(); buf[3] = Read_Byte(); buf[4] = Read_Byte(); if((buf[0]+buf[1]+buf[2]+buf[3])%256 == buf[4]) {
humidity = buf[0]; temperature = buf[2]; return 1; } return 0;}