DHT11是一款湿温度一体化的数字传感器.该传感器包括一个电阻式测湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。通过单片机等微处理器简单的电路连接就能够实时的采集本地湿度和温度。DHT11与单片机之间能采用简单的单总线进行通信,仅仅需要一个TO口。传感器内部湿度和温度数据40Bit 的数据一次性传给单片机,数据采用校验和方式进行校验,有效的保证数据传输的准确性。DHT11功耗很低,5V电源电压下,工作平均最大电流0.5mA。

java 接入温湿度传感器 modbus_单片机

DHT11的技术参数如下:

  • 工作电压范围:3.3V-5.5V
  • 工作电流:平均0.5mA
  • 输出:单总线数字信号
  • 测量范围:湿度20~90%RH,温度0~50℃ 
  • 精度︰湿度±5%,温度±2℃
  • 分辨率:湿度1%,温度1℃

DHT11管脚图

java 接入温湿度传感器 modbus_单总线_02

java 接入温湿度传感器 modbus_单总线_03

DHT11典型电路

java 接入温湿度传感器 modbus_单片机_04

 DHT11数据结构

        DHT11数字湿温度传感器采用单总线数据格式。即,单个数据引脚端口完成输入输出双向传输。其数据包由5Byte ( 40Bit)组成。数据分小数部分和整数部分,一次完整的数据传输为40bit,高位先出。DHT11的数据格式为:8bit湿度整数数据+8bit湿度小数数据+8bit温度整数数据+8bit温度小数数据+8bit校验和。其中校验和数据为前四个字节相加。

DHT11传输时序

初始时序

java 接入温湿度传感器 modbus_单总线_05

        首先主机发送开始信号,即:拉低数据线,保持t1(至少18ms)时间,然后拉高数据线t2(20~40us)时间,然后读取 DHT11的响应,正常的话,DHT11会拉低数据线,保持t3(40~50us)时间,作为响应信号,然后DHT11拉高数据线,保持t4(40~50us)时间后,开始输出数据。
 

输出数据“1”的时序

java 接入温湿度传感器 modbus_单总线_06

输出数据“0”的时序

 

java 接入温湿度传感器 modbus_单总线_07

 代码实现

        头文件dht11.h

#ifndef __DH11_H__
#define __DH11_H__

sbit  DHT21= P1^1;



void RH(void);
void  COM(void);

extern unsigned char U8T_data_H,U8RH_data_H;


#endif

        dht11.c文件

#include "delay.h"		//延时必须用char的delay文件
#include "DH11.h"

unsigned char U8FLAG,k;
unsigned char U8count,U8temp;
unsigned char U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
unsigned char U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
unsigned char U8comdata;

void  COM(void)
{
	unsigned char i;
	for(i=0;i<8;i++)	   
	{
		U8FLAG=2;	
		while((!DHT21)&&U8FLAG++);
		DelayUs2x(15);
		U8temp=0;
		if(DHT21)U8temp=1;
		U8FLAG=2;
		while((DHT21)&&U8FLAG++);
		//超时则跳出for循环		  
		if(U8FLAG==1)break;
		//判断数据位是0还是1	 
		U8comdata<<=1;	 // 如果高电平高过预定0高电平值则数据位为 1 
		U8comdata|=U8temp;        //0
	}
}
	//--------------------------------
	//-----湿度读取子程序 ------------
	//--------------------------------
	//----以下变量均为全局变量--------
	//----温度高8位== U8T_data_H------
	//----温度低8位== U8T_data_L------
	//----湿度高8位== U8RH_data_H-----
	//----湿度低8位== U8RH_data_L-----
	//----校验 8位 == U8checkdata-----
	//----调用相关子程序如下----------
	//---- Delay();, Delay_10us();,COM(); 
	//--------------------------------

void RH(void)
{
	//主机拉低18ms 
	DHT21=0;
	DelayMs(18);
	DHT21=1;
	//总线由上拉电阻拉高 主机延时20us
	DelayUs2x(20);
	//主机设为输入 判断从机响应信号 
	DHT21=1;
	//判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行	  
	if(!DHT21)		 //T !	  
	{
		U8FLAG=2;
		//判断从机是否发出 80us 的低电平响应信号是否结束	 
		while((!DHT21)&&U8FLAG++);
		U8FLAG=2;
		//判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
		while((DHT21)&&U8FLAG++);
		//数据接收状态		 
		COM();
		U8RH_data_H_temp=U8comdata;
		COM();
		U8RH_data_L_temp=U8comdata;
		COM();
		U8T_data_H_temp=U8comdata;
		COM();
		U8T_data_L_temp=U8comdata;
		COM();
		U8checkdata_temp=U8comdata;
		DHT21=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;
		}
	}
}