- DHT11頭文件:
- #ifndef _DHT11_H_
- #define _DHT11_H_
- #include "stm32f10x.h"
- #include "bitband_cm3.h" // 位帶操作頭文件
- #define DHT11_REV_DATA PBin(6)
- #define DHT11_SEND_DATA PBout(6)
- void DHT11_Init(void);
- int DHT11_Read_Data(uint8_t *Temp_H,uint8_t* Temp_L,uint8_t* RH_H,uint8_t* RH_L);
- #endif
- DHT11源文件:
- #include "dht11.h"
- #include "systick.h"
- #if 0 //0---庫函數(shù) 1---寄存器
- // DTH11 ---> PB6
- // 輸出模式
- void DHT11_OUT(void)
- {
- GPIOB->CRL &=~ (0xf<<24);
- GPIOB->CRL |= (3<<24);//通用推挽輸出模式 50M
- }
- // 輸入模式
- void DHT11_IN(void)
- {
- GPIOB->CRL &=~ (0xf<<24);
- GPIOB->CRL |= (4<<24);//配置浮空輸入(外接上拉電阻)
- }
- //DHT11初始化
- void DHT11_Init(void)
- {
- RCC->APB2ENR |= (1<<3); // 開啟PB端口時鐘
- DHT11_IN( );// DHT11 的DATA 引腳處于輸入狀態(tài),時刻檢測外部信號
- delay_ms(500);
- delay_ms(500);//DHT11 上電后要等待 1S 以越過不穩(wěn)定狀態(tài)在此期間不能發(fā)送任何指令
- }
- #else
- // DTH11 ---> PB6
- // 輸出模式
- void DHT11_OUT(void)
- {
- GPIO_InitTypeDef GPIO_InitStruct;
- GPIO_InitStruct.GPIO_Pin=GPIO_Pin_6;
- GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;//通用推挽輸出
- GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;//50M
- GPIO_Init(GPIOB, &GPIO_InitStruct);//PB6
- }
- // 輸入模式
- void DHT11_IN(void)
- {
- GPIO_InitTypeDef GPIO_InitStruct;
- GPIO_InitStruct.GPIO_Pin=GPIO_Pin_6;
- GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;//配置浮空輸入(外接上拉電阻)
- GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;//50M
- GPIO_Init(GPIOB, &GPIO_InitStruct);//PB6
- }
- //DHT11初始化
- void DHT11_Init(void)
- {
- RCC->APB2ENR |= (1<<3); // 開啟PB端口時鐘
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//開啟PB端口時鐘.
- DHT11_IN( );// DHT11 的DATA 引腳處于輸入狀態(tài),時刻檢測外部信號
- delay_ms(500);
- delay_ms(500);//DHT11 上電后要等待 1S 以越過不穩(wěn)定狀態(tài)在此期間不能發(fā)送任何指令
- }
- #endif
- //起始信號
- void DHT11_Start(void)
- {
- DHT11_SEND_DATA=0;
- delay_ms(18);
- DHT11_SEND_DATA=1;
- delay_us(20);//釋放總線
- }
- //應答信號
- //返回值 0--無應答 1--有應答
- u8 DHT11_Ack(void)
- {
- if(DHT11_REV_DATA!=0)
- {
- return 0;
- }
- while(DHT11_REV_DATA==0);//等待80us低電平應答結(jié)束
-
- while(DHT11_REV_DATA==1);//等待80us高電平應答結(jié)束
-
- return 1;
- }
- //讀取一個字節(jié)數(shù)據(jù)
- u8 DHT11_Read_Byte(void)
- {
- u8 data=0;
- u8 i;
- //接受數(shù)據(jù),每個數(shù)據(jù)以50us低電平開始
- for(i=0;i<8;i++)
- {
- data <<= 1;
- while(!DHT11_REV_DATA);//等待發(fā)送數(shù)據(jù)的時序變?yōu)楦唠娖?br />
- delay_us(40);//23~27u為數(shù)據(jù)0,68~74us為u數(shù)據(jù)1
- if(DHT11_REV_DATA==1)
- {
- data |=1;//數(shù)據(jù)1
- while(DHT11_REV_DATA);//等待高電平應答結(jié)束
- }
- }
- return data;
- }
- //讀取溫濕度
- int DHT11_Read_Data(u8 *Temp_H,u8* Temp_L,u8* RH_H,u8* RH_L)
- {
- u8 check;
- DHT11_OUT( );
- DHT11_Start( );
- DHT11_IN( );//切換為輸入
- if( DHT11_Ack( )==0 )
- {
- return -1;
- }
-
- //讀取數(shù)據(jù)
- *RH_H=DHT11_Read_Byte( );
- *RH_L=DHT11_Read_Byte( );
- *Temp_H=DHT11_Read_Byte( );
- *Temp_L=DHT11_Read_Byte( );
- check=DHT11_Read_Byte( );
-
- //結(jié)束讀取
- delay_ms(50);
- DHT11_OUT( );//切換為輸出
- DHT11_SEND_DATA=1;//釋放總線
-
- //校驗數(shù)據(jù)
- if(check !=(*Temp_H+*Temp_L+*RH_H+*RH_L) )
- {
- return -2;
- }
- return 0;
- }
復制代碼
【必讀】版權(quán)免責聲明
1、本主題所有言論和內(nèi)容純屬會員個人意見,與本論壇立場無關(guān)。2、本站對所發(fā)內(nèi)容真實性、客觀性、可用性不做任何保證也不負任何責任,網(wǎng)友之間僅出于學習目的進行交流。3、對提供的數(shù)字內(nèi)容不擁有任何權(quán)利,其版權(quán)歸原著者擁有。請勿將該數(shù)字內(nèi)容進行商業(yè)交易、轉(zhuǎn)載等行為,該內(nèi)容只為學習所提供,使用后發(fā)生的一切問題與本站無關(guān)。 4、本網(wǎng)站不保證本站提供的下載資源的準確性、安全性和完整性;同時本網(wǎng)站也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的損失或傷害。 5、本網(wǎng)站所有軟件和資料均為網(wǎng)友推薦收集整理而來,僅供學習用途使用,請務必下載后兩小時內(nèi)刪除,禁止商用。6、如有侵犯你版權(quán)的,請及時聯(lián)系我們(電子郵箱1370723259@qq.com)指出,本站將立即改正。
|