STM32--DHT11温湿度模块代码

Humidity.c部分

#include "stm32f10x.h"                  // Device header
#include "Delay.h"                  // Device header

uint16_t i,temperature[5],Flag;
//单总线IO口配置俩种输出模式
void Humidity_Init()//单总线先用推挽输出发送数据
{
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
  
  GPIO_InitTypeDef  GPIO_InitTypeStruct;
    
  GPIO_InitTypeStruct.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_InitTypeStruct.GPIO_Pin  = GPIO_Pin_11 | GPIO_Pin_12;
  GPIO_InitTypeStruct.GPIO_Speed  = GPIO_Speed_50MHz;

  GPIO_Init(GPIOB,&GPIO_InitTypeStruct);

  GPIO_SetBits(GPIOB,GPIO_Pin_11 | GPIO_Pin_12);//默认电平信号高
}

void DHI11_IO_Init()//换成浮空输入 接收数据
{
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
  
  GPIO_InitTypeDef  GPIO_InitTypeStruct;
    
  GPIO_InitTypeStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_InitTypeStruct.GPIO_Pin  = GPIO_Pin_11;
  GPIO_InitTypeStruct.GPIO_Speed  = GPIO_Speed_50MHz;

  GPIO_Init(GPIOB,&GPIO_InitTypeStruct);

  GPIO_SetBits(GPIOB,GPIO_Pin_11);//默认电平信号高
}

int Humidity_Start()
{
  Humidity_Init();
  GPIO_SetBits(GPIOB,GPIO_Pin_11);//拉高信号并且等待响应  
  Delay_us(2);
  GPIO_ResetBits(GPIOB,GPIO_Pin_11);//拉低信号
  Delay_ms(20);
  GPIO_SetBits(GPIOB,GPIO_Pin_11);//拉高信号并且等待响应  
  Delay_us(40);
}

uint16_t Get_DATA()//开始接收
{
  uint16_t Data;
   for(i=0;i<8;++i)//接收一个8bit数据
    {
      while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11) == 0);//等待低电平
      Delay_us(40);
      Data<<=1;//数据左移
      if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11) == 1)//此时检测到高电平就是1否则0
      Data|=0X01;
      while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11) == 1);//等待高电平过去
    }
  return Data;

}

uint16_t receive_data()
{
 Humidity_Start();    
 DHI11_IO_Init();
 if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11) == 0)
 {
  while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11) == 0);//主机发出信号之后DHT会响应先低电平然后高电平
  while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11) == 1);//这个时候得先while循环将这个时间段过去
     temperature[0] = Get_DATA();
     temperature[1] = Get_DATA();
     temperature[2] = Get_DATA();
     temperature[3] = Get_DATA();    
     temperature[4] = Get_DATA();
     Delay_us(50);

      GPIO_ResetBits(GPIOB,GPIO_Pin_11);//拉低信号
      Delay_us(50);
      GPIO_SetBits(GPIOB,GPIO_Pin_11);//拉高信号并且等待响应   
     
  if(temperature[0]+ temperature[1]+ temperature[2]+ temperature[3] == temperature[4])
   {
    Flag=1;GPIO_ResetBits(GPIOB,GPIO_Pin_12);//拉低信号
   }  
 }
}

uint16_t Get_temperature()
{
  return  temperature[0] +  temperature[1];
}

uint16_t Get_Humidity()
{
  return  temperature[2] + temperature[3];
}

Humidity.h部分

#ifndef __HUMIDITY_H
#define __HUMIDITY_H

uint16_t Get_temperature();
uint16_t Get_Humidity();
void Humidity_Init();
int Humidity_Start();
uint16_t receive_data();    
#endif
Mian函数的部分

#include "stm32f10x.h"                  // Device header
#include "OLED.h"                  // Device header
#include "Humidity.h"                  // Device header

uint16_t Humidity,Temperature;

int main(void)
{
    
  OLED_Init();
  OLED_ShowChar(1,1,'A');
    while(1)
    {
      receive_data();
      Temperature = Get_temperature();
      Humidity = Get_Humidity();
      OLED_ShowNum(1,4,Temperature,4);
      OLED_ShowNum(2,4,Humidity,4);
    }
}

大问题没有,小问题可能存在

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值