日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當前位置:首頁 > 技術學院 > 技術前線
[導讀]DHT11是一款有已校準數(shù)字信號輸出的溫濕度傳感器。 精度濕度+-5%RH, 溫度+-2℃,量程濕度20-90%RH, 溫度0~50℃

一.電路連接分析

1.引腳圖

2.接線圖

DHT11 器件采用簡化的單總線通信。單總線即只有一根數(shù)據(jù)線,系統(tǒng)中的數(shù)據(jù)交換、控制均由單總線完成。單總線通常要求外接一個約 5.1kΩ 的上拉電阻,這樣,當總線閑置時,其狀態(tài)為高電平。由于它們是主從結極,只有主機呼叫從機時,從機才能應答,因此主機訪問器件都必須嚴格遵循單總線序列,如果出現(xiàn)序列混亂,器件將不響應主機。

二.數(shù)據(jù)采集分析

1.數(shù)據(jù)總時序

用戶主機(MCU)發(fā)送一次開始信號后,DHT11 從低功耗模式轉換到高速模式,待主機開始信號結束后,DHT11 發(fā)送響應信號,送出 40bit 的數(shù)據(jù),幵觸發(fā)一次信采集

2.主機發(fā)送起始信號

單片機連接DHT11的DATA引腳的I/O口輸出低電平,且低電平保持時間不能小于 18ms,然后等待 DHT11 作出應答信號。

3.檢測從機應答信號

DHT11 的 DATA 引腳檢測到外部信號有低電平時, 等待外部信號低電平結束, 延遲后 DHT11 的 DATA引腳處于輸出狀態(tài),輸出 80 微秒的低電平作為應答信號,緊接著輸出 80 微秒的高電平通知外設準備接收數(shù)據(jù)。

4.接收數(shù)據(jù)

(1)數(shù)據(jù)判定規(guī)則

位數(shù)據(jù)“0”的格式為: 50 微秒的低電平和 26-28 微秒的高電平,位數(shù)據(jù)“1”的格式為: 50 微秒的低電平加 70微秒的高電平。

接收數(shù)據(jù)時可以先等待低電平過去,即等待數(shù)據(jù)線拉高,再延時60us,因為60us大于28us且小于70us,再檢測此時數(shù)據(jù)線是否為高,如果為高,則數(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 校驗位。

(3)數(shù)據(jù)校正

判斷“8bit 濕度整數(shù)數(shù)據(jù) + 8bit 濕度小數(shù)數(shù)據(jù)+8bit 溫度整數(shù)數(shù)據(jù) + 8bit 溫度小數(shù)數(shù)據(jù)”的結果是否等于8bit 校驗位。如果等于則數(shù)據(jù)接收正確,否則應該放棄這一次的數(shù)據(jù),重新接收。

三.驅動程序

#include

#include

#define uchar unsigned char

#define uint unsigned int

sbit Data=P3^6; //定義數(shù)據(jù)線

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); //延時18ms以上

Data=1;

DHT11_delay_us(30);

}

uchar DHT11_rec_byte() //接收一個字節(jié)

{

uchar i,dat=0;

for(i=0;i<8;i++) //從高到低依次接收8位數(shù)據(jù)

{

while(!Data); 等待50us低電平過去

DHT11_delay_us(8); //延時60us,如果還為高則數(shù)據(jù)為1,否則為0

dat<<=1; //移位使正確接收8位數(shù)據(jù),數(shù)據(jù)為0時直接移位

if(Data==1) //數(shù)據(jù)為1時,使dat加1來接收數(shù)據(jù)1

dat+=1;

while(Data); //等待數(shù)據(jù)線拉低

}

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); //拉高后延時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); //結束

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來顯示采集到的數(shù)據(jù),lcd1602驅動程序在博主的51單片機系列博文中有詳細講解*/

void main()

{

uchar i;

lcd_init(); //lcd1602初始化

while(1)

{

DHT11_delay_ms(1500); //DHT11上電后要等待1S以越過不穩(wěn)定狀態(tài)在此期間不能發(fā)送任何指令

DHT11_receive();

lcd_write_command(0x80); //從lcd1602第一行第一個位置開始顯示

for(i=0;i<9;i++)

lcd_write_data(rec_dat[i]); //顯示數(shù)據(jù)

}

}

本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯(lián)系該專欄作者,如若文章內容侵犯您的權益,請及時聯(lián)系本站刪除( 郵箱:macysun@21ic.com )。
換一批
延伸閱讀
關閉