【无标题】基于51单片机和DHT11的温湿度检测系统
?
基于51單片機的溫濕度檢測系統(tǒng)
摘 要:設(shè)計一款能夠?qū)崟r檢測當(dāng)前空氣溫度和濕度的裝置。主控芯片采用STC12C5A60S2芯片,溫濕度傳感器采用DHT11數(shù)字溫濕度傳感器,顯示屏幕采用OLED屏幕。整個設(shè)計采用模塊化設(shè)計,分別為三大模塊。分別為MCU模塊,檢測模塊和顯示模塊。當(dāng)環(huán)境中的溫濕度發(fā)生變化時,DHT11溫濕度傳感器隨著溫度、濕度的變化而變化,然后將變化的電阻通過轉(zhuǎn)換電路和轉(zhuǎn)換信號檢測為相對應(yīng)變化的電壓,然后把模擬電壓信號由A/D轉(zhuǎn)換器轉(zhuǎn)換為數(shù)字信號并送入到單片機中,單片機處理之后控制OLED顯示屏顯示出檢測出的溫度以及濕度的量值。
關(guān)鍵詞:STC12C5A60S2芯片;DHT11數(shù)字溫濕度傳感器;OLED顯示屏
1.1總體設(shè)計方案
本設(shè)計要實現(xiàn)的功能是:實時檢測當(dāng)前空氣中的溫度和濕度并將檢測結(jié)果通過OLED顯示屏顯示出來。
1.2系統(tǒng)設(shè)計簡圖
2.硬件選擇
由于51單片機已經(jīng)上市多年,網(wǎng)上有很多相關(guān)的資料且很多同學(xué)都掌握了51單片機的基礎(chǔ)性知識;OLDE工作方式和原理比較復(fù)雜,網(wǎng)上有許多相關(guān)的庫,使用時只需調(diào)用庫即可。所以接下來將重點介紹DHT11溫濕度傳感器的工作原理。
2.1 DHT11溫濕度傳感器
2.1.1 DHT11知識儲備
DHT11是一款有已校準(zhǔn)數(shù)字信號輸出的溫濕度傳感器。 其精度濕度±5%RH, 溫度±2℃,量程濕度20-90%RH,溫度0~50℃。傳感器包括一個電阻感濕元件和一個NTC測溫元件,并與一個高性能8位單片機相連接。因此該產(chǎn)品具有品質(zhì)卓越、超快響應(yīng)、抗干擾能力強、性價比高等優(yōu)點。每個DHT11傳感器都在極為精確的濕度校驗室中進行校準(zhǔn),校準(zhǔn)系數(shù)以程序的形式存在OTP內(nèi)存中,傳感器內(nèi)部在檢測信號的處理過程中要調(diào)用這些校準(zhǔn)系數(shù),采用單線制串行接口[5],使系統(tǒng)集成變得簡易快捷。
2.1.2 DHT11通信協(xié)議及數(shù)據(jù)格式
DHT11 采用單總線協(xié)議與單片機通信,單片機發(fā)送一次復(fù)位信號后,DHT11 從低功耗模式轉(zhuǎn)換到高速模式,等待主機復(fù)位結(jié)束后,DHT11 發(fā)送響應(yīng)信號,并拉高總線準(zhǔn)備傳輸數(shù)據(jù)。一次完整的數(shù)據(jù)為 40bit,按照高位在前,低位在后的順序傳輸。
數(shù)據(jù)格式為:8bit 濕度整數(shù)數(shù)據(jù)+8bit 濕度小數(shù)數(shù)據(jù)+8bit 溫度整數(shù)數(shù)+8bit 溫度小數(shù)數(shù)據(jù)+8bit 校驗和,一共 5 字節(jié)(40bit)數(shù)據(jù)。由于 DHT11 分辨率只能精確到個位,所以小數(shù)部分是數(shù)據(jù)全為 0。校驗和為前 4 個字節(jié)數(shù)據(jù)相加,校驗的目的是為了保證數(shù)據(jù)傳輸?shù)臏?zhǔn)確性。
2.1.3 DHT11操作時序
(1)主機發(fā)送復(fù)位信號:DHT11 的初始化過程同樣分為復(fù)位信號和響應(yīng)信號。首先主機拉低總線至少 18ms,然后再拉高總線,延時 20~40us,取中間30us,此時復(fù)位信號發(fā)送完畢。
(2)dht11發(fā)送響應(yīng)信號:DHT11 檢測到復(fù)位信號后,觸發(fā)一次采樣,并拉低總線 80us 表示響應(yīng)信號,告訴主機數(shù)據(jù)已經(jīng)準(zhǔn)備好了;然后 DHT11 拉高總線 80us,之后開始傳輸數(shù)據(jù)。當(dāng)復(fù)位信號發(fā)送完畢后,如果檢測到總線被拉低,就每隔 1us 計數(shù)一次,直至總線拉高,計算低電平時間;當(dāng)總線被拉高后重新計數(shù)檢測 80us 的高電平。如果檢測到響應(yīng)信號之后的80us 高電平,就準(zhǔn)備開始接收數(shù)據(jù)。實際上 DHT11 的響應(yīng)時間并不是標(biāo)準(zhǔn)的 80us,往往存在誤差,當(dāng)響應(yīng)時間處于 30~90us 之間時就可以認(rèn)定響應(yīng)成功。
3.程序源碼
3.1主程序代碼
#include "STC12C5A60S2.h"
#include "Delay.h"
#include "dht11.h"
#include "LCD1602.h"
#include "OLED.h"
void main()
{
??? unsigned char Str[3]="00\0";
??? OLED_Init();//oled初始化
??? OLED_Put16x16CNstr(0,0,"濕度:",1);
??? OLED_Put16x16CNstr(0,45,"溫度:",1);
??? OLED_Refresh_AllGDRAM();//刷新顯示
??? Delay(500);//大約等待1.5秒
??? Delay(500);
??? Delay(500);
??? while(1)
??? {
???????????? DHT11_receive(dat);//溫濕度傳感器開始采集數(shù)據(jù)
???????????? Str[0]=dat[2]/10%10+0x30;
???????????? Str[1]=dat[2]%10+0x30;
???????? ??? OLED_Put12x12CNstr(40,5,Str,1);//顯示濕度的整數(shù)位
???????????? OLED_Put12x12CNstr(52,5,".",1);//整數(shù)和小數(shù)之間的點
???????????? Str[1]=dat[3]/10%10+0x30;
???????????? Str[0]=dat[3]%10+0x30;
???????????? OLED_Put12x12CNstr(55,5,Str,1);//顯示濕度的小數(shù)位
???????????? OLED_Put12x12CNstr(70,5,"%RH",1);//濕度單位
???????????? Str[0]=dat[0]/10%10+0x30;
???????????? Str[1]=dat[0]%10+0x30;
???????????? OLED_Put12x12CNstr(40,50,Str,1);//顯示溫度的整數(shù)位
???????????? OLED_Put12x12CNstr(52,50,".",1);//整數(shù)和小數(shù)之間的點
???????????? Str[1]=dat[1]/10%10+0x30;
???????????? Str[0]=dat[1]%10+0x30;
???????????? OLED_Put12x12CNstr(55,50,Str,1);//顯示溫度的小數(shù)位
???????????? OLED_Put12x12CNstr(70,40,".",1);
???????????? OLED_Put12x12CNstr(75,50,"C",1);
???????????? OLED_Refresh_AllGDRAM();//刷新顯示
??? }
}
3.2 dht11模塊源碼
#include "STC12C5A60S2.h"
#include "Delay.h"
#include <intrins.h>
#include "dht11.h"
void DHT11_delay_us(unsigned char n)//微秒
{
??? while(--n);
}
void DHT11_delay_ms(unsigned int z)//毫秒
{
?? unsigned int i,j;
?? for(i=z;i>0;i--)
????? for(j=110;j>0;j--);
}
void dht11_start(void)//dht11初始化
{
??? dht=1;
??? DHT11_delay_us(2);
??? dht=0;//主機從高電平轉(zhuǎn)為低電平
??? DHT11_delay_ms(220);//主機拉低20ms
??? dht=1;//主機拉高,然后模塊將總線拉低
??? DHT11_delay_us(50);//延時50微秒
??? if(dht==0)//讀到0,表示檢測到響應(yīng)信號
??? {
??????? led=0;//亮燈表示響應(yīng)到信號
??? }
??? else
??? {
??????? led=1;//表示沒檢測到信號
??? }
}
unsigned char DHT11_rec_byte()????? //接收一個字節(jié)
{
?? unsigned char i,dat=0;
? for(i=0;i<8;i++)??? //從高到低依次接收8位數(shù)據(jù)
?? {?????????
????? while(!dht);?? 等待50us低電平過去
????? DHT11_delay_us(80);???? //延時60us,如果還為高則數(shù)據(jù)為1,否則為0
????? dat<<=1;?????????? //移位使正確接收8位數(shù)據(jù),數(shù)據(jù)為0時直接移位
????? if(dht==1)??? //數(shù)據(jù)為1時,使dat加1來接收數(shù)據(jù)1
???????? dat+=1;
????? while(dht);? //等待數(shù)據(jù)線拉低???
??? }?
??? return dat;
}
void DHT11_receive(unsigned char dat[])????? //接收40位的數(shù)據(jù)
{
??? unsigned char R_H,R_L,T_H,T_L,revise;
??? dht11_start();
??? if(dht==0)
??? {
??????? while(dht==0);?? //等待拉高????
??????? DHT11_delay_us(250);? //拉高后延時超過80us(80us時候下降沿,135時候上升)
??????? 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)??? //校正
??????? {
??????????? dat[0]=T_H; //溫度高8位(表示整數(shù)部分)
??????????? dat[1]=T_L; //溫度低8位(表示小數(shù)部分)
??????????? dat[2]=R_H; //濕度高8位(表示整數(shù)部分)
??????????? dat[3]=R_L; //濕度低8位(表示小數(shù)部分)
??????? }
??? }
}
4.實際效果圖
總結(jié)
以上是生活随笔為你收集整理的【无标题】基于51单片机和DHT11的温湿度检测系统的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hive创建角色并赋权
- 下一篇: GAN 简介