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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

STM32 AM2311溫濕度檢測模塊 單總線通信源程序+詳解

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
本人在校學(xué)生一個(gè),最近做項(xiàng)目時(shí),用到了AM2311溫濕度檢測模塊,這個(gè)模塊支持IIC和單總線通信方式,IIC通信的例程網(wǎng)上一抓一大把,但是很不巧,小編就誤選了單總線通信的模塊。
進(jìn)入正題,如何進(jìn)行單總線數(shù)據(jù)通信來讀取數(shù)據(jù)呢?
顧名思義:單總線通信,就是通過一條數(shù)據(jù)線進(jìn)行通信.IIC擁有SDA(數(shù)據(jù)線)和SCL(時(shí)鐘線),單總線通信,可以理解為去掉了SCL線,通過固定的一套時(shí)間協(xié)議,達(dá)到數(shù)據(jù)傳輸?shù)哪康摹?br /> 個(gè)人總結(jié):
1.項(xiàng)目實(shí)際操作能力有待加強(qiáng):以前做項(xiàng)目,在網(wǎng)上或多或少都可以找些模塊代碼進(jìn)行移植,但是,AM2311單總線通信模塊,網(wǎng)上沒有相關(guān)代碼,必須自己撰寫,只能依靠模塊的數(shù)據(jù)手冊。這一過程花費(fèi)小編接近2天時(shí)間,算是一個(gè)小小突破吧。
2.通信協(xié)議類的代碼,一般精度都很高,在US級(jí)別,不要嘗試去做一些與讀取數(shù)據(jù)無關(guān)的操作,比如延時(shí),比如串口輸出接受的某一個(gè)數(shù)據(jù)。(本來AM2311一次性傳輸數(shù)據(jù)為40個(gè),小編在其中加了一個(gè)pringtf函數(shù),導(dǎo)致接受數(shù)據(jù)只有24個(gè))
3.一點(diǎn)建議:雖說這樣的情況可以突破自我,鍛煉個(gè)人能力,但是在做一些緊急的項(xiàng)目開發(fā)時(shí),最好是選用一些常用的通信方式,更節(jié)省時(shí)間。


下面貼上幾張使用手冊的圖片。

小編不太清楚具體圖片上傳是怎么回事,這個(gè)手冊去各大瀏覽器搜索,可能也會(huì)搜索到的。
話不多說,上代碼咯,保證編譯之后下載即可使用。

