微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 第072例: OneWire_DHT11温湿度传感器

第072例: OneWire_DHT11温湿度传感器

时间:10-02 整理:3721RD 点击:
【HAL库每天一例】系列例程从今天开始持续更新。
我们将坚持每天至少发布一个基于YS-F1Pro开发板的HAL库例程,
该系列例程将带领大家从零开始使用HAL库,后面会持续添加模块应用例程。
同样的,我们还程序发布基于HAL库的指导文档和视频教程,欢迎持续关注,并提出改进意见。
例程下载:
资料包括程序、相关说明资料以及软件使用截图
百度云链接:http://pan.baidu.com/s/1i574oPv
密码:r3s3

(硬石YS-F1Pro开发板HAL库例程持续更新\2. 软件设计之高级裸机例程(HAL库版本)\YSF1_HAL-105. OneWire_DHT11温湿度传感器)
/**
  ******************************************************************************
  *                           硬石YS-F1Pro开发板例程功能说明
  *
  *  例程名称: YSF1_HAL-105. OneWire_DHT11温湿度传感器
  *   
  ******************************************************************************
  * 说明:
  * 本例程配套硬石stm32开发板YS-F1Pro使用。
  *
  * 淘宝:
  * 论坛:硬石电子社区
  * 版权归硬石嵌入式开发团队所有,请勿商用。
  ******************************************************************************
  */
【1】例程简介
  DHT11温湿度传感器
【2】跳线帽情况
******* 为保证例程正常运行,必须插入以下跳线帽 **********
丝印编号     IO端口      目标功能引脚        出厂默认设置
  JP1        PA10        TXD(CH340G)          已接入
  JP2        PA9         RXD(CH340G)          已接入
  JP6        PD3         AM2303/DS18B20       已接入
  
【3】操作及现象
  将DHT11温湿度传感器插入到开发板上的U13接口上,使用开发板配套的MINI USB线连接到开
发板标示“调试串口”字样的MIMI USB接口(需要安装驱动),在电脑端打开串口调试助手工
具,设置参数为115200 8-N-1。下载完程序之后,在串口调试助手窗口可接收到信息。
/******************* (C) COPYRIGHT 2015-2020 硬石嵌入式开发团队 *****END OF FILE****/







bsp_DHT11.h文件内容

  1. #ifndef __ONEWIRE_DHT11_H__
  2. #define        __ONEWIRE_DHT11_H__

  3. /* 包含头文件 ----------------------------------------------------------------*/
  4. #include "stm32f1xx_hal.h"

  5. /* 类型定义 ------------------------------------------------------------------*/
  6. /************************ DHT11 数据类型定义******************************/
  7. typedef struct
  8. {
  9.         uint8_t  humi_high8bit;                //原始数据:湿度高8位
  10.         uint8_t  humi_low8bit;                 //原始数据:湿度低8位
  11.         uint8_t  temp_high8bit;                 //原始数据:温度高8位
  12.         uint8_t  temp_low8bit;                 //原始数据:温度高8位
  13.         uint8_t  check_sum;                     //校验和
  14.   float    humidity;        //实际湿度
  15.   float    temperature;     //实际温度  
  16. } DHT11_Data_TypeDef;

  17. /* 宏定义 -------------------------------------------------------------------*/
  18. /***********************   DHT11 连接引脚定义  **************************/
  19. #define DHT11_Dout_GPIO_CLK_ENABLE()              __HAL_RCC_GPIOD_CLK_ENABLE()
  20. #define DHT11_Dout_PORT                           GPIOD
  21. #define DHT11_Dout_PIN                            GPIO_PIN_3

  22. /***********************   DHT11 函数宏定义  ****************************/
  23. #define DHT11_Dout_LOW()                          HAL_GPIO_WritePin(DHT11_Dout_PORT,DHT11_Dout_PIN,GPIO_PIN_RESET)
  24. #define DHT11_Dout_HIGH()                         HAL_GPIO_WritePin(DHT11_Dout_PORT,DHT11_Dout_PIN,GPIO_PIN_SET)
  25. #define DHT11_Data_IN()                                  HAL_GPIO_ReadPin(DHT11_Dout_PORT,DHT11_Dout_PIN)

  26. /* 扩展变量 ------------------------------------------------------------------*/
  27. /* 函数声明 ------------------------------------------------------------------*/
  28. void DHT11_Init( void );
  29. uint8_t DHT11_Read_TempAndHumidity(DHT11_Data_TypeDef * DHT11_Data);

  30. #endif /* __ONEWIRE_DHT11_H__ */
  31. /******************* (C) COPYRIGHT 2015-2020 硬石嵌入式开发团队 *****END OF FILE****/

