目錄
?
一,產(chǎn)品介紹
二,產(chǎn)品亮點(diǎn)
三,產(chǎn)品參數(shù)
四,引腳連接及通信說(shuō)明
?五,原理講解
六,源碼
1,DHR11.C
2.DHR11.H
3,main.c
一,產(chǎn)品介紹
二,產(chǎn)品亮點(diǎn)

三,產(chǎn)品參數(shù)
四,引腳連接及通信說(shuō)明
引腳說(shuō)明1、VDD供電3.3~5.5VDC2、DATA串行數(shù)據(jù),單總線(xiàn)3、NC空腳4、GND接地,電源負(fù)極
◎單總線(xiàn)說(shuō)明DHT11器件采用簡(jiǎn)化的單總線(xiàn)通信。單總線(xiàn)即只有一根數(shù)據(jù)線(xiàn),系統(tǒng)中的數(shù)據(jù)交換、控制均由單總線(xiàn)完成。設(shè)備(主機(jī)或從機(jī))通過(guò)一個(gè)漏極開(kāi)路或三態(tài)端口連至該數(shù)據(jù)線(xiàn),以允許設(shè)備在不發(fā)送數(shù)據(jù)時(shí)能夠釋放總線(xiàn),而讓其它設(shè)備使用總線(xiàn);單總線(xiàn)通常要求外接一個(gè)約 4.7kΩ的上拉電阻,這樣,當(dāng)總線(xiàn)閑置時(shí),其狀態(tài)為高電平。由于它們是主從結(jié)構(gòu),只有主機(jī)呼叫從機(jī)時(shí),從機(jī)才能應(yīng)答,因此主機(jī)訪(fǎng)問(wèn)器件都必須嚴(yán)格遵循單總線(xiàn)序列,如果出現(xiàn)序列混亂,器件將不響應(yīng)主機(jī)。◎單總線(xiàn)傳送數(shù)據(jù)位定義DATA用于微處理器與DHT11之間的通訊和同步,采用單總線(xiàn)數(shù)據(jù)格式,一次傳送40位數(shù)據(jù),高位先出。◎數(shù)據(jù)格式8bit濕度整數(shù)數(shù)據(jù)+8bit濕度小數(shù)數(shù)據(jù)+8bit溫度整數(shù)數(shù)據(jù)+8bit溫度小數(shù)數(shù)據(jù)+8bit校驗(yàn)位。注:其中濕度小數(shù)部分為0。◎校驗(yàn)位數(shù)據(jù)定義“8bit濕度整數(shù)數(shù)據(jù)+8bit濕度小數(shù)數(shù)據(jù)+8bit溫度整數(shù)數(shù)據(jù)+8bit溫度小數(shù)數(shù)據(jù)”8bit校驗(yàn) 位等于所得結(jié)果的末8位。
?五,原理講解
?
DHT11編碼步驟:
一. 單片機(jī)上點(diǎn)后1s內(nèi)不讀?。ú恢匾?/p>
二. 主機(jī)(單片機(jī))發(fā)送起始信號(hào):
1.主機(jī)先拉高data。
2.拉低data延遲18ms。(大于18小于30ms)
3.拉高data(通過(guò)此操作將單片機(jī)引腳設(shè)置為輸入)。圖2
三. 從機(jī)(DHT11)收到起始信號(hào)后進(jìn)行應(yīng)答:
?從機(jī)拉低data,主機(jī)讀取到data線(xiàn)被拉低持續(xù)83us后從機(jī)拉高data線(xiàn), 持續(xù)87us,直到高電平結(jié)束,意味著主機(jī)可以開(kāi)始接受數(shù)據(jù)。? ? ? ? ? ? ? ? ? ?圖3
四. 主機(jī)開(kāi)始接收數(shù)據(jù):
1.主機(jī)先把data線(xiàn)拉高(io設(shè)置為輸入)。
2.從機(jī)把data線(xiàn)拉低,主機(jī)讀取data線(xiàn)電平,直到低電平結(jié)束(大約50us)
? 從機(jī)拉高data線(xiàn)后,延遲40us左右(28~70us之間)主機(jī)再次讀取data線(xiàn)電平,如果為低電平,則為“0”,如果為高電平,則為“1”。
(DTH11.C中有一部分u8 DHT11_receive_bit(void)獲得一個(gè)字節(jié)過(guò)程所得格式0或1,是通過(guò)從機(jī)信號(hào)高電平的持續(xù)時(shí)長(zhǎng)判斷的,如果60us之后任然為高電平則為格式1,反之為格式0)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?圖4.2
3.繼續(xù)重復(fù)上述1,2步驟累計(jì)40次。
五. data線(xiàn)拉低50us代表讀取結(jié)束



