久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1715|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩影院在线观看 | 天天色天天射天天干 | 成人免费视频网站在线观看 | 久久99精品久久久 | 夜夜草导航| 亚洲高清视频在线观看 | 黑人巨大精品欧美一区二区免费 | 亚洲网站在线播放 | 中文字幕一区二区三区在线观看 | 56pao在线 | 视频三区 | 激情综合五月 | 欧美视频在线看 | 免费在线黄色av | 看一级黄色毛片 | 亚洲国产日韩欧美 | 精品综合久久 | 精品久久久久久亚洲精品 | 97伦理最新伦理 | 日韩中文一区二区三区 | 亚洲精品中文字幕在线 | 五月综合色啪 | 免费在线成人 | 一区二区三区四区不卡视频 | 国产色婷婷精品综合在线手机播放 | 亚洲精品日韩一区二区电影 | 欧美精品在线视频 | 99久久久无码国产精品 | 亚洲一一在线 | 成人免费在线视频 | 精品国产乱码久久久久久牛牛 | 欧美一级片在线观看 | 日韩三 | 精品婷婷 | 毛片a级毛片免费播放100 | 日韩一区二区三区视频在线播放 | 成人免费视频网站在线看 | 欧美性久久久 | 午夜精品一区二区三区在线观看 | 亚洲一区二区视频 | 精品国产高清一区二区三区 |