找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 683|回复: 3
打印 上一主题 下一主题
收起左侧

stm32f407vet6单片机+dht11程序,自己写的不太行 不知到问题出在哪

[复制链接]
回帖奖励 20 黑币 回复本帖可获得 1 黑币奖励! 每人限 3 次(中奖概率 90%)
跳转到指定楼层
楼主
ID:744356 发表于 2023-3-22 11:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
初学者,我是用正点原子上的dht11代码改的但是就是不知道问题出在哪?串口一直显示是检测不到dht11,要么就是随机数。单总线怎么配置,我用的是GPIOB5这个端口配的,但是就是不行。/* IO操作函数 */是根据正点原子hal库改过来的,这样可以吗?有大佬指点一下吗?小弟在这里多谢了。

单片机源程序如下:
  1. #ifndef __DHT11_H
  2. #define __DHT11_H

  3. #include "sys.h"


  4. /******************************************************************************************/
  5. /* DHT11 引脚 定义 */

  6. #define DHT11_DQ_GPIO_PORT                  GPIOB
  7. #define DHT11_DQ_GPIO_PIN                   GPIO_Pin_5

  8. /******************************************************************************************/

  9. /* IO操作函数 */
  10. #define DHT11_DQ_OUT(x)     do{x ? \
  11.                                       GPIO_WriteBit(DHT11_DQ_GPIO_PORT,DHT11_DQ_GPIO_PIN, Bit_RESET):\
  12.                                 GPIO_WriteBit(DHT11_DQ_GPIO_PORT,DHT11_DQ_GPIO_PIN,Bit_SET); \
  13.                             }while(0)                                                       /* 数据端口输出 */
  14. #define DHT11_DQ_IN         GPIO_ReadInputDataBit(DHT11_DQ_GPIO_PORT, DHT11_DQ_GPIO_PIN)    /* 数据端口输入 */


  15. uint8_t dht11_init(void);   /* 初始化DHT11 */
  16. uint8_t dht11_check(void);  /* 检测是否存在DHT11 */
  17. uint8_t dht11_read_data(uint8_t *temp,uint8_t *humi);   /* 读取温湿度 */

  18. #endif

  19. ***********************************************************************
  20. #include "dht11.h"
  21. #include "delay.h"


  22. /**
  23. * @brief       复位DHT11
  24. * @param       data: 要写入的数据
  25. * @retval      无
  26. */
  27. static void dht11_reset(void)
  28. {
  29.                 DHT11_DQ_OUT(0);    /* 拉低DQ */
  30.     delay_ms(20);       /* 拉低至少18ms */
  31.     DHT11_DQ_OUT(1);    /* DQ=1 */
  32.     delay_us(30);       /* 主机拉高20~40us */
  33. }

  34. /**
  35. * @brief       等待DHT11的回应
  36. * @param       无
  37. * @retval      0, DHT11正常
  38. *              1, DHT11异常/不存在
  39. */
  40. uint8_t dht11_check(void)
  41. {
  42.     uint8_t retry = 0;
  43.     uint8_t rval = 0;

  44.     while (DHT11_DQ_IN && retry < 100)  /* DHT11会拉低40~80us */
  45.     {
  46.         retry++;
  47.         delay_us(1);
  48.     }

  49.     if (retry >= 100)
  50.     {
  51.         rval = 1;
  52.     }
  53.     else
  54.     {
  55.         retry = 0;

  56.         while (!DHT11_DQ_IN && retry < 100) /* DHT11拉低后会再次拉高40~80us */
  57.         {
  58.             retry++;
  59.             delay_us(1);
  60.         }
  61.         if (retry >= 100) rval = 1;
  62.     }

  63.     return rval;
  64. }

  65. /**
  66. * @brief       从DHT11读取一个位
  67. * @param       无
  68. * @retval      读取到的位值: 0 / 1
  69. */
  70. uint8_t dht11_read_bit(void)
  71. {
  72.     uint8_t retry = 0;

  73.     while (DHT11_DQ_IN && retry < 100)  /* 等待变为低电平 */
  74.     {
  75.         retry++;
  76.         delay_us(1);
  77.     }

  78.     retry = 0;

  79.     while (!DHT11_DQ_IN && retry < 100) /* 等待变高电平 */
  80.     {
  81.         retry++;
  82.         delay_us(1);
  83.     }

  84.     delay_us(40);       /* 等待40us */

  85.     if (DHT11_DQ_IN)    /* 根据引脚状态返回 bit */
  86.     {
  87.         return 1;
  88.     }
  89.     else
  90.     {
  91.         return 0;
  92.     }
  93. }

  94. /**
  95. * @brief       从DHT11读取一个字节
  96. * @param       无
  97. * @retval      读到的数据
  98. */
  99. static uint8_t dht11_read_byte(void)
  100. {
  101.     uint8_t i, data = 0;

  102.     for (i = 0; i < 8; i++)         /* 循环读取8位数据 */
  103.     {
  104.         data <<= 1;                 /* 高位数据先输出, 先左移一位 */
  105.         data |= dht11_read_bit();   /* 读取1bit数据 */
  106.     }

  107.     return data;
  108. }

  109. /**
  110. * @brief       从DHT11读取一次数据
  111. * @param       temp: 温度值(范围:0~50°)
  112. * @param       humi: 湿度值(范围:20%~90%)
  113. * @retval      0, 正常.
  114. *              1, 失败
  115. */
  116. uint8_t dht11_read_data(uint8_t *temp, uint8_t *humi)
  117. {
  118.     uint8_t buf[5];
  119.     uint8_t i;
  120.     dht11_reset();

  121.     if (dht11_check() == 0)
  122.     {
  123.         for (i = 0; i < 5; i++)     /* 读取40位数据 */
  124.         {
  125.             buf[i] = dht11_read_byte();
  126.         }

  127.         if ((buf[0] + buf[1] + buf[2] + buf[3]) == buf[4])
  128.         {
  129.             *humi = buf[0];
  130.             *temp = buf[2];
  131.         }
  132.     }
  133.     else
  134.     {
  135.         return 1;
  136.     }

  137.     return 0;
  138. }

  139. /**
  140. * @brief       初始化DHT11的IO口 DQ 同时检测DHT11的存在
  141. * @param       无
  142. * @retval      0, 正常
  143. *              1, 不存在/不正常
  144. */
  145. uint8_t dht11_init(void)
  146. {
  147.     GPIO_InitTypeDef  GPIO_InitStructure;
  148.     //DHT11_DQ_GPIO_CLK_ENABLE();     /* 开启DQ引脚时钟 */
  149.           RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE); //使能GPIOA时钟

  150.     GPIO_InitStructure.GPIO_Pin = DHT11_DQ_GPIO_PIN;
  151.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
  152.     GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;//开漏输出
  153.     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;                /* 上拉 */
  154.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;          /* 高速 */
  155.     GPIO_Init(DHT11_DQ_GPIO_PORT, & GPIO_InitStructure);   /* 初始化DHT11_DQ引脚 */
  156.     /* DHT11_DQ引脚模式设置,开漏输出,上拉, 这样就不用再设置IO方向了, 开漏输出的时候(=1), 也可以读取外部信号的高低电平 */
  157.     dht11_reset();
  158.     return dht11_check();
  159. }

  160. **************************************************************************
  161. #include "sys.h"
  162. #include "delay.h"
  163. #include "usart.h"
  164. #include "led.h"
  165. #include "beep.h"
  166. #include "key.h"
  167. #include "dht11.h"



  168. //串口通信实验 -库函数版本
  169. //STM32F4工程模板-库函数版本


  170. int main(void)
  171. {

  172.     u8 t;
  173.     u8 len;
  174.     u16 times=0;
  175.     uint8_t temperature;
  176.     uint8_t humidity;
  177.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
  178.     delay_init(168);                //延时初始化
  179.     uart_init(115200);        //串口初始化波特率为115200
  180.     LED_Init();                                  //初始化与LED连接的硬件接口
  181.           //dht11_init();
  182.     while (dht11_init())    /* DHT11初始化 */
  183.     {
  184.         printf("DHT11 Error");
  185.         delay_ms(200);
  186.         delay_ms(200);
  187.     }
  188.     while (1)
  189.     {
  190.         if (t % 10 == 0)    /* 每100ms读取一次 */
  191.         {
  192.             dht11_read_data(&temperature, &humidity);             /* 读取温湿度值 */
  193.             printf("%lf\n",temperature);
  194.                                           printf("%lf\n",humidity);
  195.         }

  196.         delay_ms(100);
  197.         t++;

  198.         if (t == 20)
  199.         {
  200.             t = 0;
  201.             //LED0_TOGGLE();  /* LED0闪烁 */
  202.         }
  203.     }

  204. }
复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:123289 发表于 2023-3-22 16:10 | 只看该作者
读通dht11的手册,按照手册的逻辑去写,如此能获得更多的知识和经验。
回复

使用道具 举报

板凳
ID:690831 发表于 2023-3-24 18:45 来自手机 | 只看该作者
连接的硬件接口           //dht11_init();
回复

使用道具 举报

地板
ID:690831 发表于 2023-3-24 18:46 来自手机 | 只看该作者
你确定有初始化GPIO
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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