找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 12226|回复: 41
收起左侧

注释很详细的STM32+DHT11温湿度监测源程序

  [复制链接]
回帖奖励 2 黑币 回复本帖可获得 2 黑币奖励! 每人限 1 次
ID:719754 发表于 2021-3-25 13:21 | 显示全部楼层 |阅读模式
单片机源程序如下(代码注释非常详细):
#include "dht11.h"  //导入头文件dht11.h  

static void DHT11_Input(void);  //声明static函数DHT11_Input,用于配置DHT11的引脚为输入模式  
static void DHT11_Output(void); //声明static函数DHT11_Output,用于配置DHT11的引脚为输出模式  

/*定义全局变量,分别用于统计湿度高位;湿度低位;温度高位;温度低位*/  
u8 DHT11_hem_high,DHT11_hem_low,DHT11_temp_high,DHT11_temp_low;   

static void DHT11_Input(void) //设置DHT11数据引脚的输入模式的配置  
{  
  GPIO_InitTypeDef GPIO_InitStructure;  
  RCC_APB2PeriphClockCmd(DHT11_RCC,ENABLE);  //开启GPIOD的时钟  

  GPIO_InitStructure.GPIO_Pin = DHT11_PIN;  //设置引脚
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  //速率50MHz  
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //配置输入模式为上拉输入模式  

  GPIO_Init(DHT11_GPIO, &GPIO_InitStructure);//把上面的配置初始化  
}  

static void DHT11_Output(void)//设置DHT11数据引脚的输出模式的配置  
{  
  GPIO_InitTypeDef GPIO_InitStructure;  
  RCC_APB2PeriphClockCmd(DHT11_RCC,ENABLE);//开启GPIOD时钟  

  GPIO_InitStructure.GPIO_Pin = DHT11_PIN;//设置引脚  
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//配置为推挽输出  

  GPIO_Init(DHT11_GPIO, &GPIO_InitStructure);//初始化  
}  

/*从这里开始就根据DHT11使用说明的流程进行,确保万无一失*/  

void DHT11_Start(void)//DHT11的开始程序  
{  
  delay_init();//调用Systick,开启  
  DHT11_Output();//设置为输出模式  
  DHT11_hem_high   = 0;  
  DHT11_hem_low    = 0;  
  DHT11_temp_high  = 0;  
  DHT11_temp_low   = 0;  
}  

u16 DHT11_ReadByte(void)//读取DHT11每个字节的函数  
{  
  u8 temp=0,i,cout;//三个变量的含义(1)temp用于储存数据(2)i表示字节的位数(3)cout用于保证执行条件或函数  
  DHT11_Input();  
  for(i=0;i<8;i++)//这个for循环的意义就是依次读8位字节,所以只执行8次,  
  {  
    cout=1;//确保执行while  
    while(!DHT11_ReadBit() && cout++);//当 [读取到PB3的电平不为1 且 cout++都为真] 的条件下执行循环,否则跳出循环  
    delay_us(30);//延时30us,再读取PB3的状态  
    temp = temp << 1;//表示把上次的temp的值左移一位,因为DHT11读取的数据是先出高值再出低值,  
    if(DHT11_ReadBit() == Bit_SET)//如果 [ 读取到PB3的电平等于Bit_SET的值 为真 ] ,则执行表达式  
    {  
      temp |=1; //temp=temp|1,进行或运算,有1得1  
    }  

    //等待输出的电平为低电平,进入下一位数据接收  
    cout=1;  
    while(DHT11_ReadBit() && cout++);  
  }  
  return temp;//返回接收到的temp  
}  