單片機(jī)源程序如下:
  1. #include "am2311.h"
  2. #include "stm32f10x.h"
  3. #include "sys.h"
  4. #include "delay.h"


  5. AM2311_Data_TypeDef AM2311_Data;

  6. void AM2311_GPIO_Init1(void)//推挽輸出
  7. {
  8.         GPIO_InitTypeDef GPIO_Initstructure;
  9.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
  10.         GPIO_Initstructure.GPIO_Mode=GPIO_Mode_Out_PP;
  11.         GPIO_Initstructure.GPIO_Pin=GPIO_Pin_7;
  12.         GPIO_Initstructure.GPIO_Speed=GPIO_Speed_50MHz;
  13.         GPIO_Init(GPIOB,&GPIO_Initstructure);
  14. }


  15. void AM2311_GPIO_Init2(void)//上拉輸入
  16. {
  17.         GPIO_InitTypeDef GPIO_Initstructure;
  18.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
  19.         GPIO_Initstructure.GPIO_Mode=GPIO_Mode_IPU;
  20.         GPIO_Initstructure.GPIO_Pin=GPIO_Pin_7;
  21.         GPIO_Initstructure.GPIO_Speed=GPIO_Speed_50MHz;
  22.         GPIO_Init(GPIOB,&GPIO_Initstructure);
  23. }

  24. void AM2311_GPIO_Init(void)
  25. {

  26. AM2311_GPIO_Init1();//推挽輸出模式配置
  27. AM2311_GPIO_Init2();//推挽輸出模式配置
  28.         
  29. }



  30. static uint8_t Read_Byte(void)
  31. {

  32.    uint8_t i, temp=0;
  33.         for(i=0;i<8;i++)
  34.         {
  35.    
  36.                 /*每BIT以50us低電平標(biāo)志開始,輪詢從機(jī)發(fā)出的50us低電平結(jié)束*/
  37.                 while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7)==0);//低電平就一直在這里循環(huán),除去開頭的低電平50us干擾
  38.                  
  39.                 delay_us(50); //延時(shí)50ms              
  40.                   if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7)==1)//如果此時(shí)檢測還是高電平,代表發(fā)送的數(shù)據(jù)1
  41.                         {
  42. //                                printf("1");        
  43.                                 while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7)==1);//等待高電平結(jié)束
  44.                                 temp|=(uint8_t)(0x01<<(7-i));//把第七位置一(發(fā)送的位是從高到低順序發(fā)送來的)
  45.                         }
  46.                 else //如果此時(shí)為低電平,表示接收到了0
  47.                 {
  48.                         temp&=(uint8_t)~(0x01<<(7-i)); //
  49. //                        printf("0");
  50.                 }
  51.         }
  52.         return temp;
  53. }


  54. uint8_t Read_AM2311(AM2311_Data_TypeDef *AM2311_Data)
  55. {
  56.         /*輸出模式I*/

  57.   delay_ms(1000);
  58.         delay_ms(1000);
  59.         //第二步:輸出1MS低電平,然后將32IO口設(shè)置為輸入
  60.         AM2311_GPIO_Init1();//引腳設(shè)置為輸出
  61.         PBout(7)=0;
  62.         delay_ms(1);
  63.   AM2311_GPIO_Init2();//引腳設(shè)置成上拉輸入,釋放總線
  64.   //上邊部分應(yīng)該在read data前初始化一次
  65.         delay_us(30);
  66.   while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7)==0);//低電平就一直在這里循環(huán)
  67.         delay_us(50);//

  68.         if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7)==1)//表示此時(shí)模塊即將發(fā)送數(shù)據(jù),已經(jīng)成功響應(yīng),//問題在于總線電平依舊為低
  69.         {
  70. //                        printf("應(yīng)答信號(hào)來了\n");
  71.             while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7)==1);//等待響應(yīng)信號(hào)結(jié)束
  72.       //開始接受數(shù)據(jù)
  73. //                        printf("NO\n");
  74.                
  75.                         AM2311_Data->humi_int=Read_Byte();
  76.                         AM2311_Data->humi_deci=Read_Byte();
  77.                         AM2311_Data->temp_int=Read_Byte();
  78.                   AM2311_Data->temp_deci=Read_Byte();
  79.                         AM2311_Data->check_sum=Read_Byte();
  80.                 /*讀取數(shù)據(jù)結(jié)束,引腳改為輸出模式*/
  81.                   AM2311_GPIO_Init1();
  82.                   PBout(7)=1;
  83.                   if(AM2311_Data->check_sum ==AM2311_Data->humi_int + AM2311_Data->humi_deci + AM2311_Data->temp_int+ AM2311_Data->temp_deci)
  84.         //核對校驗(yàn)位是否正確
  85.                         {
  86. //                                printf("返回的數(shù)據(jù)為1");
  87.                                 return 1;
  88.                                 
  89.                         }
  90.                         
  91.                   else
  92.                         {
  93. //                                printf("返回?cái)?shù)據(jù)失敗");
  94.                           return 0;
  95.                                 
  96.                         }
  97.                         
  98.         
  99.         }
  100.         else
  101.         {
  102. //                printf("YES\n");
  103.                 return 0;
  104.         }
  105.         
  106. }
