您的位置:首頁>正文

「精品博文」stm32F4——DHT22(AM2302)數字溫濕度感測器讀取(六)

下面開始用STM32F4來讀取溫濕度了。

最後實現如下:

am2302.h

#ifndef _AM2302_H #define _AM2302_H #ifdef _cplusplus extern "C" { #endif #include "stm32f4xx.h" //AM2302 IO define #define AM2302_GPIO_PORT GPIOG #define AM2302_PIN GPIO_Pin_0 #define AM2302_GPIO_CLK RCC_AHB1Periph_GPIOG // #define HIGH 1 #define LOW 0 typedef struct { uint8_t humiHighByte; uint8_t humiLowByte; uint8_t temmHighByte; uint8_t temmLowByte; uint8_t check_num; }AM2302_Data_TypeDef; //帶參巨集, 可以像內聯函數一樣使用,輸出高電平或低電平 #define AM2302_DATA_OUT(a) if (a) GPIO_SetBits(AM2302_GPIO_PORT,AM2302_PIN); else GPIO_ResetBits(AM2302_GPIO_PORT,AM2302_PIN) //讀取引腳的電平 #define AM2302_DATA_IN GPIO_ReadInputDataBit(AM2302_GPIO_PORT,AM2302_PIN) void AM2302_GPIO_Config(void); static void AM2302_Mode_IPU(void); static void AM2302_Mode_Out_PP(void); uint8_t Read_AM2302(AM2302_Data_TypeDef *AM2302_Data); static uint8_t Read_Byte(void); #ifdef _cplusplus } #endif #endif

am2302.c如下:

#include "am2302.h" #include "delay.h" /* *函數名: *描述 : *輸入 : *輸出 : */ void AM2302_GPIO_Config(void) { //定義一個GPIO_InitTypeDef類型結構體 GPIO_InitTypeDef GPIO_InitStructure; //開啟GPIO 外設時鐘 RCC_AHB1PeriphClockCmd(AM2302_GPIO_CLK, ENABLE); //選擇要控制的GPIO 引腳 GPIO_InitStructure.GPIO_Pin = AM2302_PIN; //設置引腳模式為通用推挽輸出 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //設置引腳速率為50MHz GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //調用庫函數, 初始化GPIO_AM2302 GPIO_Init(AM2302_GPIO_PORT, &GPIO_InitStructure); //拉高PIN_AM2302 GPIO_SetBits(AM2302_GPIO_PORT, AM2302_PIN); } /* * 函數名:AM2302_Mode_IPU * 描述 :使AM2302-DATA引腳變為輸入模式 * 輸入 :無 * 輸出 :無 */ static void AM2302_Mode_IPU(void) { GPIO_InitTypeDef GPIO_InitStructure; /*選擇要控制的GPIOD引腳*/ GPIO_InitStructure.GPIO_Pin = AM2302_PIN; /*設置引腳模式為浮空輸入模式*/ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN ; /*調用庫函數, 初始化GPIOD*/ GPIO_Init(AM2302_GPIO_PORT, &GPIO_InitStructure); } /* * 函數名:AM2302_Mode_Out_PP * 描述 :使AM2302-DATA引腳變為輸出模式 * 輸入 :無 * 輸出 :無 */ static void AM2302_Mode_Out_PP(void) { GPIO_InitTypeDef GPIO_InitStructure; /*選擇要控制的GPIOD引腳*/ GPIO_InitStructure.GPIO_Pin = AM2302_PIN; /*設置引腳模式為通用推挽輸出*/ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; /*設置引腳速率為50MHz */ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /*調用庫函數,
初始化GPIOD*/ GPIO_Init(AM2302_GPIO_PORT, &GPIO_InitStructure); } static uint8_t Read_Byte(void) { uint8_t i, temp=0; for(i=0;ihumiHighByte= Read_Byte; AM2302_Data->humiLowByte= Read_Byte; AM2302_Data->temmHighByte= Read_Byte; AM2302_Data->temmLowByte= Read_Byte; AM2302_Data->check_num= Read_Byte; /*讀取結束, 引腳改為輸出模式*/ AM2302_Mode_Out_PP; /*主機拉高*/ AM2302_DATA_OUT(HIGH); /*檢查讀取的資料是否正確*/ tmp = AM2302_Data->humiHighByte + AM2302_Data->humiLowByte + AM2302_Data->temmHighByte+ AM2302_Data->temmLowByte; if(AM2302_Data->check_num == tmp ) return SUCCESS; else return ERROR; } else { return ERROR; } }

delay.c這裡定義了兩個delay函數, 如下;

void Delay_us(__IO u32 us) { u32 temp; SysTick->LOAD = 180 * us; SysTick->VAL = 0x00; SysTick->CTRL = 0x0005; temp = SysTick->CTRL; while((temp & 0x01) && (!(temp & (1 CTRL; } SysTick->VAL = 0x00; SysTick->CTRL = 0x00; } void Delay_ms(__IO u32 ms) { u32 temp; SysTick->LOAD = 180000 * ms; SysTick->VAL = 0x00; SysTick->CTRL = 0x0005; temp = SysTick->CTRL; while((temp & 0x01) && (!(temp & (1 CTRL; } SysTick->VAL = 0x00; SysTick->CTRL = 0x00; }

main.c

while(1) { /*調用Read_AM2302讀取溫濕度, 若成功則輸出該資訊*/ if( Read_AM2302(&AM2302_Data)==SUCCESS) { //計算出實際濕度值的10倍 RH_Value= AM2302_Data.humiHighByte*256 + AM2302_Data.humiLowByte; RH_H = RH_Value/10; RH_L = RH_Value%10; //計算出時間溫度值的10倍 TEMP_Value = AM2302_Data.temmHighByte*256 + AM2302_Data.temmLowByte; TP_H = TEMP_Value/10; TP_L = TEMP_Value%10; printf(" 讀取AM2302成功! 濕度為%d.%d %RH, 溫度為 %d.%d℃ ",RH_H,RH_L,TP_H,TP_L);//“”表示轉向一下行 } else printf("Read AM2302 ERROR! ");

原博主的代碼是沒法直接通過的, 和博主不一樣的地方有下:

(1)GPIO那裡, F1和F4是不一樣的,

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;

(2)用系統計時器編寫了兩個定時函數

void Delay_ms(__IO u32 ms)void Delay_us(__IO u32 us)

(3)最要的是這裡:

AM2302_DATA_OUT(HIGH);

先拉高, 在開始通信, 這部分在FPGA也是這樣處理的, 這裡又調試了好久。 -------千萬注意

(4)這裡是一定要這樣:

tmp = AM2302_Data->humiHighByte + AM2302_Data->humiLowByte + AM2302_Data->temmHighByte+ AM2302_Data->temmLowByte;

如果, 採用博主的

結果如下:

同類文章
Next Article
喜欢就按个赞吧!!!
点击关闭提示