找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 1283|回復(fù): 0
收起左側(cè)

STM32單片機(jī)驅(qū)動(dòng)AM2301A溫濕度模塊程序

[復(fù)制鏈接]
ID:1111228 發(fā)表于 2024-6-5 08:59 | 顯示全部樓層 |閱讀模式
/************************************************************************************
//  功能描述   : AM2301A模塊測(cè)試程序
//  測(cè)試條件   : STM32F103C8T6   晶振8M  系統(tǒng)時(shí)鐘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++);
                                //超時(shí)則跳出for循環(huán)                  
                                if(Flag==1)
                                {
                                        break;
                                }
                                //判斷數(shù)據(jù)位是0還是1         

                                // 如果高電平高過預(yù)定0高電平值則數(shù)據(jù)位為 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-----
        //----校驗(yàn) 8位 == U8checkdata-----
        //----調(diào)用相關(guān)子程序如下----------
        //---- Delay();, Delay_10us();,COM();
        //--------------------------------

void AM2301A_T_RH(void)
{
                AM2301A_OUT_GPIO_Config();
          //主機(jī)拉低18ms
     AM2301A_DAT_0;
           delay_ms(18);
           AM2301A_DAT_1;
         //總線由上拉電阻拉高 主機(jī)延時(shí)20us
                 delay_us(40);   
         //主機(jī)設(shè)為輸入 判斷從機(jī)響應(yīng)信號(hào)
           AM2301A_DAT_1;
         //判斷從機(jī)是否有低電平響應(yīng)信號(hào) 如不響應(yīng)則跳出,響應(yīng)則向下運(yùn)行         
                AM2301A_IN_GPIO_Config();
           if(!AM2301A_DAT_Read)                 //T !         
           {
                                 Flag=2;
                         //判斷從機(jī)是否發(fā)出 80us 的低電平響應(yīng)信號(hào)是否結(jié)束         
                                 while((!AM2301A_DAT_Read)&&Flag++);
                                 Flag=2;
                         //判斷從機(jī)是否發(fā)出 80us 的高電平,如發(fā)出則進(jìn)入數(shù)據(jù)接收狀態(tài)
                                 while((AM2301A_DAT_Read)&&Flag++);
                         //數(shù)據(jù)接收狀態(tài)                 
                                 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;
                         //數(shù)據(jù)校驗(yàn)
                        
                                 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();
        }

具體整個(gè)驅(qū)動(dòng)文件在附件,工程模塊采用正點(diǎn)原子的就可以。

原理圖: 無
仿真: 無
代碼(.c文件和.h文件  2個(gè)): AM2301A.zip (1.74 KB, 下載次數(shù): 4)

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表