復(fù)制代碼
  1. #include "led.h"
  2. #include "delay.h"
  3. #include "sys.h"
  4. #include "usart.h"
  5. #include <string.h>
  6. #include "timer.h"
  7. #include "am2311.h"
  8. #include <stdio.h>
  9. #include "stm32f10x.h"
  10. //#include <stm32f1xx_hal.h>
  11. //在int之前定義,代表是整個(gè)工程中的變量,定義在某個(gè)函數(shù)當(dāng)中,只能是在該函數(shù)內(nèi)部進(jìn)行使用,無法擴(kuò)展extern

  12.          u8 n=0;
  13.         u8 m=0;
  14.         u8 len=0;
  15.         u16 Send_Time=0;    //發(fā)送次數(shù)
  16.   int  RH_Value=0;
  17.         int  RH_H,RH_L=0;
  18.         int TEMP_Value=0;
  19.         int TP_H,TP_L=0;
  20. extern AM2311_Data_TypeDef AM2311_Data;
  21. extern u8 receive[20];//用于接受傳輸過來的數(shù)組
  22. int main(void)
  23.          
  24. {               
  25.         u8  keysign=0;      //按鍵標(biāo)志
  26.         u16 head=0x55aa;     //發(fā)送變量
  27.         u16 tail=0xaa55;
  28.         u8  id_code[32]="174eec111de24bfaa1f3a8b12279dcd4";   //設(shè)備識(shí)別號(hào)
  29.         u8  heart=0xff;
  30.         u8  i=0;

  31.         u8   sign_1s=0;
  32.         u32  count_1s=0;
  33.         delay_init();                     //延時(shí)函數(shù)初始化         
  34.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //設(shè)置NVIC中斷分組2:2位搶占優(yōu)先級(jí),2位響應(yīng)優(yōu)先級(jí)
  35.         uart_init(115200);         //串口初始化為115200
  36.          LED_Init();                             //LED端口初始化
  37.   TIM4_Int_Init(99,7199);   //1ms
  38.          AM2311_GPIO_Init();
  39.          
  40. //        while(sign==0)
  41.          while(1)
  42.         {
  43.                 /*
  44. //                if(Send_Time>=7) break;
  45. //          delay_ms(2000);
  46. //                 if((USART_RX_STA&0x8000||Send_Time==0)&&(Send_Time<=7))//接收完成,對數(shù)據(jù)的內(nèi)容進(jìn)行判斷。
  47. //                 {        
  48. //                            if(Send_Time<=7)
  49. //                                        Send_Time++;
  50. //                                        switch(Send_Time)
  51. //                                        {
  52. //                                                case 1:printf("\r\nAT+CWMODE=3\r\n"); break; //printf("\r\nAT+CWMODE=1\r\n");//station模式,連入WiFi
  53. //                                                case 2:printf("\r\nAT+RST\r\n");  break;                                       //設(shè)置模式后,重啟有效
  54. //                                                case 3:printf("\r\nAT+CWJAP=\"ywx123\",\"87654321\"\r\n");  break;//Smart_Home_hbkj 11111111
  55. //                                                case 4:printf("\r\nAT+CIPMUX=0\r\n"); break;            //2350,2347                       //單通道模式
  56. //                                                case 5:printf("\r\nAT+CIPSTART=\"TCP\",\"39.96.179.213\",2347\r\n");  break;  //連入的ip和端口號(hào)
  57. //                                                //case 5:printf("\r\nAT+CIPSTART=\"TCP\",\"192.168.31.119\",1234\r\n");  break;  //連入的ip和端口號(hào)
  58. //                                                case 6:printf("\r\nAT+CIPMODE=1\r\n"); break;                                  //透傳模式
  59. //                                                case 7:printf("\r\nAT+CIPSEND\r\n"); break;                                                                       //開始發(fā)送數(shù)據(jù)
  60. //                                                case 8 :break;
  61. //                                        }
  62. //                                       
  63. //                                        if(Send_Time%2==0)                    //每改變一個(gè)連接狀態(tài),led燈狀態(tài)改變一次
  64. //                      GPIO_ResetBits(GPIOC,GPIO_Pin_13);
  65. //                      else  
  66. //                                        GPIO_SetBits(GPIOC,GPIO_Pin_13 );//否則保持為同一個(gè)狀態(tài)
  67. //                                                while(1)
  68. //                                                {
  69. //                                                delay_ms(3000);
  70. //                                                strflag1 = strstr(USART_RX_BUF,str1); //判斷是否含有ready,如果有,則為1,否則為0
  71. //                                                strflag2 = strstr(USART_RX_BUF,str2); //判斷是否含有OK
  72. //                                                if(Send_Time==7)
  73. //                                                {
  74. //                                                        for(n=0;n<3;n++)//輸出3次數(shù)據(jù)進(jìn)行檢查
  75. //                                                        {
  76. //                                                    printf("175240");
  77. //                                                                delay_ms(1000);
  78. //                                                                len=USART_RX_STA&0x3fff;//取出u16中的低16 位,得到此次接收到的數(shù)據(jù)長度
  79. //                                                                if(USART_RX_STA&0x8000)//判斷接收數(shù)組的最高位是否為一,本次接收是否完成如果接受完成,就執(zhí)行下列操作。
  80. //                                                                {
  81. //                                                                        //if(USART_RX_BUF[1]=='h')
  82. //                                                                        for(m=0;m<len;m++)
  83. //                                                                        {
  84. //                                                                                USART1->DR=USART_RX_BUF[m];//把每一個(gè)數(shù)據(jù)都在串口打印出來
  85. //                                                                                while((USART1->SR&0X40)==0);//等待發(fā)送結(jié)束
  86. //                                                                        }
  87. //                                                                }
  88. //                                                        }
  89. //                                                        sign=1;//
  90. //                                                }
  91. //                                                if(strflag1!=NULL||strflag2!=NULL|Send_Time==2)
  92. //                                                        {//兩個(gè)只要有一個(gè)不為空就說明是 有上面兩個(gè)值
  93. //                                                        memset(USART_RX_BUF,NULL,sizeof(USART_RX_BUF));//清空接收數(shù)組
  94. //                                                        USART_RX_STA=0x8000;//最高位強(qiáng)制為1、其他位不變、說明這次接收的數(shù)據(jù)中有OK和ready
  95. //                                                        break;//強(qiáng)行之一之后就進(jìn)入串口中斷。
  96. //                                                        }
  97. //                                          }
  98. //                  }//執(zhí)行完數(shù)據(jù)接收   
  99. */
  100.           //計(jì)算出實(shí)際濕度值的10倍
  101.      if(Read_AM2311(&AM2311_Data)==1)
  102.         {         
  103.             RH_Value= AM2311_Data.humi_int*256 + AM2311_Data.humi_deci;
  104.             RH_H = RH_Value/10;
  105.             RH_L =(RH_Value%10);
  106.             //?????????10?
  107.             TEMP_Value = AM2311_Data.temp_int*256 + AM2311_Data.temp_deci;
  108.             TP_H = TEMP_Value/10;
  109.             TP_L = TEMP_Value%10;
  110.         
  111.           printf("RH_Value=%d,RH_H=%d,RH_L=%d\r\n",RH_Value,RH_H,RH_L);
  112.                                         delay_ms(1000);
  113.                                         printf("TEMP_Value=%d,TP_H=%d,TP_L=%d\r\n",TEMP_Value,TP_H,TP_L);
  114.                 delay_ms(1000);
  115.           delay_ms(1000);

  116.                                 }
  117.         }         
  118.         
  119. }
