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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1978|回復: 0
打印 上一主題 下一主題
收起左側

AM2302溫濕度板STM32單片機驅動程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:912864 發表于 2021-6-24 14:38 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  1. #include "am2303.h"
  2. #include "delay.h"
  3. #include "usart1.h"


  4. /*
  5. 開始信號:SCL 為高電平時,SDA 由高電平向低電平跳變,開始傳送數據

  6. */

  7. #define SDA            GPIO_Pin_7  //SDA                數據
  8. #define AM_PORT        GPIOB

  9. #define   AM_SDA_HIGH    GPIO_SetBits(AM_PORT,  SDA)    //數據高
  10. #define   AM_SDA_LOW     GPIO_ResetBits(AM_PORT,  SDA)  //數據低                                                                                                                          
  11. #define   AM_SDA_READ    GPIO_ReadInputDataBit(AM_PORT, SDA)  //數據讀



  12. /*********************************************************************************
  13. 功    能:AM2303_Configuration配置                                                                                                                                                  
  14. 入口參數:無                                                                                                                                                                                                                                     
  15. 返 回 值:無                                                                  
  16. *********************************************************************************/
  17. void AM2303_Configuration(void)
  18. {
  19.         GPIO_InitTypeDef GPIO_InitStructure;
  20.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB ,ENABLE);

  21.         GPIO_InitStructure.GPIO_Pin = SDA;         
  22.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;                             //開漏輸出
  23.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  24.   GPIO_Init(AM_PORT, &GPIO_InitStructure);
  25.         AM_SDA_HIGH;                            //初始化IO
  26. }

  27. /*********************************************************************************
  28. 功    能:AM2303_SDA_DirSet 輸入輸出選擇                                                                                  
  29. 入口參數:io_mode                                                                                                                                                                                                                     
  30. 返 回 值:無                                                                  
  31. **********************************************************************************/
  32. static void AM2303_SDA_DirSet(SDA_GPIO_MODE io_mode) //SDA引腳輸入輸出設置
  33. {
  34.         GPIO_InitTypeDef GPIO_InitStructure;
  35.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB ,ENABLE);

  36.         if(io_mode==SDA_OUTPUT)
  37.         {
  38.                 GPIO_InitStructure.GPIO_Pin = SDA;         
  39.                 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
  40.                 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  41.                 GPIO_Init(AM_PORT, &GPIO_InitStructure);
  42.         }
  43.         if(io_mode==SDA_INPUT)
  44.         {
  45.                 GPIO_InitStructure.GPIO_Pin = SDA;         
  46.                 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;  
  47.                 GPIO_Init(AM_PORT, &GPIO_InitStructure);
  48.         }
  49. }

  50. uint16_t FLAG=0;
  51. /********************************************************************************
  52. 功    能:AM2303_Read_Byte                                                                                                                      
  53. 入口參數:無                                                                                                                                                                                                 
  54. 返 回 值:無                                                                  
  55. *********************************************************************************/
  56. static uint8_t AM2303_Read_Byte(void)  
  57. {
  58.         uint8_t i;
  59.         uint8_t temp=0;
  60.         uint8_t data=0;
  61.        
  62.         for(i=0;i<8;i++)
  63.         {
  64.                 FLAG=2;
  65.                 while((!(AM_SDA_READ))&&FLAG++);   //檢測上次低電平是否結束
  66.                 if(FLAG==1)break;                  //超時則跳出循環
  67.                 Delayus(30);
  68.                 temp=0;
  69.                 if(AM_SDA_READ)                   //判斷數據位是 0 還是 1 // 如果高電平高過預定 0 高電平值則數據位為 1
  70.                         temp=1;
  71.                 FLAG=2;
  72.                 while((AM_SDA_READ)&&FLAG++);     //檢測高電平是否結束
  73.                 if(FLAG==1)break;                 //超時則跳出循環
  74.                 data<<=1;
  75.                  data|=temp;
  76.         }
  77.         return        data;
  78. }

  79. /********************************************************************************
  80. 功    能:AM2303_Read                                                                                                              
  81. 入口參數:無                                                                                                                                                                                                 
  82. 返 回 值:無                                                                  
  83. *********************************************************************************/
  84. void AM2303_Read(void)  
  85. {
  86.         //uint8_t i;
  87.         float humi=0.0;
  88.         float temper=0.0;
  89.         uint8_t sensor_data[5]={0};
  90.         uint8_t sensor_chck=0;
  91.        
  92.         AM2303_SDA_DirSet(SDA_OUTPUT);     //設置SDA口為輸出口
  93.         //主機拉低時鐘10ms
  94.         AM_SDA_LOW;
  95.         Delayms(10);
  96.         //主機釋放時鐘
  97.         AM_SDA_HIGH;
  98.         Delayus(30);
  99.        
  100.         AM2303_SDA_DirSet(SDA_INPUT);               //設置SDA口為輸入口
  101.         //判斷響應信號
  102.         if(AM_SDA_READ)       
  103.         {
  104.                 USART1_Printf("AM2303_ack_error\r\n");    //響應錯誤
  105.                 FLAG=1;
  106.         }
  107.         while(AM_SDA_READ ==0)                      //響應主機
  108.         {
  109.                 //判斷從機是否發出 80us 的低電平響應信號是否結束
  110.                 FLAG=2;
  111.                 while((!(AM_SDA_READ))&&FLAG++);
  112.                 if(FLAG==1)break;
  113.                
  114.                 //判斷從機是否發出 80us 的高電平響應信號是否結束
  115.                 FLAG=2;                       
  116.                 while((AM_SDA_READ)&&FLAG++);
  117.                 if(FLAG==1)break;
  118.                
  119.                 //數據接收狀態
  120.                 sensor_data[0]=AM2303_Read_Byte();
  121.                 if(FLAG==1)break;  
  122.                 sensor_data[1]=AM2303_Read_Byte();
  123.                 if(FLAG==1)break;
  124.                 sensor_data[2]=AM2303_Read_Byte();
  125.                 if(FLAG==1)break;
  126.                 sensor_data[3]=AM2303_Read_Byte();
  127.                 if(FLAG==1)break;
  128.                 sensor_data[4]=AM2303_Read_Byte();
  129.                 if(FLAG==1)break;  
  130.                 break;
  131.         }
  132.         //數據打印
  133. //        if(debug==0)
  134. //        {
  135. //                for(i=0;i<5;i++)
  136. //                        USART1_Printf("sensor_data[%d]=%d\r\n",i,sensor_data[i]);
  137. //        }               
  138.         //進入校準狀態
  139.         sensor_chck=sensor_data[0]+sensor_data[1]+sensor_data[2]+sensor_data[3];
  140.         if(sensor_data[4]==sensor_chck)
  141.         {
  142.                 humi= (sensor_data[0]*256+sensor_data[1])/10.0;    //濕度數據
  143.                 temper= (sensor_data[2]*256+sensor_data[3])/10.0;  //溫度數據
  144.                 USART1_Printf("%.2f,%2.0f%%\n",temper,humi);
  145. //                USART1_Printf("temper= %2f\r\n",temper);
  146.         }
  147.         else
  148.         {
  149.                 USART1_Printf("AM2303_chck_error\r\n");         //校準錯誤
  150.         }       
  151. }
