STM32F103 DHT11获取温湿度

本文详细介绍了DHT11数字温湿度传感器的工作原理,包括其测量范围、硬件结构和通讯协议。DHT11使用单总线数据格式进行40bit的数据传输,包含湿度和温度的整数及小数部分,并有校验和。通过MCU与DHT11的交互过程,演示了如何读取和校验传感器数据。此外,还提供了DHT11的C语言实现代码片段。
摘要由CSDN通过智能技术生成

一、DHT11

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

        2、测量范围      

         3、DHT11硬件层

        

        4、DHT11协议层                

        DATA 用于微处理器与 DHT11之间的通讯和同步,采用单总线数据格式,一 次通讯时间4ms左右,数据分小数部分和整数部分。

        一次完整的数据传输为40bit,高位先出

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

 校验和 = 8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据的后8位

         5、通讯时序

        

         1)MCU发送起始信号

        总线空闲状态位高电平,主机把总线电平拉低(至少18Ms),等待DHT11响应。

        数据引脚设置为输出模式

        然后,总线拉高(20~40us)等待DHT11返回响应

        2)读取DHT11响应

        数据引脚设置为输入模式

        当检测到起始信号之后,将总线拉低(80us),再拉高80 us作为响应

        3)DHT11发送40bit的数据

        高位在前的传输     

        DHT数据:信号0/1  判断  保存   校验

        DHT结束信号:从机发送50us的低电平   主机拉高进入空闲状态

0信号判断:发送50us的低电平   发送26-28us高电平

        

1信号判断:发送50us的低电平   发送70us高电平

        

代码:

DHT11.h

#ifndef _DHT11_H_
#define _DHT11_H_


#include "stm32f10x.h"

#define DHT_H  	GPIO_SetBits(GPIOG,GPIO_Pin_11)//高电平
#define DHT_L  	GPIO_ResetBits(GPIOG,GPIO_Pin_11)//低电平

#define DHT_INT GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_11)//

extern uint8_t Tem;
extern uint8_t Hum;

void Dht11_Config(void);
uint8_t Dht11_GetVal(void);


#endif

 DHT11.C

#include "dht11.h"
#include "delay.h"

uint8_t Tem=0;
uint8_t Hum=0;

//PG11

void Gpio_Config(uint8_t flag)
{
    //打开引脚时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG, ENABLE);
	GPIO_InitTypeDef GPIO_InitStructure={0};//定义结构体 
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; //引脚
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度 
	
	if(flag==1)
	  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
	else if(flag==0)
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
	
	GPIO_Init(GPIOG, &GPIO_InitStructure);

}

void Dht11_Config(void)
{
	Gpio_Config(1);//输出模式
	DHT_H;//输出高电平
	Delay_ms(1000);
}


uint8_t Dht11_GetVal(void)
{

	uint8_t num[5] = {0};
	//起始信号
	Gpio_Config(1);
	DHT_L;Delay_ms(25);
	DHT_H;
	//Delay_ms(10);
	
	//检测响应信号
	Gpio_Config(0);
	DHT_Num=0;
	while(DHT_INT==1)
	{
		if(DHT_Num>=100)
			return 0;
	}
	
	DHT_Num=0;
	while(DHT_INT==0)
	{
		if(DHT_Num>=100)
			return 0;
	}
	
	//接收数据
	for(uint8_t i=5;i>0;i--)
	{
		for(uint8_t j=0;j<8;j++)
		{
			//等待54us低电平到来
			DHT_Num=0;
			while(DHT_INT==1)
			{
				if(DHT_Num>=100)
					return 0;
			}
			//等待高电平到来
			DHT_Num=0;
			while(DHT_INT==0)
			{
				if(DHT_Num>=100)
					return 0;
			}
			Delay_us(40);
			
			if(DHT_INT==1)//数据“1”
				num[i-1] |= 0x1<<(7-j);
			else//数据“0”
				num[i-1] &=  ~(0x1<<(7-j));	
		}
	}
	
	Gpio_Config(1);
	DHT_H;	
	//校验
	if(num[4]+num[3]+num[2]+num[1] == num[0])
	{
		Tem = num[2];//整数部分温度
		Hum = num[4];//整数部分湿度
		return 1;
	}
	else
   return 0;
	
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值