復(fù)制代碼

所有資料51hei提供下載:
STM32F1 AM2311 單總線.7z (192.03 KB, 下載次數(shù): 32)

評分

參與人數(shù) 1黑幣 +80 收起 理由
admin + 80 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評分

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

使用道具 舉報(bào)

沙發(fā)
ID:407977 發(fā)表于 2019-7-26 09:51 | 只看該作者
有一點(diǎn)需要注意,與模塊AM2311相連的導(dǎo)線長度在30m之內(nèi),需要給信號(hào)線加4.7K的上拉電阻,如果是比30m還要長,加一個(gè)3K多一點(diǎn)的電阻,至少為3K 的上拉電阻。
回復(fù)

使用道具 舉報(bào)

板凳
ID:407977 發(fā)表于 2019-7-26 09:52 | 只看該作者
模塊有點(diǎn)迷,需要多注意接線方式,是否牢靠等等,如果是做工程項(xiàng)目,這個(gè)模塊不是一個(gè)很好的選擇。
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 日韩一区二区三区视频 | 精品国产一区二区三区久久久久久 | 老司机午夜性大片 | 日韩亚洲视频 | 中文字幕国产在线 | 久久伊| 欧美日韩精品免费 | 精品一区二区三区四区外站 | 又爽又黄axxx片免费观看 | 99福利视频 | 一区二区三区四区免费视频 | 日韩欧美天堂 | 激情视频中文字幕 | 成人在线免费观看视频 | 特级一级黄色片 | 国产一区视频在线 | 中文字幕久久精品 | 人人看人人搞 | 精品产国自在拍 | h片在线看| 午夜日韩 | 国产成人精品久久久 | 日日摸日日爽 | 全部免费毛片在线播放网站 | www.精品国产 | 玖玖综合网 | 欧美精品在线免费观看 | 国产精品欧美日韩 | 正在播放国产精品 | 免费九九视频 | 欧美午夜视频 | 日韩一区欧美一区 | 国产精品久久 | 精品视频一区二区 | 男女啪啪高潮无遮挡免费动态 | 亚洲二区在线观看 | 99re视频在线观看 | 久久久久久女 | 搞av.com| 日韩中文字幕一区二区 | av免费网站在线观看 |