u16 DHT11_ReadData(int *shidu,int *wendu)//读取DHT11的数据,把读取到的自己整合  
{  
  u16 cout = 1;//用于保证语句执行的变量  
  u16 temp_high,temp_low,hem_high,hem_low,Check;//用于整合字节的变量,分别是温度高位,温度低位,湿度高位,湿度低位,校验和  

  DHT11_Output();//把引脚切换为输出模式  

  DHT11_ResetBit();//拉低引脚电平,就是输出高电平  
  delay_ms(20);//持续20ms,数据手册上说要至少拉低18ms,保证DHT11能够检测到起始信号  
  DHT11_SetBit();//抬高引脚的电平;也就是输出低电平  
  delay_us(40);//持续30us,数据手册上说的区间是20-40us  

  DHT11_Input();//设置PB3为输入模式  

  /* 如果MCU采集到PE13的数据输入是低电平的话则执行表达式 */  
  if(DHT11_ReadBit() == Bit_RESET)  
  {  
    cout = 1;//低电平响应信号,等待DHT11响应完毕  
    while(!DHT11_ReadBit() && cout++);  

    cout = 1;//高电平传输数据,等待DHT11传输完毕,持续26us - 28us表示的是0;持续70us表示的是1  
    while(DHT11_ReadBit() && cout++);  

    /*开始按顺序接收DHT11的回传数据*/  
    /*根据DHT11的使用说明一共会接收5个字节的数据*/  

    hem_high = DHT11_ReadByte();//第一个接收到的是湿度的高八位,温度整数数据  
    hem_low  = DHT11_ReadByte();//第二个接收到的是湿度的低八位,温度小数数据  
    temp_high  = DHT11_ReadByte();//第三个接受到的是温度的高八位,湿度整数数据  
    temp_low   = DHT11_ReadByte();//第四个接收到的是温度的低八位,湿度小数数据  
    Check = DHT11_ReadByte();//最后接收到的是前四位的和,用于校验,确保精度  

    if(Check == ( temp_high + temp_low + hem_high + hem_low ))//校验和.如果前4个字节加起来的和等于Check  
    {  
      *shidu= hem_high;//写入湿度整数变量  
//      DHT11_hem_low = hem_low;//写入湿度小数变量  
      *wendu= temp_high;//写入温度整数变量  
//      DHT11_temp_low  = temp_low;//写入温度小数变量  

      return 1;//返回1,确保有效,表示成功采集一次数据  
    }  
    else  
    {  
      return 0;//若不正确,否则返回0,表示未成功采集数据  
    }  
  }  
  return 0;  
}  

u16 DHT11_GetTemp(void) //获取温度值  
{  
  /*  这句话的意思是 */  
  /* [把DHT11_temp_high左移8位] 再与[DHT11_temp_low]进行 或运算,有1得1   */  
  /* 因为DHT11只能采集整数数据,所以做了或运算后还是原先采集到的整数数据 */  

  return(DHT11_temp_high <<8 | DHT11_temp_low);  
}  

u16 DHT11_GetHem(void)//获取湿度值  
{  
  /* [把DHT11_hem_high左移8位] 再与[DHT11_hem_low]进行 或运算,有1得1   */  
  return(DHT11_hem_high <<8 | DHT11_hem_low);  
}

全部代码51hei下载地址:
STM32F103C8T6.7z (200.94 KB, 下载次数: 457)

评分

参与人数 2黑币 +60 收起 理由
嘻嘻417 + 10 赞一个!
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:897278 发表于 2021-4-7 14:44 | 显示全部楼层
有没有stm32F407的样例,我的一直找不错误,程序没有报错,温湿度就是显示不出来
回复

使用道具 举报

ID:915371 发表于 2021-5-3 21:05 | 显示全部楼层
感谢,急需DHT11+STM32L431的程序和接线
回复

使用道具 举报

ID:887371 发表于 2021-5-6 11:34 | 显示全部楼层
楼主提供的就是STM32的代码。
stm32F407 STM32L431可以直接拿来用。
其它类型单片机,只需要改写少数几个函数就行。
DHT11_Input()
DHT11_Output()
DHT11_ResetBit()
DHT11_SetBit()
DHT11_ReadBit()
给个51的改写示范。
  1. /*
  2. P00接DHT11
  3. 准双向不用配置输入输出
  4. */
  5. #define DHT11_PIN P00
  6. #define DHT11_Input()
  7. #define DHT11_Output()
  8. #define DHT11_ResetBit() DHT11_PIN=0
  9. #define DHT11_SetBit() DHT11_PIN=1
  10. #define DHT11_ReadBit() DHT11_PIN?1:0
