DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器,它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性和卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。每个DHT11传感器都在极为精确的湿度校验室中进行校准。校准系数以程序的形式存在OTP内存中,传感器内部在检测型号的处理过程中要调用这些校准系数。单线制串行接口,使系统集成变得简易快捷。超小的体积、极低的功耗,使其成为该类应用甚至最为苛刻的应用场合的最佳选择。产品为4针单排引脚封装,连接方便。
参数:
供电电压: 3.3~5.5V DC
输 出: 单总线数字信号
测量范围: 湿度20-90%RH, 温度0~50℃
测量精度: 湿度±5%RH, 温度±2℃
分 辨 率: 湿度1%RH, 温度1℃
互 换 性: 可完全互换 ,
长期稳定性: <±1%RH/年
DHT11data数据格式: (高位先出)
一次传输40位数据=8bit湿度整数数据 + 8bit湿度小数数据 + 8bit温度整数数据 + 8bit温度小数数据 + 8bit校验和。
数据传送正确时,校验和数据等于“8bit湿度整数数据+8位湿度小数数据+8bit温度整数数据+8bit温度小数数据”所得结果的末8位。
用户MCU发送一次开始信号后,DHT11从低功耗转换到高速模式,等待主机开始信号结束后,DHT11发送响应信号,送出40bit的数据,并触发一次信号采集,用户可选择读取部分数据,从模式下,DHT11接收到开始信号触发一次温湿度采集,如果没有接收到主机发送开始信号,DHT11不会主动进行温湿度采集,采集数据后转换到低速模式。
数据总时序:
总线空闲状态为高电平,主机把总线拉低等待DHT11响应,主机把总线拉低必须大于18ms,保证DHT11能检测到起始信号。DHT11接收到主机的开始信号后,等待主机开始信号结束,然后发送80μs低电平响应信号。主机发送开始信号结束后,延时等待20~40μs后,读取DHT11的响应信号,主机发送开始信号后,可以切换到输入模式,或者输出高电平均可,总线有上拉电阻拉高。
总线为低电平,说明DHT11发送响应信号,DHT11发送响应信号后,再把总线拉高80μs,准备发送数据,每1bit数据都以50μs低电平时隙开始,高电平的长短决定了数据位是0还是1。格式见下面图示,如果读取响应信号为高电平,则DHT11没有响应,请检查线路是否连接正常。当最后1bit数据传送完毕后,DHT11拉低总线50μs,随后总线由上拉电阻拉高进入空闲状态。
DHT11的总体通信流程:
第一步:主机先发送开始信号,从机会返回一个相应信号进行应答。
第二步:主机信号线拉高准备接收数据。
第三部:开始接收数据(一次接收40位)。
驱动代码:
dht11.h文件内容:
#ifndef __DHT11_H_
#define __DHT11_H_
void Delay1ms(unsigned int xms) ;
void receive();
#endif
dht11.c文件内容:
#include "dht11.h"
#include <stc8.h>
#include <intrins.h>
sbit io = P2^7;
unsigned char RH,RL,TH,TL;
// 提示:根据自己的开发板去修改这些延时,这样才能保证时序的正确,得到想要的数据
// 30us
void Delay30us() //@12.000MHz
{
unsigned char i;
_nop_();
_nop_();
i = 87;
while (--i);
}
// 40us
void Delay40us() //@12.000MHz
{
unsigned char i;
_nop_();
_nop_();
i = 117;
while (--i);
}
// 50us
void Delay50us() //@12.000MHz
{
unsigned char i, j;
i = 1;
j = 146;
do
{
while (--j);
} while (--i);
}
/************** 延时xms毫秒 **************/
void Delay1ms(unsigned int xms) // @12.000MHz
{
unsigned int i, j;
for(i=xms;i>0;i--)
for(j=921;j>0;j--);
}
void start() // 开始信号
{
io=0;
Delay1ms(20); // >18ms
io=1;
Delay30us(); // 20-40us
}
unsigned char receive_byte() // 接收一个字节
{
unsigned char i, data_byte;
for(i=0;i<8;i++)
{
data_byte <<= 1; // 因为先接收的是高位,所以需左移一位 //循环左移
while(!io); // 50us低电平 //每发送一位数据间隔50us低电平
Delay40us(); // 延迟40us高电平
if(io==1) // 判断是0,还是1
{
data_byte=data_byte|0x01;
while(io); // 延时30us高电平,(是1的话,会有70us高电平,上面已经延时40us)
}
else
{
data_byte=data_byte|0x00;
}
}
return data_byte;
}
void receive() // 接收数据
{
unsigned char T_H,T_L,R_H,R_L,check;// T_H存放温度整数部分,T_L存放小数部分
// R_H存放湿度整数部分,R_L存放小数部分,check存放检验
start(); // 开始信号
io=1; // 输入模式
if(!io) // 读取DHT11响应信号
{
while(!io) ; // 80us低电平
while( io) ; // 80us高电平
R_H=receive_byte(); // 接收湿度整数部分
R_L=receive_byte(); // 接收湿度小数部分
T_H=receive_byte(); // 接收温度整数部分
T_L=receive_byte(); // 接收温度小数部分
check=receive_byte(); // 接收校验数据
io=0;
Delay50us(); // 拉低延时50us
io=1;
if(R_H+R_L+T_H+T_L==check) // 判断数据读取是否正确
{
RH=R_H; // 正确,则把湿度整数部分赋给RH
RL=R_L; // 正确,则把湿度小数部分赋给RL
TH=T_H; // 正确,则把温度整数部分赋给TH
TL=T_L; // 正确,则把温度小数部分赋给TL
}
}
}
https://download.csdn.net/download/weixin_43915898/11611065