目录

  • 一、简介
  • 二、连线
  • 三、协议
  • 四、程序代码



一、简介

想温度湿度传感器发送读取指令java示例 温湿度传感器数据格式_数据


DHT11 数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。能采集温度和湿度

二、连线

1、vcc接3-5.5V。传感器上电后,要等待 1s 以越过不稳定状态在此期间无需发送任何指令。

2、gdn接地

3、data引脚:用于微处理器与 DHT11之间的通讯和同步,采用单总线数据格式,一次通讯时间4ms左右,数据分小数部分和整数部分,一次完整的数据传输为40bit,高位先出。

数据格式:8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据+8bit校验和

数据传送正确时校验和数据等于“8bit湿度整数数据+8bit湿度小数数据

+8bi温度整数数据+8bit温度小数数据”所得结果的末8位

想温度湿度传感器发送读取指令java示例 温湿度传感器数据格式_数据_02

此处data引脚接PG11

三、协议

想温度湿度传感器发送读取指令java示例 温湿度传感器数据格式_数据_03


想温度湿度传感器发送读取指令java示例 温湿度传感器数据格式_校验和_04

1、开始信号:主机拉低电平,至少 18 毫秒(比如:25ms)。
Tip:主机没有发送开始信号,DHT11不会主动进行温湿度采集

2、主机发送开始信号结束后,延时等待20-40us

//开始信号+延时
void DHT11_Rst()	   
{                 
	DHT11_IO_OUT(); 	//SET OUTPUT
    DHT11_DQ_OUT=0; 	//拉低DQ
    delay_ms(20);    	//拉低至少18ms
    DHT11_DQ_OUT=1; 	//DQ=1 
	delay_us(30);     	//主机拉高20~40us
}

想温度湿度传感器发送读取指令java示例 温湿度传感器数据格式_校验和_05

2、DHT11响应信号:80us低电平.
3、主机发送开始信号后,可以切换到输入模式,或者输出高电平均可, 总线由上拉电阻拉高。

u8 DHT11_Check() 	   
{   
	u8 retry=0;
	DHT11_IO_IN();//输入模式 
    while (DHT11_DQ_IN&&retry<100)//DHT11会拉低40~50us
	{
//DHT11_DQ_IN为data引脚,data输出0退出循环
		retry++;
		delay_us(1);
	};	 
	if(retry>=100)return 1;//响应超时,则失败
	else retry=0;
    while (!DHT11_DQ_IN&&retry<100)//DHT11拉低后会再次拉高40~50us
	{
		retry++;
		delay_us(1);
	};
	if(retry>=100)return 1;	    
	return 0;
}

如果传感器正常的话,现在则可以开始接收数据
(1)数据0和1的表示:
1 信号: 14us 低电平 + 70us 高电平
0 信号:14us 低电平 + (26us~28us)高电平
(2)数据读取函数

u8 DHT11_Read_Data(u8 *temp,u8 *humi)    
{        
 	u8 buf[5];
	u8 i;
	DHT11_Rst();    //先对温湿度传感器进行复位
	if(DHT11_Check()==0)
	{
		for(i=0;i<5;i++)//读取40位数据
		{
			buf[i]=DHT11_Read_Byte();
		}
		if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
		{
			*humi=buf[0];
			*temp=buf[2];
		}
		
	}else return 1; //读取失败
	return 0;	    
}

数据格式:8bit湿度整数数据+8bit湿度小数数据 +8bi温度整数数据+8bit温度小数数据+8bit校验和
其中数据传送正确时校验和数据等于“8bit湿度整数数据+8bit湿度小数数据
+8bi温度整数数据+8bit温度小数数据”所得结果的末8位。

四、程序代码

//从DHT11读取一个字节
u8 DHT11_Read_Byte(void)    
{        
    u8 i,dat;
    dat=0;
	for (i=0;i<8;i++) 
	{
   		dat<<=1; 
	    dat|=DHT11_Read_Bit();
    }						    
    return dat;
}

//从DHT11读取一个位
u8 DHT11_Read_Bit(void) 			 
{
 	u8 retry=0;
	while(DHT11_DQ_IN&&retry<100)//等待变为低电平 12-14us 开始
	{
		retry++;
		delay_us(1);
	}
	retry=0;
	while(!DHT11_DQ_IN&&retry<100)//等待变高电平	 26-28us表示0,116-118us表示1
	{
		retry++;
		delay_us(1);
	}
	delay_us(40);//等待40us
	if(DHT11_DQ_IN)return 1;
	else return 0;		   
}

应答信号:主机释放总线后,DTH11 拉低总线做为应答信号。(持续 80us),故主机要在 80us 之前检测总线电平状态。(40us ~ 80us)(比如:距主机释放总线 70us 时读取)。