DHT11温湿度传感器

#DHT11温湿度传感器
超级简单
看看实物:请添加图片描述
DHT有四个脚:
在这里插入图片描述
一般的电路就是把DATA拉高:(上拉电阻要求不大,4.7K、5K、10K都能用)
请添加图片描述
直接上程序(hal库,IO直接在.h文件里面配就行)我直接把网上的改了一下拿过来用了

//DHT11.c
#include "dht11.h"

uint8_t Data[5]={0x00,0x00,0x00,0x00,0x00};   //Data存储读取的温湿度信息
//extern uint8_t Data[5];
//Data[0]湿度Data[2]温度Data[4]和     Data[1]和Data[3]温度和湿度的小数部分,常规为0
//对于stm32f1系列 72mhz大致是1ms
void Delay_ms(uint32_t ms)
{
		uint16_t i = 0;
		while(ms--)
		{
			i = 4050;
			while(i--);
		};
}
void Delay_us(uint32_t us)
{
		uint16_t i = 0;
		while(us--)
		{
			i = 2;
			while(i--);
		}
}
/*//对于stm32f4系列 168mhz大致是1us
void my_delay_us(u32 us)
{
		u8 i = 0;
		while(us--)
		{
			i = 42;
			while(i--);
		};
}
 
void delay_ms(u32 ms)
{
		u16 i = 0;
		while(ms--)
		{
			i = 41750;
			while(i--);
		};

}*/
void DHT_GPIO_SET_OUTPUT(void)     //设置GPIOx为输出模式(MCU的IO口向DHT11发激活信号)
{
	GPIO_InitTypeDef GPIO_InitStructure;    //在GPIO_InitTypeDef结构体中修改IO口参数(结构体成员)
	GPIO_InitStructure.Pin=DHT11_PIN;      //设置的格式必须严格遵循注释,比如GPIO_PIN_define
	GPIO_InitStructure.Mode=GPIO_MODE_OUTPUT_PP;
//	GPIO_InitStructure.Pull=;
	GPIO_InitStructure.Speed=GPIO_SPEED_FREQ_HIGH;
	HAL_GPIO_Init(DHT11_IO,&GPIO_InitStructure);
}

void DHT_GPIO_SET_INPUT(void)     //设置GPIOx为输入模式(DHT11向MUC的IO发电平信号,信号里包含了温湿度信息)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.Pin=DHT11_PIN;
	GPIO_InitStructure.Mode=GPIO_MODE_INPUT;
	GPIO_InitStructure.Speed=GPIO_SPEED_FREQ_HIGH;
	HAL_GPIO_Init(DHT11_IO,&GPIO_InitStructure);
}

/*------------------------------*/

/*
     uint8_t DHT_Read_Byte(void)用于转译采集DHT11发送给IO口的电平信号(8位)。
*/
uint8_t DHT_Read_Byte(void)  //从DHT11读取一位(8字节)信号
{
	 uint8_t ReadData=0;  //ReadData用于存放8bit数据,即8个单次读取的1bit数据的组合
	 uint8_t temp;      //临时存放信号电平(0或1)
	 uint8_t retry=0;   //retry用于防止卡死
	 uint8_t i;    
	 for(i=0; i<8; i++)   //一次温湿度信号读取八位
	 {
			while(HAL_GPIO_ReadPin(DHT11_IO,DHT11_PIN)==0 && retry<100)  
			//等待直到DHT11输出高电平:当PA5=1,上升沿,表示开始接受数据,可以判断0 or 1,跳出循环,执行后续判断(若PA5=0,将一直循环等待)
			{
					Delay_us(1);
				  retry++;             //retry防止PA5读取不到数据卡死在这一步,当经历100us后retry自增到100,跳出循环。
			}
			retry=0;
			
			Delay_us(40);    //延时30us
			//根据时序图,DHT传回高电平信号维持26us~28us表示0,	维持70us表示1
		  //延时30us后,如果IO读取到仍是高电平,说明采集到1;如果IO读取到低电平,说明采集到0
			//读取电平信号暂存temp内,随后会压入ReadData中
			if(HAL_GPIO_ReadPin(DHT11_IO,DHT11_PIN)==1)   temp=1;
			 else   temp=0;

			 while(HAL_GPIO_ReadPin(DHT11_IO,DHT11_PIN)==1 && retry<100)
			//等待直到DHT11输出低电平,表示退出。本轮1bit信号接收完毕。
			 {
				 Delay_us(1);
				 retry++;
			 }
			 retry=0;
			 
			 ReadData<<=1;    //ReadData内信号先全部左移一位,空出末尾位置
			 ReadData |= temp;        //将temp写入ReadData
	 }

		return ReadData;
}

