国产免费AV|泡泡玛特欧洲总部将设在伦敦|中文天堂网www新版资源在线|一本久道综合在线中文|国精产品一二三产区的使用方法|香蕉鱼在线观看|www.27eee

 找回密碼
 注冊
搜索

基于STM32F103的DHT11完美配置例程

[復制鏈接]
樓主
路漫漫 發(fā)表于 2020-6-4 01:11:10 | 只看該作者 |倒序瀏覽 |閱讀模式
  1. DHT11頭文件:
  2. #ifndef _DHT11_H_
  3. #define _DHT11_H_

  4. #include "stm32f10x.h"
  5. #include "bitband_cm3.h" // 位帶操作頭文件

  6. #define DHT11_REV_DATA  PBin(6)
  7. #define DHT11_SEND_DATA PBout(6)

  8. void DHT11_Init(void);
  9. int DHT11_Read_Data(uint8_t *Temp_H,uint8_t* Temp_L,uint8_t* RH_H,uint8_t* RH_L);



  10. #endif



  11. DHT11源文件:
  12. #include "dht11.h"
  13. #include "systick.h"
  14. #if 0  //0---庫函數(shù)  1---寄存器
  15. // DTH11  ---> PB6
  16. // 輸出模式
  17. void DHT11_OUT(void)
  18. {
  19.   GPIOB->CRL &=~ (0xf<<24);
  20.         GPIOB->CRL |=  (3<<24);//通用推挽輸出模式 50M
  21. }

  22. // 輸入模式
  23. void DHT11_IN(void)  
  24. {
  25.         GPIOB->CRL &=~ (0xf<<24);
  26.         GPIOB->CRL |=  (4<<24);//配置浮空輸入(外接上拉電阻)
  27. }

  28. //DHT11初始化
  29. void DHT11_Init(void)
  30. {
  31.         RCC->APB2ENR |= (1<<3); // 開啟PB端口時鐘
  32.         DHT11_IN( );// DHT11 的DATA 引腳處于輸入狀態(tài),時刻檢測外部信號
  33.         delay_ms(500);
  34.         delay_ms(500);//DHT11 上電后要等待 1S 以越過不穩(wěn)定狀態(tài)在此期間不能發(fā)送任何指令
  35. }
  36. #else
  37. // DTH11  ---> PB6
  38. // 輸出模式
  39. void DHT11_OUT(void)
  40. {
  41.         GPIO_InitTypeDef GPIO_InitStruct;
  42.         GPIO_InitStruct.GPIO_Pin=GPIO_Pin_6;
  43.         GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;//通用推挽輸出
  44.         GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;//50M
  45.         GPIO_Init(GPIOB, &GPIO_InitStruct);//PB6
  46. }

  47. // 輸入模式
  48. void DHT11_IN(void)  
  49. {
  50.         GPIO_InitTypeDef GPIO_InitStruct;
  51.         GPIO_InitStruct.GPIO_Pin=GPIO_Pin_6;
  52.         GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;//配置浮空輸入(外接上拉電阻)
  53.         GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;//50M
  54.         GPIO_Init(GPIOB, &GPIO_InitStruct);//PB6
  55. }

  56. //DHT11初始化
  57. void DHT11_Init(void)
  58. {
  59.         RCC->APB2ENR |= (1<<3); // 開啟PB端口時鐘
  60.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//開啟PB端口時鐘.
  61.         DHT11_IN( );// DHT11 的DATA 引腳處于輸入狀態(tài),時刻檢測外部信號
  62.         delay_ms(500);
  63.         delay_ms(500);//DHT11 上電后要等待 1S 以越過不穩(wěn)定狀態(tài)在此期間不能發(fā)送任何指令
  64. }
  65. #endif
  66. //起始信號
  67. void DHT11_Start(void)
  68. {
  69.         DHT11_SEND_DATA=0;
  70.         delay_ms(18);
  71.         DHT11_SEND_DATA=1;
  72.         delay_us(20);//釋放總線
  73. }

  74. //應答信號
  75. //返回值 0--無應答  1--有應答
  76. u8 DHT11_Ack(void)
  77. {
  78.         if(DHT11_REV_DATA!=0)
  79.         {
  80.                 return 0;
  81.         }
  82.         while(DHT11_REV_DATA==0);//等待80us低電平應答結(jié)束
  83.       
  84.         while(DHT11_REV_DATA==1);//等待80us高電平應答結(jié)束
  85.       
  86.         return 1;
  87. }

  88. //讀取一個字節(jié)數(shù)據(jù)
  89. u8 DHT11_Read_Byte(void)
  90. {
  91.         u8 data=0;
  92.         u8 i;
  93.         //接受數(shù)據(jù),每個數(shù)據(jù)以50us低電平開始
  94.         for(i=0;i<8;i++)
  95.         {
  96.                 data <<= 1;
  97.                 while(!DHT11_REV_DATA);//等待發(fā)送數(shù)據(jù)的時序變?yōu)楦唠娖?br />
  98.                 delay_us(40);//23~27u為數(shù)據(jù)0,68~74us為u數(shù)據(jù)1
  99.                 if(DHT11_REV_DATA==1)
  100.                 {
  101.                         data |=1;//數(shù)據(jù)1
  102.                         while(DHT11_REV_DATA);//等待高電平應答結(jié)束
  103.                 }
  104.         }
  105.         return data;
  106. }

  107. //讀取溫濕度
  108. int DHT11_Read_Data(u8 *Temp_H,u8* Temp_L,u8* RH_H,u8* RH_L)
  109. {
  110.         u8 check;
  111.         DHT11_OUT( );
  112.         DHT11_Start( );
  113.         DHT11_IN( );//切換為輸入
  114.         if( DHT11_Ack( )==0 )
  115.         {
  116.                 return -1;
  117.         }
  118.       
  119.         //讀取數(shù)據(jù)
  120.         *RH_H=DHT11_Read_Byte( );
  121.         *RH_L=DHT11_Read_Byte( );
  122.         *Temp_H=DHT11_Read_Byte( );
  123.         *Temp_L=DHT11_Read_Byte( );
  124.         check=DHT11_Read_Byte( );      
  125.       
  126.         //結(jié)束讀取
  127.         delay_ms(50);
  128.         DHT11_OUT( );//切換為輸出
  129.         DHT11_SEND_DATA=1;//釋放總線
  130.       
  131.         //校驗數(shù)據(jù)
  132.         if(check !=(*Temp_H+*Temp_L+*RH_H+*RH_L) )
  133.         {
  134.                 return -2;
  135.         }
  136.         return 0;
  137. }
復制代碼


您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則

手機版|小黑屋|ELEOK |網(wǎng)站地圖

GMT+8, 2026-5-26 01:07

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回復 返回頂部 返回列表