DHT11产品概述
DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传
感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高
的可靠性与卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测
温元件,并与一个高性能8位单片机相连接。因此该产品具有品质卓越、超快
响应、抗干扰能力强、性价比极高等优点。每个DHT11传感器都在极为精确的
湿度校验室中进行校准。校准系数以程序的形式储存在OTP内存中,传感器内
部在检测信号的处理过程中要调用这些校准系数。单线制串行接口,使系统集
成变得简易快捷。超小的体积、极低的功耗,信号传输距离可达20米以上,使
其成为各类应用甚至最为苛刻的应用场合的最佳选则。产品为 4 针单排引脚
封装。连接方便,特殊封装形式可根据用户需求而提供。
DHT11的传输模式
通过查阅资料DHT11为串行接通(单线双向)DATA 用于微处理器与 DHT11之间的通讯和同步,采用单总线数据格式,一次通讯时间4ms左右,数据分小数部分和整数部分,具体格式在下面说明,当前小数部分用于以后扩展,现读出为零.操作流程如下:一次完整的数据传输为40bit,高位先出。数据格式:8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据 +8bit校验和数据传送正确时校验和数据等于“8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据”所得结果的末8位。用户MCU发送一次开始信号后,DHT11从低功耗模式转换到高速模式,等待主机开始信号结束后,DHT11发送响应信号,送出40bit的数据,并触发一次信号采集,用户可选择读取部分数据.从模式下,DHT11接收到开始信号触发一次温湿度采集,如果没有接收到主机发送开始信号,DHT11不会主动进行温湿度采集.采集数据后转换到低速模式。
1.通讯过程如图1所示
由图和原理可以写出DHT11的驱动启动函数:
u8 DHT11_Start(void)
{
//初始化引脚
GPIO_InitTypeDef GPIO_InitStructure;
u8 test_cnt=0;
GPIO_InitStructure.GPIO_Pin= GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_2MHz;
GPIO_Init(GPIOC,&GPIO_InitStructure);
GPIO_ResetBits(GPIOC,GPIO_Pin_10);
delay_ms(20);
GPIO_SetBits(GPIOC,GPIO_Pin_10);
delay_us(50);
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
GPIO_Init(GPIOC,&GPIO_InitStructure);
if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_10))
{
//说明传感器模块未连接或者已损坏
return 1;
}
//等待响应信号结束
test_cnt=100;
while(!GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_10) && --test_cnt)
{
delay_us(1);
}
//如果 test_cnt 为0 说明DHT11模块响应超时
if(test_cnt==0)
{
return 2;
}
delay_us(85);
return 0;
}
DHT11的获取数据函数:
u8 DHT11_Recv_Bit(void)
{
u8 test_cnt,ret;
//每一位数据都是以50us的低电平开始
test_cnt=70;
while(!GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_10) && --test_cnt)
{
delay_us(1);
}
//如果 test_cnt 为0 说明DHT11模块响应超时
if(test_cnt==0)
{
return 2;
}
//延时40us
delay_us(40);
ret= (GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_10));
if(ret==1)
{
//如果接收到数字1,就延时50us
delay_us(50);
}
return ret;
}
u8 DHT11_Get(u8* temp,u8* humi)
{
u8 data[5] = {0},ret,i,j,sum=0;
ret= DHT11_Start();
if(ret) return 1;
for(i=0;i<5;i++)
{
for(j=0;j<8;j++)
{
ret=DHT11_Recv_Bit();
if(ret==2) return 2;//接受过程失败
data[i] |= (ret << (7-j));
}
}
//计算校验和
for(i=0;i<4;i++)
{
sum += data[i];
}
//根据校验和判断本次采集的数据是否有效
if(sum==data[4])
{
//校验有效
*temp=data[2];
*humi=data[0];
return 0;
}
else
{
//校验失败
return 3;
}
}
总结:
个人通过查阅数据手册,写出hit11的驱动函数,通过个人验证实践验证确定驱动函数无误,在学习中发现传感器无非三种,只要多接触传感器,多进行程序编写,就能提高自己的编程能力!