復制代碼
  1. #include "delay.h"
  2. #include "usart1.h"
  3. #include "command.h"
  4. #include "am2303.h"

  5. //===============================================
  6. //配置NVIC,中斷使用方式
  7. //===============================================
  8. void NVIC_Configuration(void)
  9. {
  10.         /* Configure the NVIC Preemption Priority Bits */  
  11.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);             //中斷優先極設置0、1、2、3、4
  12.         #ifdef  VECT_TAB_RAM  
  13.         /* Set the Vector Table base location at 0x20000000 */
  14.         NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
  15.         #else  /* VECT_TAB_FLASH  */
  16.         /* Set the Vector Table base location at 0x08000000 */
  17.         NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);   
  18.         #endif
  19. }
  20. //===============================================
  21. //初始化所有外設
  22. //===============================================
  23. void Init_All_Configuration(void)
  24. {
  25.         SystemInit();
  26.         //-------------------------------------
  27.         Delay_Configuration(72);             //SYSCLK系統時鐘是72M
  28.         USART1_Configuration(115200);        //串口1配置
  29.         AM2303_Configuration();
  30. }
  31. //==========================================
  32. int main(void)
  33. {
  34.         NVIC_Configuration();
  35.         //----------------------
  36.         Init_All_Configuration();
  37.        
  38.         USART1_Printf("FLEX TEST Init OK!\r\n>>");
  39.         //==========================================
  40.         while(1)
  41.         {
  42.                 USART1_Check(USART1_Receive_Buffer); //串口處理
  43.         }
  44.         //==========================================
  45. }
復制代碼
全部資料51hei下載地址:
AM2302 溫濕度板程序stm32.7z (178.92 KB, 下載次數: 20)

評分

參與人數 1黑幣 +40 收起 理由
admin + 40 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 在线看91| 欧美久久一级特黄毛片 | 国产高清在线精品 | 男女一区二区三区 | 亚洲午夜精品 | 国产a爽一区二区久久久 | 九九视频在线观看视频6 | 欧美视频第二页 | 一本一道久久a久久精品综合 | 亚洲精品乱码久久久久v最新版 | 成人午夜精品 | 精品国产乱码久久久久久蜜柚 | 亚洲日韩中文字幕一区 | 一级黄色av电影 | 日韩一区和二区 | 羞羞视频在线观免费观看 | 天天精品在线 | 欧美影院| 亚洲综合天堂 | 91在线观| 亚洲精品福利视频 | 中文字幕1区 | 欧美视频网| 精品国产乱码久久久久久果冻传媒 | eeuss国产一区二区三区四区 | 一级黄色片免费在线观看 | 成人国产精品久久久 | 午夜极品 | 国产精品亚洲精品日韩已方 | 91视频亚洲| 午夜天堂 | 精品国产一级片 | 91视频精选 | 欧美日韩在线视频一区二区 | 欧美激情一区二区三级高清视频 | 91不卡 | 一级毛片免费看 | 亚洲性免费 | 国产高清区 | 久久久久国产精品午夜一区 | 欧美一二区 |