找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 588|回复: 0
打印 上一主题 下一主题
收起左侧

STM32单片机驱动AM2301A温湿度模块程序

[复制链接]
跳转到指定楼层
楼主
ID:1111228 发表于 2024-6-5 08:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/************************************************************************************
//  功能描述   : AM2301A模块测试程序
//  测试条件   : STM32F103C8T6   晶振8M  系统时钟72M
接线
AM2301A -------------------------------STM32F103C8T6
VCC------------------------------------5V
GND------------------------------------GND
SDA------------------------------------PA4

*************************************************************************************/

以下为.c文件
#include "AM2301A.h"
#include "delay.h"
uint16_t R_Date,T_Date;
uint8_t  Flag;
uint8_t  temp;
uint8_t  T_data_H,T_data_L,RH_data_H,RH_data_L,U8checkdata;
uint8_t  T_data_H_temp,T_data_L_temp,RH_data_H_temp,RH_data_L_temp,checkdata_temp;
uint8_t  comdata;

//AM2301A配置为输出模式,引脚是GPIOA_4
void AM2301A_OUT_GPIO_Config(void)
{
                        GPIO_InitTypeDef GPIO_InitStructure;
                        RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE);

                        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
                        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
                        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
                        GPIO_Init(GPIOA, &GPIO_InitStructure);
        
}
//AM2301A配置为上拉输入模式,引脚是GPIOA_4
void AM2301A_IN_GPIO_Config(void)
{
                        GPIO_InitTypeDef GPIO_InitStructure;
                        RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE);

                        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
                        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
                        GPIO_Init(GPIOA, &GPIO_InitStructure);
        
}
void AM2301A_COM(void)
{

                uint8_t i;
                AM2301A_IN_GPIO_Config();
                for(i=0;i<8;i++)           
                {

                                Flag=2;        
                                while((!AM2301A_DAT_Read)&&Flag++);
                                delay_us(30);
                                temp=0;
                                if(AM2301A_DAT_Read)
                                {
                                        temp=1;
                                }
                                Flag=2;
                                while((AM2301A_DAT_Read)&&Flag++);
                                //超时则跳出for循环                  
                                if(Flag==1)
                                {
                                        break;
                                }
                                //判断数据位是0还是1         

                                // 如果高电平高过预定0高电平值则数据位为 1

                                comdata<<=1;
                                comdata|=temp; //0
                }//rof
                AM2301A_OUT_GPIO_Config();
}

        //--------------------------------
        //-----湿度读取子程序 ------------
        //--------------------------------
        //----以下变量均为全局变量--------
        //----温度高8位== data_H------
        //----温度低8位== T_data_L------
        //----湿度高8位== RH_data_H-----
        //----湿度低8位== RH_data_L-----
        //----校验 8位 == U8checkdata-----
        //----调用相关子程序如下----------
        //---- Delay();, Delay_10us();,COM();
        //--------------------------------

void AM2301A_T_RH(void)
{
                AM2301A_OUT_GPIO_Config();
          //主机拉低18ms
     AM2301A_DAT_0;
           delay_ms(18);
           AM2301A_DAT_1;
         //总线由上拉电阻拉高 主机延时20us
                 delay_us(40);   
         //主机设为输入 判断从机响应信号
           AM2301A_DAT_1;
         //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行         
                AM2301A_IN_GPIO_Config();
           if(!AM2301A_DAT_Read)                 //T !         
           {
                                 Flag=2;
                         //判断从机是否发出 80us 的低电平响应信号是否结束         
                                 while((!AM2301A_DAT_Read)&&Flag++);
                                 Flag=2;
                         //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
                                 while((AM2301A_DAT_Read)&&Flag++);
                         //数据接收状态                 
                                 AM2301A_COM();
                                 RH_data_H_temp=comdata;
                                 AM2301A_COM();
                                 RH_data_L_temp=comdata;
                                 AM2301A_COM();
                                 T_data_H_temp=comdata;
                                 AM2301A_COM();
                                 T_data_L_temp=comdata;
                                 AM2301A_COM();
                                 checkdata_temp=comdata;
                                 AM2301A_DAT_1;
                         //数据校验
                        
                                 temp=(T_data_H_temp+T_data_L_temp+RH_data_H_temp+RH_data_L_temp);
                                 if(temp==checkdata_temp)
                                 {
                                                        RH_data_H=RH_data_H_temp;
                                                        RH_data_L=RH_data_L_temp;
                                                        T_data_H=T_data_H_temp;
                                                        T_data_L=T_data_L_temp;
                                                        U8checkdata=checkdata_temp;
                                                        R_Date=RH_data_H_temp*256+RH_data_L_temp;
                                                        T_Date=T_data_H_temp*256+T_data_L_temp;
                                 }//fi
           }//fi
                AM2301A_OUT_GPIO_Config();
        }

具体整个驱动文件在附件,工程模块采用正点原子的就可以。

原理图: 无
仿真: 无
代码(.c文件和.h文件  2个): AM2301A.zip (1.74 KB, 下载次数: 4)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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