/*
     uint8_t DHT_Read(void)表达完整时序
*/
uint8_t DHT_Read(void)
{
	 uint8_t retry=0;
	 uint8_t i;
		
	 DHT_GPIO_SET_OUTPUT();    //IO设置为输出模式。在传输的最开始,MCU要向DHT11发送信号
	 HAL_GPIO_WritePin(DHT11_IO,DHT11_PIN,GPIO_PIN_RESET);   //IO->DHT11:先拉低电平18ms(应时序要求)
	 HAL_Delay(18);
	 HAL_GPIO_WritePin(DHT11_IO,DHT11_PIN,GPIO_PIN_SET);   //IO->DHT11:随后拉高电平20us
	 Delay_us(20);
	
	//MCU通过IO向DHT11发送请求完毕。接下来DHT11向IO发送响应,IO转为输入模式。在这之后就开始信号的转译读取。
	DHT_GPIO_SET_INPUT();
	Delay_us(20);
	if(HAL_GPIO_ReadPin(DHT11_IO,DHT11_PIN)==0) //DHT11发回低电平响应(读取到低电平,说明DHT11有响应)
	{
		//接下来,DHT11拉低电平一段时间后拉高电平一段时间
		while(HAL_GPIO_ReadPin(DHT11_IO,DHT11_PIN)==0 && retry<100)  
		{
		   Delay_us(1);
			 retry++;
		}
		retry=0;
		while(HAL_GPIO_ReadPin(DHT11_IO,DHT11_PIN)==1 && retry<100) 
		{
		   Delay_us(1);
			 retry++;
		}
		retry=0;
		
		//一共传输40位,一次DHT_Read_Byte返回8位,共读取5次。存储在Data[]中。(Data[]定义为全局)
		for(i=0; i<5; i++)
		{
			 Data[i] = DHT_Read_Byte();  //每次读取一字节(8位)
		}
		Delay_us(50);
		//说明:Data[0]湿度, Data[2]温度。Data[1]和Data[3]分别为0和2的小数位。Data[4]用于校验。
	}
	 uint32_t sum=Data[0]+Data[1]+Data[2]+Data[3];  //校验
	 if((sum)==Data[4])    return 1;  
	   else   return 0;
}
//DHT11.h
#ifndef __DHT11_H
#define __DHT11_H
#include "stm32f1xx.h"

#define DHT11_IO 		GPIOA
#define DHT11_PIN		GPIO_PIN_5

uint8_t DHT_Read_Byte(void);
uint8_t DHT_Read(void);
void Delay_us(uint32_t us);//延时us粗
void Delay_ms(uint32_t ms);//延时ms粗
void DHT_GPIO_SET_OUTPUT(void);
void DHT_GPIO_SET_INPUT(void);
#endif
/*main.c程序里面只需要加上*/
#include "dht11.h"
extern uint8_t Data[5];
然后读温湿度
if(DHT_Read())//验证
{
	printf("湿度:%d\r\n温度:%d\r\n",Data[0],Data[2]);
	//直接读Data[0]湿度
	//直接读Data[2]温度
}



  • 0
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小菜汪的逆袭

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

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

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

打赏作者

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

抵扣说明:

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

余额充值