找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2409|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

一線總線溫濕度傳感器AM2301 STM32驅(qū)動程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
一線總線溫濕度傳感器AM2301驅(qū)動程序

單片機(jī)源程序如下:
  1. #include "AM23XX.h"
  2. uint8_t a=0;
  3. uint8_t flag11=0;
  4. uint16_t count =0;
  5. /*
  6. * 函數(shù)名:DHT11_GPIO_Config
  7. * 描述  :配置DHT11用到的I/O口
  8. * 輸入  :無
  9. * 輸出  :無
  10. */
  11. void delay(int tt)
  12. {           int j;
  13.     for(;tt!=0;tt--)
  14.                 for(j=44;j>0;j--);
  15. }
  16. void DHT11_GPIO_Config(void)
  17. {               
  18.         /*定義一個GPIO_InitTypeDef類型的結(jié)構(gòu)體*/
  19.         GPIO_InitTypeDef GPIO_InitStructure;

  20.         /*開啟GPIOD的外設(shè)時鐘*/
  21.         RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE);

  22.         /*選擇要控制的GPIOD引腳*/                                                                                                                          
  23.           GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;       

  24.         /*設(shè)置引腳模式為通用推挽輸出*/
  25.           GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   

  26.         /*設(shè)置引腳速率為50MHz */   
  27.           GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;

  28.         /*調(diào)用庫函數(shù),初始化GPIOD*/
  29.           GPIO_Init(GPIOA, &GPIO_InitStructure);                  

  30.         /* 拉高GPIOD12        */
  31.         GPIO_SetBits(GPIOA, GPIO_Pin_5);
  32.         printf("DHT11 配置完。");         
  33. }

  34. /*
  35. * 函數(shù)名:DHT11_Mode_IPU
  36. * 描述  :使DHT11-DATA引腳變?yōu)檩斎肽J?br />
  37. * 輸入  :無
  38. * 輸出  :無
  39. */
  40. static void DHT11_Mode_IN_FLOATING(void)
  41. {
  42.           GPIO_InitTypeDef GPIO_InitStructure;

  43.                   /*選擇要控制的GPIOD引腳*/       
  44.           GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;

  45.            /*設(shè)置引腳模式為浮空輸入模式*/
  46.           GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING ;

  47.           /*調(diào)用庫函數(shù),初始化GPIOD*/
  48.           GPIO_Init(GPIOA, &GPIO_InitStructure);         
  49. }

  50. /*
  51. * 函數(shù)名:DHT11_Mode_Out_PP
  52. * 描述  :使DHT11-DATA引腳變?yōu)檩敵瞿J?br />
  53. * 輸入  :無
  54. * 輸出  :無
  55. */
  56. static void DHT11_Mode_Out_PP(void)
  57. {
  58.         GPIO_InitTypeDef GPIO_InitStructure;

  59.                  /*選擇要控制的GPIOD引腳*/                                                                                                                          
  60.           GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;       

  61.         /*設(shè)置引腳模式為通用推挽輸出*/
  62.           GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   

  63.         /*設(shè)置引腳速率為50MHz */   
  64.           GPIO_InitStructure.GPIO_Speed =GPIO_Speed_10MHz;

  65.         /*調(diào)用庫函數(shù),初始化GPIOD*/
  66.           GPIO_Init(GPIOA, &GPIO_InitStructure);                  
  67. }
  68. //-----------------------------------------------------------------------------------------------
  69. //-----------------------------------------------------------------------------------------------
  70. //void SDA_Pin_Output_High(void)
  71. //{
  72. //        GPIOA->DDR |= SDA_Pin;                //輸出模式
  73. //        GPIOA->ODR |= SDA_Pin;                //輸出'1'       
  74. //        GPIOA->CR1 |= SDA_Pin;                //推挽模式  開漏端口此位無效
  75. //        GPIOA->CR2 |= SDA_Pin;                //高速輸出
  76. //}
  77. //
  78. //void SDA_Pin_Output_Low(void)
  79. //{
  80. //        GPIOA->DDR |= SDA_Pin;                 //輸出模式
  81. //        GPIOA->ODR &= (~SDA_Pin);                //輸出'0'       
  82. //        GPIOA->CR1 |= SDA_Pin;                  //推挽模式  開漏端口此位無效
  83. //        GPIOA->CR2 |= SDA_Pin;                 //高速輸出
  84. //}
  85. //
  86. //void SDA_Pin_IN_FLOATING(void)
  87. //{
  88. //        GPIOA->CR2 &= ~(SDA_Pin);                        //禁止外部中斷
  89. //        GPIOA->DDR &= ~(SDA_Pin);                        //輸入模式
  90. //        GPIOA->CR1 &= ~(SDA_Pin);                        //懸浮輸入
  91. //}
  92. //-----------------------------------------------------------------------------------------------
  93. static uint8_t Read_Byte(void)
  94. {          

  95.             uint8_t i, temp=0;

  96.          for(i=0;i<8;i++)   
  97.          {
  98.            /*每bit以50us低電平標(biāo)置開始,輪詢直到從機(jī)發(fā)出 的50us 低電平 結(jié)束*/  
  99.             while(DHT11_DATA_IN()==Bit_RESET);//{if(++count>5000) break;};
  100.                  
  101.                  /*DHT11 以27~28us的高電平表示“0”,以70us高電平表示“1”,
  102.                           通過檢測60us后的電平即可區(qū)別這兩個狀態(tài)*/

  103.                 //delay(5); //延時60us
  104.                 SysTickDelay(40);                             
  105.        
  106.                   if(DHT11_DATA_IN()==Bit_SET)//60us后仍為高電平表示數(shù)據(jù)“1”
  107.                    {
  108.                            /*輪詢直到從機(jī)發(fā)出的剩余的 30us 高電平結(jié)束*/
  109.                                     while(DHT11_DATA_IN() ==Bit_SET);//{if(++count>500) break;}
  110.                                  // SysTickDelay(1);
  111.                                  temp|=(uint8_t)(0x01<<(7-i));  //把第7-i位置1
  112.                        
  113.                    }
  114.                    else         //60us后為低電平表示數(shù)據(jù)“0”
  115.                    {//SysTickDelay(1);                          
  116.                              temp&=(uint8_t)~(0x01<<(7-i)); //把第7-i位置0
  117.                    }
  118.          }
  119.           return temp;
  120. }

  121. uint8_t Read_DHT11(DHT11_Data_TypeDef *DHT11_Data)
  122. {  

  123.         DHT11_Mode_Out_PP();
  124.                 DHT11_DATA_OUT(HIGH);
  125.                 SysTickDelay(500000);
  126.         /*主機(jī)拉低*/
  127.         //DHT11_Mode_Out_PP();
  128.           DHT11_DATA_OUT(LOW);
  129.    //*延時18ms*/800US
  130.            SysTickDelay(2000);        //一定要2MS 的起始信號
  131.   //        DHT11_Mode_IN_FLOATING();
  132.    /*總線拉高 主機(jī)延時30us*/
  133.            //DHT11_DATA_OUT(HIGH);
  134.         DHT11_DATA_OUT(HIGH);
  135.           SysTickDelay(30);
  136.            /*主機(jī)設(shè)為輸入 判斷從機(jī)響應(yīng)信號*/
  137.    //        DHT11_Mode_IN_FLOATING();
  138.         DHT11_Mode_IN_FLOATING();
  139.   //delay(3);
  140. /*判斷從機(jī)是否有低電平響應(yīng)信號 如不響應(yīng)則跳出,響應(yīng)則向下運(yùn)行*/   
  141.   //while(DHT11_DATA_IN() ==Bit_SET){a++;if(a>10) break;}
  142.    SysTickDelay(10);
  143.                         if(DHT11_DATA_IN()==Bit_RESET)
  144.                                 {       
  145.                                           /*輪詢直到從機(jī)發(fā)出的 80us 高電平 標(biāo)置信號結(jié)束*/
  146.                                         count =0;
  147.                                         while(DHT11_DATA_IN()==Bit_RESET);// {if(++count>500) break;}
  148.                                         count =0;
  149.                                         while(DHT11_DATA_IN()==Bit_SET);//{if(++count>500) break;}

  150.           /*輪詢直到從機(jī)發(fā)出的 80us 高電平 標(biāo)置信號結(jié)束*/
  151.           /*開始接收數(shù)據(jù)*/   
  152.                                           DHT11_Data->humi_int= Read_Byte();           //0
  153.                                                                
  154.                                          DHT11_Data->humi_deci= Read_Byte();          //1
  155.                                
  156.                                          DHT11_Data->temp_int= Read_Byte();                         //2

  157.                                          DHT11_Data->temp_deci= Read_Byte();                        //3
  158.                                                 
  159.                                          DHT11_Data->check_sum= Read_Byte();
  160.                                                                                    
  161.                  delay(1);
  162.                          /*讀取結(jié)束,引腳改為輸出模式*/
  163.                    DHT11_Mode_Out_PP();
  164.                    /*主機(jī)拉高*/
  165.                  DHT11_DATA_OUT(HIGH);
  166.                  DHT11_Data->check_sum_tep=DHT11_Data->humi_int + DHT11_Data->humi_deci + DHT11_Data->temp_int+ DHT11_Data->temp_deci;
  167.                    /*檢查讀取的數(shù)據(jù)是否正確*/
  168.                  if(DHT11_Data->check_sum == DHT11_Data->check_sum_tep)
  169.                           {
  170.                         //        display(DHT11_Data->temp_int,DHT11_Data->humi_int) ;
  171.                         //        delay(200000);
  172.                         //        display(DHT11_Data->temp_deci,DHT11_Data->humi_deci) ;
  173.                         //        delay(200000);
  174.                         /* AM23XX 處理程序********/
  175.                                 DHT11_Data->hh = DHT11_Data->humi_int;
  176.                                 DHT11_Data->hh <<= 8;
  177.                                 DHT11_Data->hh |= DHT11_Data->humi_deci;
  178.                                 if(0>DHT11_Data->hh||DHT11_Data->hh>=1000)DHT11_Data->hh=999;
  179.                                

  180.                                 DHT11_Data->tem = DHT11_Data->temp_int;
  181.                                 DHT11_Data->tem <<= 8;
  182.                                 DHT11_Data->tem |= DHT11_Data->temp_deci;
  183.                                 if(0>DHT11_Data->tem||DHT11_Data->tem>=1000)DHT11_Data->tem=999;


  184.                                 DHT11_Data->hh_10=DHT11_Data->hh/10;
  185.                                 DHT11_Data->tem_10 =DHT11_Data->tem/10;


  186.                                 return SUCCESS;

  187.                         }
  188.                   else
  189.                           {
  190.                 //        printf("和值不相等\n");
  191.                         return ERROR;
  192.                         }
  193.    }
  194.    else
  195.            {               
  196.                         return ERROR;
  197.                 }
  198.                                    
  199. }

  200.           


  201. /*************************************END OF FILE******************************/
復(fù)制代碼

所有資料51hei提供下載:
AM2301.7z (199.84 KB, 下載次數(shù): 26)

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

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