DHT11是一款有已校準(zhǔn)數(shù)字信號(hào)輸出的溫濕度傳感器。 精度濕度+-5%RH, 溫度+-2℃,量程濕度20-90%RH, 溫度0~50℃。
dht11與單片機(jī)電路連接分析
1.引腳圖
2.dht11與單片機(jī)連接接線(xiàn)圖
DHT11 器件采用簡(jiǎn)化的單總線(xiàn)通信。單總線(xiàn)即只有一根數(shù)據(jù)線(xiàn),系統(tǒng)中的數(shù)據(jù)交換、控制均由單總線(xiàn)完成。單總線(xiàn)通常要求外接一個(gè)約 5.1kΩ 的上拉電阻,這樣,當(dāng)總線(xiàn)閑置時(shí),其狀態(tài)為高電平。由于它們是主從結(jié)極,只有主機(jī)呼叫從機(jī)時(shí),從機(jī)才能應(yīng)答,因此主機(jī)訪(fǎng)問(wèn)器件都必須嚴(yán)格遵循單總線(xiàn)序列,如果出現(xiàn)序列混亂,器件將不響應(yīng)主機(jī)。
dht11數(shù)據(jù)采集分析
1.數(shù)據(jù)總時(shí)序
用戶(hù)主機(jī)(MCU)發(fā)送一次開(kāi)始信號(hào)后,DHT11 從低功耗模式轉(zhuǎn)換到高速模式,待主機(jī)開(kāi)始信號(hào)結(jié)束后,DHT11 發(fā)送響應(yīng)信號(hào),送出 40bit 的數(shù)據(jù),幵觸發(fā)一次信采集
2.主機(jī)發(fā)送起始信號(hào)
單片機(jī)連接DHT11的DATA引腳的I/O口輸出低電平,且低電平保持時(shí)間不能小于 18ms,然后等待 DHT11 作出應(yīng)答信號(hào)。
3.檢測(cè)從機(jī)應(yīng)答信號(hào)
DHT11 的 DATA 引腳檢測(cè)到外部信號(hào)有低電平時(shí), 等待外部信號(hào)低電平結(jié)束, 延遲后 DHT11 的 DATA引腳處于輸出狀態(tài),輸出 80 微秒的低電平作為應(yīng)答信號(hào),緊接著輸出 80 微秒的高電平通知外設(shè)準(zhǔn)備接收數(shù)據(jù)。
4.接收數(shù)據(jù)
?。?)數(shù)據(jù)判定規(guī)則
位數(shù)據(jù)“0”的格式為: 50 微秒的低電平和 26-28 微秒的高電平,位數(shù)據(jù)“1”的格式為: 50 微秒的低電平加 70微秒的高電平。
接收數(shù)據(jù)時(shí)可以先等待低電平過(guò)去,即等待數(shù)據(jù)線(xiàn)拉高,再延時(shí)60us,因?yàn)?0us大于28us且小于70us,再檢測(cè)此時(shí)數(shù)據(jù)線(xiàn)是否為高,如果為高,則數(shù)據(jù)判定為1,否則為0。
(2)數(shù)據(jù)格式
一次傳送 40 位數(shù)據(jù),高位先出
8bit 濕度整數(shù)數(shù)據(jù) + 8bit 濕度小數(shù)數(shù)據(jù)+8bit 溫度整數(shù)數(shù)據(jù) + 8bit 溫度小數(shù)數(shù)據(jù)+8bit 校驗(yàn)位。
?。?)數(shù)據(jù)校正
判斷“8bit 濕度整數(shù)數(shù)據(jù) + 8bit 濕度小數(shù)數(shù)據(jù)+8bit 溫度整數(shù)數(shù)據(jù) + 8bit 溫度小數(shù)數(shù)據(jù)”的結(jié)果是否等于8bit 校驗(yàn)位。如果等于則數(shù)據(jù)接收正確,否則應(yīng)該放棄這一次的數(shù)據(jù),重新接收。
驅(qū)動(dòng)程序
#include《reg51.h》
#include《intrins.h》
#define uchar unsigned char
#define uint unsigned int
sbit Data=P3^6; //定義數(shù)據(jù)線(xiàn)
uchar rec_dat[9]; //用于顯示的接收數(shù)據(jù)數(shù)組
void DHT11_delay_us(uchar n)
{
while(--n);
}
void DHT11_delay_ms(uint z)
{
uint i,j;
for(i=z;i》0;i--)
for(j=110;j》0;j--);
}
void DHT11_start()
{
Data=1;
DHT11_delay_us(2);
Data=0;
DHT11_delay_ms(20); //延時(shí)18ms以上
Data=1;
DHT11_delay_us(30);
}
uchar DHT11_rec_byte() //接收一個(gè)字節(jié)
{
uchar i,dat=0;
for(i=0;i《8;i++) //從高到低依次接收8位數(shù)據(jù)
{
while(!Data); ////等待50us低電平過(guò)去
DHT11_delay_us(8); //延時(shí)60us,如果還為高則數(shù)據(jù)為1,否則為0
dat《《=1; //移位使正確接收8位數(shù)據(jù),數(shù)據(jù)為0時(shí)直接移位
if(Data==1) //數(shù)據(jù)為1時(shí),使dat加1來(lái)接收數(shù)據(jù)1
dat+=1;
while(Data); //等待數(shù)據(jù)線(xiàn)拉低
}
return dat;
}
void DHT11_receive() //接收40位的數(shù)據(jù)
{
uchar R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise;
DHT11_start();
if(Data==0)
{
while(Data==0); //等待拉高
DHT11_delay_us(40); //拉高后延時(shí)80us
R_H=DHT11_rec_byte(); //接收濕度高八位
R_L=DHT11_rec_byte(); //接收濕度低八位
T_H=DHT11_rec_byte(); //接收溫度高八位
T_L=DHT11_rec_byte(); //接收溫度低八位
revise=DHT11_rec_byte(); //接收校正位
DHT11_delay_us(25); //結(jié)束
if((R_H+R_L+T_H+T_L)==revise) //校正
{
RH=R_H;
RL=R_L;
TH=T_H;
TL=T_L;
}
/*數(shù)據(jù)處理,方便顯示*/
rec_dat[0]=‘0’+(RH/10);
rec_dat[1]=‘0’+(RH%10);
rec_dat[2]=‘R’;
rec_dat[3]=‘H’;
rec_dat[4]=‘ ’;
rec_dat[5]=‘ ’;
rec_dat[6]=‘0’+(TH/10);
rec_dat[7]=‘0’+(TH%10);
rec_dat[8]=‘C’;
}
}
/*這里使用lcd1602來(lái)顯示采集到的數(shù)據(jù),lcd1602驅(qū)動(dòng)程序在博主的51單片機(jī)系列博文中有詳細(xì)講解*/
void main()
{
uchar i;
lcd_init(); //lcd1602初始化
while(1)
{
DHT11_delay_ms(1500); //DHT11上電后要等待1S以越過(guò)不穩(wěn)定狀態(tài)在此期間不能發(fā)送任何指令
DHT11_receive();
lcd_write_command(0x80); //從lcd1602第一行第一個(gè)位置開(kāi)始顯示
for(i=0;i《9;i++)
lcd_write_data(rec_dat[i]); //顯示數(shù)據(jù)
}
}
評(píng)論
查看更多