找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1697|回复: 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 单片机教程网

快速回复 返回顶部 返回列表