/************************************************************************************
// 功能描述 : 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)
|