六,源碼
1,DHR11.C
-
#include "DHT11.h" #include "delay.h" #include "usart.h" u8 receive_R_dat[10];//?¨ò?ò???êy?Y×é u8 receive_T_dat[10];//?¨ò?ò???êy?Y×é void DHT11_Init(void) //′??D?÷3?ê??ˉ { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE); //ê1?üGPIO_Eê±?ó GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; //PE.12 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ; //í¨ó?í?íìê?3? GPIO_Init(GPIOE, &GPIO_InitStructure);//3?ê??ˉGPIOE12 } void DHT11_Start(void) //·¢?í?eê?D?o? { GPIO_SetBits(GPIOE,GPIO_Pin_12); delay_us(10); //à-??μ???μè′y GPIO_ResetBits(GPIOE,GPIO_Pin_12); delay_ms(25); //μíμ???±£3?ê±??2?D?óú18MS2?′óóú30MS GPIO_SetBits(GPIOE,GPIO_Pin_12); delay_us(30); //à-??μ???·¢?í?eê?D?o? } u8 DHT11_receive_bit(void) //′??D?÷·μ???ìó|D?o??£?óê?ò???×??ú { u8 i,dat=0; GPIO_ResetBits(GPIOE,GPIO_Pin_12); //à-?? delay_us(81); GPIO_SetBits(GPIOE,GPIO_Pin_12); //à-μí delay_us(85); //?aê?×?±?·¢?íêy?Y for(i=0;i<8;i++) { PEout(12)=0; //à-μí3?D?83US delay_us(50); PEout(12)=1; //à-??3?D? delay_us(60); dat<<=1; if(PEout(12)==1) //è?1???μ???ê±??3?1y60us?£?a?±1?°×′ì? dat+=1; while(PEout(12)); } return dat; //·μ??êy?Y } void DHT11_receive_dat(void) { u8 R_H,R_L,T_H,T_L,RH,RL,TH,TL,Checkout; DHT11_Start();//?aê??eê??ìó|?£?óê?40??êy?Y if(PEout(12)==0) { while(PEout(12)==0); //μè′yà-?? delay_us(80); //à-??oó?óê±80us R_H=DHT11_receive_bit(); R_L=DHT11_receive_bit(); T_L=DHT11_receive_bit(); T_L=DHT11_receive_bit(); Checkout=DHT11_receive_bit(); delay_us (50); } /*D£?éêy?Y*/ if((R_H+R_L+T_H+T_L)==Checkout) { R_H=RH; R_L=RL; T_H=TH; T_L=TL; } /*êy?Y′|àí*/ receive_R_dat[1]=RH/10+0x30; receive_R_dat[2]=RH%10+0x30; receive_R_dat[3]='.'; receive_R_dat[4]=RL/10+0x30; receive_R_dat[5]=RL%10+0x30; receive_R_dat[6]='%'; receive_T_dat[1]=TH/10+0x30; receive_T_dat[2]=TH%10+0x30; receive_T_dat[3]='.'; receive_T_dat[4]=TL/10+0X30; receive_T_dat[5]=TL%10+0X30; receive_T_dat[6]='^'; receive_T_dat[7]='C'; printf ("Humidity:\r\n"); MyUSART_SendArr(receive_R_dat,7); printf("\r\n"); printf ("Temperture:\r\n"); MyUSART_SendArr(receive_T_dat,8); printf("\r\n"); }
2.DHR11.H
#ifndef __DHT11_H
#define __DHT11_H
#include "stm32f10x.h"
void DHT11_Init(void); //′??D?÷3?ê??ˉ
void DHT11_Start(void); //·¢?í?eê?D?o?
u8 DHT11_receive_bit(void) ; //′??D?÷·μ???ìó|D?o??£?óê?ò???×??ú
void DHT11_receive_dat(void);//μ?μ?êy?Y×é
extern u8 receive_R_dat[10];//?¨ò?ò???êy?Y×é
extern u8 receive_T_dat[10];//?¨ò?ò???êy?Y×é
#endif
3,main.c
#include "sys.h"
#include "DHT11.h"
#include "usart.h"
#include "delay.h"
int main(void)
{
// u8 receive_R_dat[10];//?¨ò?ò???êy?Y×é
// u8 receive_T_dat[10];//?¨ò?ò???êy?Y×é
delay_init(); //?óê±oˉêy3?ê??ˉ
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //éè??NVIC?D??·?×é2:2???à??ó??è??£?2???ìó|ó??è??
uart_init(115200); //′??ú3?ê??ˉ?a115200
DHT11_Init() ; //??êa?è′??D?÷3?ê??ˉ
printf("溫濕度傳感器初始化成功:\r\n");
while(1)
{
DHT11_receive_dat();
delay_ms (10000);
}
}
/*注釋*/
receive_R_dat[1]=RH/10+0x30;? ? 二進(jìn)制轉(zhuǎn)換十進(jìn)制
?? ?receive_R_dat[2]=RH%10+0x30;
?? ?receive_R_dat[3]='.';
?? ?receive_R_dat[4]=RL/10+0x30;
?? ?receive_R_dat[5]=RL%10+0x30;
?? ?receive_R_dat[6]='%';
?? ??? ?receive_T_dat[1]=TH/10+0x30;
?? ?receive_T_dat[2]=TH%10+0x30;
?? ?receive_T_dat[3]='.';
?? ?receive_T_dat[4]=TL/10+0X30;
?? ?receive_T_dat[5]=TL%10+0X30;
?? ?receive_T_dat[6]='^';
?? ?receive_T_dat[7]='C';?? ?/*計(jì)算*/文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-403725.html
00110101+00000000+00011000+00000100=01010001接收數(shù)據(jù)正確:濕度:00110101(整數(shù))=35H=53%RH? ? ? ? ? ?00000000(小數(shù))=00H=0.0%RH=>53%RH+0.0%RH=53.0%RH溫度:00011000(整數(shù))=18H=24℃???????????00000100(小數(shù))=04H=0.4℃=>24℃+0.4℃=24.4℃
最后,歡迎各位指正,互相交流互相學(xué)習(xí)?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-403725.html
到了這里,關(guān)于(STM32F103單片機(jī))DHT11溫濕度傳感器的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!