复制代码

bsp_DHT11.c文件内容

  1. /**
  2.   ******************************************************************************
  3.   * 文件名程: bsp_DHT11.c
  4.   * 作    者: 硬石嵌入式开发团队
  5.   * 版    本: V1.0
  6.   * 编写日期: 2015-10-04
  7.   * 功    能: DHT11温湿度传感器底层驱动程序
  8.   ******************************************************************************
  9.   * 说明:
  10.   * 本例程配套硬石stm32开发板YS-F1Pro使用。
  11.   *
  12.   * 淘宝:
  13.   * 论坛:http://www.ing10bbs.com
  14.   * 版权归硬石嵌入式开发团队所有,请勿商用。
  15.   ******************************************************************************
  16.   */
  17. /* 包含头文件 ----------------------------------------------------------------*/
  18. #include "DHT11/bsp_DHT11.h"

  19. /* 私有类型定义 --------------------------------------------------------------*/
  20. /* 私有宏定义 ----------------------------------------------------------------*/
  21. #define Delay_ms(x)   HAL_Delay(x)
  22. /* 私有变量 ------------------------------------------------------------------*/
  23. /* 扩展变量 ------------------------------------------------------------------*/
  24. /* 私有函数原形 --------------------------------------------------------------*/
  25. static void DHT11_Mode_IPU(void);
  26. static void DHT11_Mode_Out_PP(void);
  27. static uint8_t DHT11_ReadByte(void);

  28. /* 函数体 --------------------------------------------------------------------*/
  29. /**
  30.   * 函数功能:
  31.   * 输入参数: 无
  32.   * 返 回 值: 无
  33.   * 说    明:无
  34.   */
  35. static void DHT11_Delay(uint16_t time)
  36. {
  37.         uint8_t i;

  38.   while(time)
  39.   {   
  40.           for (i = 0; i < 10; i++)
  41.     {
  42.       
  43.     }
  44.     time--;
  45.   }
  46. }

  47. /**
  48.   * 函数功能: DHT11 初始化函数
  49.   * 输入参数: 无
  50.   * 返 回 值: 无
  51.   * 说    明:无
  52.   */
  53. void DHT11_Init ( void )
  54. {
  55.   DHT11_Dout_GPIO_CLK_ENABLE();
  56.   
  57.         DHT11_Mode_Out_PP();
  58.         
  59.         DHT11_Dout_HIGH();  // 拉高GPIO
  60. }

  61. /**
  62.   * 函数功能: 使DHT11-DATA引脚变为上拉输入模式
  63.   * 输入参数: 无
  64.   * 返 回 值: 无
  65.   * 说    明:无
  66.   */
  67. static void DHT11_Mode_IPU(void)
  68. {
  69.   GPIO_InitTypeDef GPIO_InitStruct;
  70.   
  71.   /* 串口外设功能GPIO配置 */
  72.   GPIO_InitStruct.Pin   = DHT11_Dout_PIN;
  73.   GPIO_InitStruct.Mode  = GPIO_MODE_INPUT;
  74.   GPIO_InitStruct.Pull  = GPIO_PULLUP;
  75.   HAL_GPIO_Init(DHT11_Dout_PORT, &GPIO_InitStruct);
  76.         
  77. }

  78. /**
  79.   * 函数功能: 使DHT11-DATA引脚变为推挽输出模式
  80.   * 输入参数: 无
  81.   * 返 回 值: 无
  82.   * 说    明:无
  83.   */
  84. static void DHT11_Mode_Out_PP(void)
  85. {
  86.   GPIO_InitTypeDef GPIO_InitStruct;
  87.   
  88.   /* 串口外设功能GPIO配置 */
  89.   GPIO_InitStruct.Pin = DHT11_Dout_PIN;
  90.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  91.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  92.   HAL_GPIO_Init(DHT11_Dout_PORT, &GPIO_InitStruct);         
  93. }

  94. /**
  95.   * 函数功能: 从DHT11读取一个字节,MSB先行
  96.   * 输入参数: 无
  97.   * 返 回 值: 无
  98.   * 说    明:无
  99.   */
  100. static uint8_t DHT11_ReadByte ( void )
  101. {
  102.         uint8_t i, temp=0;
  103.         

  104.         for(i=0;i<8;i++)   
  105.         {         
  106.                 /*每bit以50us低电平标置开始,轮询直到从机发出 的50us 低电平 结束*/  
  107.                 while(DHT11_Data_IN()==GPIO_PIN_RESET);

  108.                 /*DHT11 以26~28us的高电平表示“0”,以70us高电平表示“1”,
  109.                  *通过检测 x us后的电平即可区别这两个状 ,x 即下面的延时
  110.                  */
  111.                 DHT11_Delay(40); //延时x us 这个延时需要大于数据0持续的时间即可                     

  112.                 if(DHT11_Data_IN()==GPIO_PIN_SET)/* x us后仍为高电平表示数据“1” */
  113.                 {
  114.                         /* 等待数据1的高电平结束 */
  115.                         while(DHT11_Data_IN()==GPIO_PIN_SET);

  116.                         temp|=(uint8_t)(0x01<<(7-i));  //把第7-i位置1,MSB先行
  117.                 }
  118.                 else         // x us后为低电平表示数据“0”
  119.                 {                           
  120.                         temp&=(uint8_t)~(0x01<<(7-i)); //把第7-i位置0,MSB先行
  121.                 }
  122.         }
  123.         return temp;
  124. }


  125. /*
  126. *
  127. *
  128. */
  129. /**
  130.   * 函数功能: 一次完整的数据传输为40bit,高位先出
  131.   * 输入参数: DHT11_Data:DHT11数据类型
  132.   * 返 回 值: ERROR:  读取出错
  133.   *           SUCCESS:读取成功
  134.   * 说    明:8bit 湿度整数 + 8bit 湿度小数 + 8bit 温度整数 + 8bit 温度小数 + 8bit 校验和
  135.   */
  136. uint8_t DHT11_Read_TempAndHumidity(DHT11_Data_TypeDef *DHT11_Data)
  137. {  
  138.   uint8_t temp;
  139.   uint16_t humi_temp;
  140.   
  141.         /*输出模式*/
  142.         DHT11_Mode_Out_PP();
  143.         /*主机拉低*/
  144.         DHT11_Dout_LOW();
  145.         /*延时18ms*/
  146.         Delay_ms(18);

  147.         /*总线拉高 主机延时30us*/
  148.         DHT11_Dout_HIGH();

  149.         DHT11_Delay(30);   //延时30us

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

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

  157.     /*轮询直到从机发出的 80us 高电平 标置信号结束*/
  158.     while(DHT11_Data_IN()==GPIO_PIN_SET);

  159.     /*开始接收数据*/   
  160.     DHT11_Data->humi_high8bit= DHT11_ReadByte();
  161.     DHT11_Data->humi_low8bit = DHT11_ReadByte();
  162.     DHT11_Data->temp_high8bit= DHT11_ReadByte();
  163.     DHT11_Data->temp_low8bit = DHT11_ReadByte();
  164.     DHT11_Data->check_sum    = DHT11_ReadByte();

  165.     /*读取结束,引脚改为输出模式*/
  166.     DHT11_Mode_Out_PP();
  167.     /*主机拉高*/
  168.     DHT11_Dout_HIGH();
  169.    
  170.     /* 对数据进行处理 */
  171.     humi_temp=DHT11_Data->humi_high8bit*100+DHT11_Data->humi_low8bit;
  172.     DHT11_Data->humidity =(float)humi_temp/100;
  173.    
  174.     humi_temp=DHT11_Data->temp_high8bit*100+DHT11_Data->temp_low8bit;
  175.     DHT11_Data->temperature=(float)humi_temp/100;   
  176.    
  177.     /*检查读取的数据是否正确*/
  178.     temp = DHT11_Data->humi_high8bit + DHT11_Data->humi_low8bit +
  179.            DHT11_Data->temp_high8bit+ DHT11_Data->temp_low8bit;
  180.     if(DHT11_Data->check_sum==temp)
  181.     {
  182.       return SUCCESS;
  183.     }
  184.     else
  185.       return ERROR;
  186.         }        
  187.         else
  188.                 return ERROR;
  189. }

  190. /******************* (C) COPYRIGHT 2015-2020 硬石嵌入式开发团队 *****END OF FILE****/

复制代码



Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top