【实训六】DHT11数字温湿度传感器

DHT11数字温湿度传感器

前言

1、DHT11概述

DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。校准系数以程序的形式储存在OTP内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。单线制串行接口,使系统集成变得简易快捷。产品为4 针单排引脚封装。

  • DHT11的供电电压为 3-5.5V。传感器上电后,要等待 1s 以越过不稳定状态在此期间无需发送任何指令。电源引脚(VDD,GND)之间可增加一个100nF 的电容,用以去耦滤波。

  • 接口说明:
    在这里插入图片描述

2、串行接口 (单线双向)

DATA 用于微处理器与 DHT11之间的通讯和同步,采用单总线数据格式,一次通讯时间4ms左右,数据分小数部分和整数部分,当前小数部分用于以后扩展,现读出为零。

  • 操作流程如下:一次完整的数据传输为40bit,高位先出。数据格式:8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据+8bit校验和。数据传送正确时校验和数据等于“8bit 湿度整数数据+8bit 湿度小数数据+8bit温度整数数据+8bit 温度小数数据”所得结果的末8位。注:传感器数据输出的是未编码的二进制数据。数据(湿度、温度、整数、小数)之间应该分开处理。如下图所示:
    在这里插入图片描述
  • 用户MCU发送一次开始信号后,DHT11从低功耗模式转换到高速模式,等待主机开始信号结束后,DHT11发送响应信号,送出40bit的数据,并触发一次信号采集,用户可选择读取部分数据。从模式下,DHT11接收到开始信号触发一次温湿度采集,如果没有接收到主机发送开始信号,DHT11不会主动进行温湿度采集。采集数据后转换到低速模式。

(1)通讯过程
图1

  • 总线空闲状态为高电平,主机把总线拉低等待DHT11响应,主机把总线拉低必须大于18毫秒,保证DHT11能检测到起始信号。DHT11接收到主机的开始信号后,等待主机开始信号结束,然后发送80us低电平响应信号。主机发送开始信号结束后,延时等待20-40us后,读取DHT11的响应信号,主机发送开始信号后,可以切换到输入模式,或者输出高电平均可, 总线由上拉电阻拉高。(IO口被配置为开漏输出时,并且输出高电平,那么与浮空输入的特性是一样的)

图2

  • 总线为低电平,说明DHT11发送响应信号,DHT11发送响应信号后,再把总线拉高80us,准备发送数据,每一bit数据都以50us低电平时隙开始,高电平的长短定了数据位是0还是1。格式见下面图示。如果读取响应信号为高电平,则DHT11没有响应,请检查线路是否连接正常。当最后一bit数据传送完毕后,DHT11拉低总线50us,随后总线由上拉电阻拉高进入空闲状态。

  • 数字0信号及数字1信号表示方法,如下图所示:
    在这里插入图片描述

延时50us去读数据线,如果读出来的是高电平那么就是数据1,反之就是数据0。

一、串口打印温湿度

现象:串口助手接收到USART1发送过来的温湿度数据。

步骤:
1、开GPIOB时钟和AFIO时钟。
2、释放PB3(禁止JTAG启用SW)。
3、PB3配置为开漏输出。
4、主机发送开始信号。
5、等待DHT11响应信号。
6、跳过测量时间去读取DHT11输出的数据(一次性需要将40bit全部读出来)。
7、校验(将温度整数数据+小数数据+湿度整数数据+小数数据 与 最低8bit的数据做比较,如果不相等代表数据误差过大,反之数据准确)。

在STM32的中文参考手册中可以发现PB3是JTAG/SWD
复用功能重映射。所以需要使用GPIO_PinRemapConfig函数来改变指定管脚的映射(可查看STM32固件库使用手册了解详情)。

2、编写dht11.c文件。

#include "dht11.h"

//DHT11初始化函数
//DHT11:DATA--PB3
void Dht11_Init(void)
{
	//1、开GPIOB组和AFIO时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO ,ENABLE);
	
	//2、释放PB3(禁止JTAG启用SW)
	GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);//ENABLE使能
	
	//3、初始化IO口。PB3配置为开漏输出
	GPIO_InitTypeDef GPIO_InitStruct;   //定义结构体变量
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_OD;//配置为开漏输出
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;//输出速度为2MHz
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3; //选定管脚PB3
	GPIO_Init(GPIOB,&GPIO_InitStruct);//调用初始化函数
	
	GPIO_WriteBit(GPIOB, GPIO_Pin_3, Bit_SET);//SET高电平;RESET低电平。
	Delay_ms(1000);//延时1秒,越过不稳定状态
	
}

//MCU发送开始信号函数
//4、主机发送开始信号。5、等待DHT11响应信号
void Mcu_Send_Start_Sign(void)
{
	GPIO_WriteBit(GPIOB, GPIO_Pin_3, Bit_RESET);
	Delay_ms(18);//拉低总线18ms以上
	GPIO_WriteBit(GPIOB, GPIO_Pin_3, Bit_SET);//拉高总线,等待DHT11响应
}

//等待DHT11响应函数
//返回值:1-响应失败;0-响应成功
u8 Dht11_Ack(void)
{
	u8 i = 0;
	while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_3) == 1)
	{
		i++;
		Delay_us(1);
		if(i>50)
		{
			return 1;//DHT11响应失败
		}
	}
	
	//代码运行到这里代表DHT11响应成功
	while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_3) == 0);//跳过DHT11响应时间
	while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_3) == 1);//跳过DHT11测量时间
		
	return 0;//代表DHT11响应成功
}

//读取DHT11测到的数据。一次读8位,连续读5次可读完40bit。
u8 Read_Dht11_Data(void)
{
	u8 i,data = 0;
	for(i=0;i<8;i++)
	{
		while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_3) == 0);//跳过数据的1bit低电平开始位
		Delay_us(50);
		data = data<<1;
		if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_3) == 1)//数据1
		{
			data |= 1;
		}
		while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_3) == 1);//跳过数据1的剩余高电平时间
	}
	return data;
}

//读取DHT11数据
u8 Mcu_Control_Dht11(u8 *p)
{
	u8 ret;
	Mcu_Send_Start_Sign();//发送开始信号
	ret = Dht11_Ack();
	if(ret)
	{
		return 1;
	}
	p[0] = Read_Dht11_Data();//湿度整数数据
	p[1] = Read_Dht11_Data();//湿度小数数据
	p[2] = Read_Dht11_Data();//温度整数数据
	p[3] = Read_Dht11_Data();//温度小数数据
	p[4] = Read_Dht11_Data();//8bit校验和
	
	if(p[0]+p[1]+p[2]+p[3] != p[4])
	{
		return 1;//测量失败
	}
	return 0;//测量成功

}

3、编写main.c文件,引用dht11.c文件的温湿度读取函数。

#include "main.h"
int main()
{
	u8 buf1[5];
	u8 ret;
	NVIC_SetPriorityGrouping (7-2);				//分组一般同一个工程只设置一次
	Usart1_Init(115200);
	Dht11_Init();
	while(1)	//死循环
	{
		ret = Mcu_Control_Dht11(buf1);
		if(ret == 0)
		{
			printf("湿度:%d.%d%%\r\n",buf1[0],buf1[1]);
			printf("温度:%d.%d\r\n",buf1[2],buf1[3]);
		}
		Delay_ms(500);
	}
	return 0;
}
  • 3
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

念芯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值