日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > windows >内容正文

windows

【无标题】基于51单片机和DHT11的温湿度检测系统

發(fā)布時(shí)間:2024/3/12 windows 68 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【无标题】基于51单片机和DHT11的温湿度检测系统 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?

基于51單片機(jī)的溫濕度檢測系統(tǒng)

摘 要:設(shè)計(jì)一款能夠?qū)崟r(shí)檢測當(dāng)前空氣溫度和濕度的裝置。主控芯片采用STC12C5A60S2芯片,溫濕度傳感器采用DHT11數(shù)字溫濕度傳感器,顯示屏幕采用OLED屏幕。整個(gè)設(shè)計(jì)采用模塊化設(shè)計(jì),分別為三大模塊。分別為MCU模塊,檢測模塊和顯示模塊。當(dāng)環(huán)境中的溫濕度發(fā)生變化時(shí),DHT11溫濕度傳感器隨著溫度、濕度的變化而變化,然后將變化的電阻通過轉(zhuǎn)換電路和轉(zhuǎn)換信號檢測為相對應(yīng)變化的電壓,然后把模擬電壓信號由A/D轉(zhuǎn)換器轉(zhuǎn)換為數(shù)字信號并送入到單片機(jī)中,單片機(jī)處理之后控制OLED顯示屏顯示出檢測出的溫度以及濕度的量值。

關(guān)鍵詞:STC12C5A60S2芯片;DHT11數(shù)字溫濕度傳感器;OLED顯示屏

  • 整體方案
  • 1.1總體設(shè)計(jì)方案

    本設(shè)計(jì)要實(shí)現(xiàn)的功能是:實(shí)時(shí)檢測當(dāng)前空氣中的溫度和濕度并將檢測結(jié)果通過OLED顯示屏顯示出來。

  • 硬件準(zhǔn)備:1塊51單片機(jī)學(xué)習(xí)開發(fā)板(主控芯片為STC12C5A60S2);1個(gè)DHT11溫濕度傳感器;一塊0.96寸的OLED 屏幕;杜邦線若干;一根下載線;Keil5編程軟件;stc-isp上位機(jī)。
  • 組裝方式:首先先將OLED和dht11的Vcc接+5V電壓端口,GND接到開發(fā)板的GND端口。其次將OLED和dht11的其他的端口分別與定義好的IO口相連。
  • 實(shí)現(xiàn)過程:單片機(jī)上電后,約過1秒后dht11開始正常工作。Dht11將變化的電阻通過轉(zhuǎn)換電路和轉(zhuǎn)換信號檢測為相對應(yīng)變化的電壓,然后把模擬電壓信號由A/D轉(zhuǎn)換器轉(zhuǎn)換為數(shù)字信號并送入到單片機(jī)中,單片機(jī)接受到傳回的數(shù)字信號后進(jìn)行處理轉(zhuǎn)換,再將電信號傳給OLED顯示屏,OLED接受到單片機(jī)傳出的信號后將溫度和濕度的數(shù)值顯示出來。
  • 1.2系統(tǒng)設(shè)計(jì)簡圖

    2.硬件選擇

    由于51單片機(jī)已經(jīng)上市多年,網(wǎng)上有很多相關(guān)的資料且很多同學(xué)都掌握了51單片機(jī)的基礎(chǔ)性知識;OLDE工作方式和原理比較復(fù)雜,網(wǎng)上有許多相關(guān)的庫,使用時(shí)只需調(diào)用庫即可。所以接下來將重點(diǎn)介紹DHT11溫濕度傳感器的工作原理。

    2.1 DHT11溫濕度傳感器

    2.1.1 DHT11知識儲備

    DHT11是一款有已校準(zhǔn)數(shù)字信號輸出的溫濕度傳感器。 其精度濕度±5%RH, 溫度±2℃,量程濕度20-90%RH,溫度0~50℃。傳感器包括一個(gè)電阻感濕元件和一個(gè)NTC測溫元件,并與一個(gè)高性能8位單片機(jī)相連接。因此該產(chǎn)品具有品質(zhì)卓越、超快響應(yīng)、抗干擾能力強(qiáng)、性價(jià)比高等優(yōu)點(diǎn)。每個(gè)DHT11傳感器都在極為精確的濕度校驗(yàn)室中進(jìn)行校準(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é)議與單片機(jī)通信,單片機(jī)發(fā)送一次復(fù)位信號后,DHT11 從低功耗模式轉(zhuǎn)換到高速模式,等待主機(jī)復(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 校驗(yàn)和,一共 5 字節(jié)(40bit)數(shù)據(jù)。由于 DHT11 分辨率只能精確到個(gè)位,所以小數(shù)部分是數(shù)據(jù)全為 0。校驗(yàn)和為前 4 個(gè)字節(jié)數(shù)據(jù)相加,校驗(yàn)的目的是為了保證數(shù)據(jù)傳輸?shù)臏?zhǔn)確性。

    2.1.3 DHT11操作時(shí)序

    (1)主機(jī)發(fā)送復(fù)位信號:DHT11 的初始化過程同樣分為復(fù)位信號和響應(yīng)信號。首先主機(jī)拉低總線至少 18ms,然后再拉高總線,延時(shí) 20~40us,取中間30us,此時(shí)復(fù)位信號發(fā)送完畢。

    (2)dht11發(fā)送響應(yīng)信號:DHT11 檢測到復(fù)位信號后,觸發(fā)一次采樣,并拉低總線 80us 表示響應(yīng)信號,告訴主機(jī)數(shù)據(jù)已經(jīng)準(zhǔn)備好了;然后 DHT11 拉高總線 80us,之后開始傳輸數(shù)據(jù)。當(dāng)復(fù)位信號發(fā)送完畢后,如果檢測到總線被拉低,就每隔 1us 計(jì)數(shù)一次,直至總線拉高,計(jì)算低電平時(shí)間;當(dāng)總線被拉高后重新計(jì)數(shù)檢測 80us 的高電平。如果檢測到響應(yīng)信號之后的80us 高電平,就準(zhǔn)備開始接收數(shù)據(jù)。實(shí)際上 DHT11 的響應(yīng)時(shí)間并不是標(biāo)準(zhǔn)的 80us,往往存在誤差,當(dāng)響應(yīng)時(shí)間處于 30~90us 之間時(shí)就可以認(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ù)之間的點(diǎn)

    ???????????? 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ù)之間的點(diǎn)

    ???????????? 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;//主機(jī)從高電平轉(zhuǎn)為低電平

    ??? DHT11_delay_ms(220);//主機(jī)拉低20ms

    ??? dht=1;//主機(jī)拉高,然后模塊將總線拉低

    ??? DHT11_delay_us(50);//延時(shí)50微秒

    ??? if(dht==0)//讀到0,表示檢測到響應(yīng)信號

    ??? {

    ??????? led=0;//亮燈表示響應(yīng)到信號

    ??? }

    ??? else

    ??? {

    ??????? led=1;//表示沒檢測到信號

    ??? }

    }

    unsigned char DHT11_rec_byte()????? //接收一個(gè)字節(jié)

    {

    ?? unsigned char i,dat=0;

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

    ?? {?????????

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

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

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

    ????? if(dht==1)??? //數(shù)據(jù)為1時(shí),使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);? //拉高后延時(shí)超過80us(80us時(shí)候下降沿,135時(shí)候上升)

    ??????? 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.實(shí)際效果圖

    總結(jié)

    以上是生活随笔為你收集整理的【无标题】基于51单片机和DHT11的温湿度检测系统的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。