找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 9053|回復(fù): 5
收起左側(cè)

溫濕度傳感器DHT11 STM32F103驅(qū)動(dòng)程序

  [復(fù)制鏈接]
ID:264767 發(fā)表于 2017-12-21 13:34 | 顯示全部樓層 |閱讀模式
DHT11驅(qū)動(dòng)程序,主控基于STM32F103

單片機(jī)源程序如下:
  1. #include "dht11_driver.h"

  2. /*
  3. * 函數(shù)名:DHT11_GPIO_Config
  4. * 描述  :配置DHT11用到的I/O口
  5. * 輸入  :無(wú)
  6. * 輸出  :無(wú)
  7. */
  8. void DHT11_GPIO_Config(void)
  9. {
  10.         GPIO_InitTypeDef GPIO_InitStructure;

  11.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);                                                                                                                   
  12.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
  13.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   
  14.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  15.         GPIO_Init(GPIOB, &GPIO_InitStructure);       

  16.         GPIO_SetBits(GPIOB, GPIO_Pin_1);         
  17. }

  18. /*
  19. * 函數(shù)名:DHT11_Mode_IPU
  20. * 描述  :使DHT11-DATA引腳變?yōu)樯侠斎肽J?br />
  21. * 輸入  :無(wú)
  22. * 輸出  :無(wú)
  23. */
  24. static void DHT11_Mode_IPU(void)
  25. {
  26.           GPIO_InitTypeDef GPIO_InitStructure;

  27.                   /*選擇要控制的DHT11_PORT引腳*/       
  28.           GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;

  29.            /*設(shè)置引腳模式為浮空輸入模式*/
  30.           GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU ;

  31.           /*調(diào)用庫(kù)函數(shù),初始化DHT11_PORT*/
  32.           GPIO_Init(GPIOB, &GPIO_InitStructure);         
  33. }

  34. /*
  35. * 函數(shù)名:DHT11_Mode_Out_PP
  36. * 描述  :使DHT11-DATA引腳變?yōu)橥仆燧敵瞿J?br />
  37. * 輸入  :無(wú)
  38. * 輸出  :無(wú)
  39. */
  40. static void DHT11_Mode_Out_PP(void)
  41. {
  42.         GPIO_InitTypeDef GPIO_InitStructure;
  43.        
  44.           GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;       
  45.           GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   
  46.           GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  47.           GPIO_Init(GPIOB, &GPIO_InitStructure);                  
  48. }

  49. /*
  50. * 從DHT11讀取一個(gè)字節(jié),MSB先行
  51. */
  52. static uint8_t Read_Byte(void)
  53. {
  54.         uint8_t i, temp=0;

  55.         for(i=0;i<8;i++)   
  56.         {         
  57.                 /*每bit以50us低電平標(biāo)置開始,輪詢直到從機(jī)發(fā)出 的50us 低電平 結(jié)束*/  
  58.                 while(DHT11_DATA_IN()==Bit_RESET);

  59.                 /*DHT11 以26~28us的高電平表示“0”,以70us高電平表示“1”,
  60.                  *通過檢測(cè) x us后的電平即可區(qū)別這兩個(gè)狀 ,x 即下面的延時(shí)
  61.                  */
  62.                 delay_us(40); //延時(shí)x us 這個(gè)延時(shí)需要大于數(shù)據(jù)0持續(xù)的時(shí)間即可                     

  63.                 if(DHT11_DATA_IN()==Bit_SET)/* x us后仍為高電平表示數(shù)據(jù)“1” */
  64.                 {
  65.                         /* 等待數(shù)據(jù)1的高電平結(jié)束 */
  66.                         while(DHT11_DATA_IN()==Bit_SET);

  67.                         temp|=(uint8_t)(0x01<<(7-i));  //把第7-i位置1,MSB先行
  68.                 }
  69.                 else         // x us后為低電平表示數(shù)據(jù)“0”
  70.                 {                          
  71.                         temp&=(uint8_t)~(0x01<<(7-i)); //把第7-i位置0,MSB先行
  72.                 }
  73.         }
  74.         return temp;
  75. }
  76. /*
  77. * 一次完整的數(shù)據(jù)傳輸為40bit,高位先出
  78. * 8bit 濕度整數(shù) + 8bit 濕度小數(shù) + 8bit 溫度整數(shù) + 8bit 溫度小數(shù) + 8bit 校驗(yàn)和
  79. */
  80. uint8_t Read_DHT11(DHT11_Data_TypeDef *DHT11_Data)
  81. {  
  82.         /*輸出模式*/
  83.         DHT11_Mode_Out_PP();
  84.         /*主機(jī)拉低*/
  85.         DHT11_DATA_OUT(LOW);
  86.         /*延時(shí)18ms*/
  87.         delay_ms(18);

  88.         /*總線拉高 主機(jī)延時(shí)30us*/
  89.         DHT11_DATA_OUT(HIGH);

  90.         delay_us(30);   //延時(shí)30us

  91.         /*主機(jī)設(shè)為輸入 判斷從機(jī)響應(yīng)信號(hào)*/
  92.         DHT11_Mode_IPU();

  93.         /*判斷從機(jī)是否有低電平響應(yīng)信號(hào) 如不響應(yīng)則跳出,響應(yīng)則向下運(yùn)行*/   
  94.         if(DHT11_DATA_IN()==Bit_RESET)     
  95.         {
  96.                 /*輪詢直到從機(jī)發(fā)出 的80us 低電平 響應(yīng)信號(hào)結(jié)束*/  
  97.                 while(DHT11_DATA_IN()==Bit_RESET);

  98.                 /*輪詢直到從機(jī)發(fā)出的 80us 高電平 標(biāo)置信號(hào)結(jié)束*/
  99.                 while(DHT11_DATA_IN()==Bit_SET);

  100.                 /*開始接收數(shù)據(jù)*/   
  101.                 DHT11_Data->humi_int= Read_Byte();

  102.                 DHT11_Data->humi_deci= Read_Byte();

  103.                 DHT11_Data->temp_int= Read_Byte();

  104.                 DHT11_Data->temp_deci= Read_Byte();

  105.                 DHT11_Data->check_sum= Read_Byte();


  106.                 /*讀取結(jié)束,引腳改為輸出模式*/
  107.                 DHT11_Mode_Out_PP();
  108.                 /*主機(jī)拉高*/
  109.                 DHT11_DATA_OUT(HIGH);
  110. ……………………

  111. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
dht11.zip (2.32 KB, 下載次數(shù): 293)


回復(fù)

使用道具 舉報(bào)

ID:325299 發(fā)表于 2018-5-24 17:44 | 顯示全部樓層
在主函數(shù)里調(diào)用嗎
回復(fù)

使用道具 舉報(bào)

ID:510485 發(fā)表于 2019-4-19 21:19 | 顯示全部樓層
這不是野火的歷程嗎
回復(fù)

使用道具 舉報(bào)

ID:403312 發(fā)表于 2019-7-25 15:49 | 顯示全部樓層
感謝分享
回復(fù)

使用道具 舉報(bào)

ID:316613 發(fā)表于 2019-10-11 12:00 | 顯示全部樓層
主函數(shù)呢??
回復(fù)

使用道具 舉報(bào)

ID:727275 發(fā)表于 2020-10-31 10:57 | 顯示全部樓層
可惜沒有完整的工程文件,感謝樓主分享溫濕度傳感器DHT11 STM32F103驅(qū)動(dòng)程序
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表