DHT11 模块的使用

DHT11模块

DHT11模块介绍

DHT11模块  数据线是单线双向
一次完整的数据传输为40bit 高位先出
数据格式:8bit湿度整数数据+8bit湿度小数数据
+8bi温度整数数据+8bit温度小数数据
+8bit校验和
数据传送正确时校验和数据等于“8bit湿度整数数据+8bit湿度小数数据
+8bi温度整数数据+8bit温度小数数据”所得结果的末8位。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

    1.使用推挽模式进行总线的输出
    使用stm32将总线拉低等待DHT11响应,拉低时间大于18ms
    保证检测到起始信号
    2.使用stm32将总线拉高  延时20us~40us  这里选择30us
      读取DHT11的响应信号
   3.切换到输入模式
      3.0 检测DHT11产生低电平
            即使用读取DHT11的输入引脚,当读取到低电平的时候进入
      3.1 DHT11等待主机STM32的开始信号结束完成后发送一个80us的低电平信号
           while(macDHT11_Dout_IN() ==RESET);
           检测引脚的输入信号,当输入信号不是低电平的时候,即响应信号结束的时候,跳出while
      3.2 DHT11发送响应信号后,把总线拉高80us,准备发送数据
      while(macDHT11_Dout_IN() == SET);
      检测引脚的输入信号,当输入信号不是高电平的时候,即标志信号结束的时候,跳出while循环,准备发送数据

进行发送数据,STM32接收发送过来的数据

typedef struct
{
	uint8_t  humi_int;		//湿度的整数部分
	uint8_t  humi_deci;	 	//湿度的小数部分
	uint8_t  temp_int;	 	//温度的整数部分
	uint8_t  temp_deci;	 	//温度的小数部分
	uint8_t  check_sum;	 	//校验和
		                 
} DHT11_Data_TypeDef;

DHT11的数据是MSB先行 高位先行

static uint8_t DHT11_ReadByte ( void )
{
  uint8_t temp;
  
  for(i=0;i<8;i++){
     //等待输入的电平不是低电平 表示开始进行传输数据
     while(macDHT11_Dout_IN()==Bit_RESET);
     /*通过延时40us 进行判断当前是高电平还是低电平
当读取到高电平延时40us后,读取到的还是高电平则表示1,否则表示0并进
入下次循环,再次等待起使电平低电平的时间。*/
     Delay(40);
     //判断当前是低电平还是高电平
     if(macDHT11_Dout_IN()==SET){
         while(macDHT11_Dout_IN()==SET);//等待高电平结束
         temp | =(uint8_t)(0x01<<(7-i));
     }else{
         temp &=(uint8_t)(0x00<<(7-i));
     }
  }
  return temp;
}
 1.使用上面的函数读取5次将DHT11里面的内容读取出来
 2.转换成输出模式,将总线拉高
 3.检查读取到的信息是不是正确信息
 if(DHT11_Data->check_sum == DHT11_Data->humi_int + DHT11_Data->humi_deci + DHT11_Data->temp_int+ DHT11_Data->temp_deci)
 加入校验和等于温度的整数小数和湿度的整数和小数的和则返回success
uint8_t DHT11_Read_TempAndHumidity(DHT11_Data_TypeDef *DHT11_Data)
{  
	/*输出模式*/
	DHT11_Mode_Out_PP();
	/*主机拉低*/
	macDHT11_Dout_0;
	/*延时18ms*/
	Delay_ms(18);

	/*总线拉高 主机延时30us*/
	macDHT11_Dout_1; 

	Delay_us(30);   //延时30us

	/*主机设为输入 判断从机响应信号*/ 
	DHT11_Mode_IPU();

	/*判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行*/   
	if(macDHT11_Dout_IN()==Bit_RESET)     
	{
		/*轮询直到从机发出 的80us 低电平 响应信号结束*/  
		while(macDHT11_Dout_IN()==Bit_RESET);

		/*轮询直到从机发出的 80us 高电平 标置信号结束*/
		while(macDHT11_Dout_IN()==Bit_SET);

		/*开始接收数据*/   
		DHT11_Data->humi_int= DHT11_ReadByte();

		DHT11_Data->humi_deci= DHT11_ReadByte();

		DHT11_Data->temp_int= DHT11_ReadByte();

		DHT11_Data->temp_deci= DHT11_ReadByte();

		DHT11_Data->check_sum= DHT11_ReadByte();


		/*读取结束,引脚改为输出模式*/
		DHT11_Mode_Out_PP();
		/*主机拉高*/
		macDHT11_Dout_1;

		/*检查读取的数据是否正确*/
		if(DHT11_Data->check_sum == DHT11_Data->humi_int + DHT11_Data->humi_deci + DHT11_Data->temp_int+ DHT11_Data->temp_deci)
			return SUCCESS;
		else 
			return ERROR;
	}
	
	else
		return ERROR;
	
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值