学习笔记 DHT11的驱动设计

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的驱动设计_第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的驱动函数,通过个人验证实践验证确定驱动函数无误,在学习中发现传感器无非三种,只要多接触传感器,多进行程序编写,就能提高自己的编程能力!

你可能感兴趣的:(C语言,stm32,嵌入式,传感器)