复制代码

回复

使用道具 举报

ID:887371 发表于 2021-5-6 11:37 | 显示全部楼层
最后一个定义不严谨。应该如下

#define DHT11_ReadBit() (DHT11_PIN?1:0)
回复

使用道具 举报

ID:920286 发表于 2021-5-12 21:00 | 显示全部楼层
非常不错,很严谨
回复

使用道具 举报

ID:790875 发表于 2021-5-26 15:23 | 显示全部楼层
非常不错,很严谨 正是我所需要的
回复

使用道具 举报

8#
无效楼层,该帖已经被删除
9#
无效楼层,该帖已经被删除
10#
无效楼层,该帖已经被删除
ID:966442 发表于 2021-12-21 16:14 | 显示全部楼层
为什么要配置输入输出啊,不能用write和read吗
回复

使用道具 举报

12#
无效楼层,该帖已经被删除
13#
无效楼层,该帖已经被删除
ID:995631 发表于 2021-12-22 13:45 | 显示全部楼层
感谢,严谨又实用。
回复

使用道具 举报

15#
无效楼层,该帖已经被删除
16#
无效楼层,该帖已经被删除
ID:983641 发表于 2022-2-18 12:51 | 显示全部楼层
有超温报警功能没?
回复

使用道具 举报

18#
无效楼层,该帖已经被删除
19#
无效楼层,该帖已经被删除
ID:855598 发表于 2022-3-11 09:56 | 显示全部楼层
感谢,有报警功能没?
回复

使用道具 举报

ID:1013770 发表于 2022-3-28 17:46 | 显示全部楼层
非常不错,很严谨
回复

使用道具 举报

22#
无效楼层,该帖已经被删除
23#
无效楼层,该帖已经被删除
24#
无效楼层,该帖已经被删除
ID:151846 发表于 2022-4-30 15:25 | 显示全部楼层
这个刚刚需要,准备下载来用
回复

使用道具 举报

ID:1017814 发表于 2022-4-30 20:08 | 显示全部楼层
不是说STM32的程序要很多文件吗?

比如dht.h dht.c main.c 等等
回复

使用道具 举报

27#
无效楼层,该帖已经被删除
ID:493026 发表于 2022-5-1 16:49 | 显示全部楼层
不错,很详细!
回复

使用道具 举报

ID:941054 发表于 2022-5-17 11:25 | 显示全部楼层
这是STM32Cubxmx的工程吗

回复

使用道具 举报

ID:895513 发表于 2022-5-29 09:26 | 显示全部楼层
这个刚刚需要,准备下载来用
回复

使用道具 举报

ID:1018739 发表于 2022-5-30 20:16 | 显示全部楼层
感谢,写的很详细
回复

使用道具 举报

32#
无效楼层,该帖已经被删除
ID:909250 发表于 2022-5-31 08:51 | 显示全部楼层
程序非常好用
回复

使用道具 举报

ID:987949 发表于 2022-6-9 09:59 | 显示全部楼层
分步调试,功能模块诸葛调试检查错误
回复

使用道具 举报

ID:941981 发表于 2022-6-21 22:30 | 显示全部楼层
正好学习用上了,感谢
回复

使用道具 举报

36#
无效楼层,该帖已经被删除
ID:1037201 发表于 2022-6-27 13:59 | 显示全部楼层
写得很不错
回复

使用道具 举报

ID:843232 发表于 2022-6-28 10:51 | 显示全部楼层
资料很棒,非常感谢
回复

使用道具 举报

39#
无效楼层,该帖已经被删除
ID:1038570 发表于 2022-7-6 14:20 | 显示全部楼层
不错 很严谨
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表