/************************************************************************************
// 功能描述 : 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)
2024-6-5 08:58 上傳
點擊文件名下載附件
|