溫濕度檢測(cè)器DHT11程序及顯示程序_第1頁(yè)
溫濕度檢測(cè)器DHT11程序及顯示程序_第2頁(yè)
溫濕度檢測(cè)器DHT11程序及顯示程序_第3頁(yè)
溫濕度檢測(cè)器DHT11程序及顯示程序_第4頁(yè)
溫濕度檢測(cè)器DHT11程序及顯示程序_第5頁(yè)
已閱讀5頁(yè),還剩6頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、附錄1:#include <regx52.h>#include <intrins.h>#include "DHT11.H"#include "DHT11.C"unsigned char range4=55,75,10,30; /溫濕度上下限初值unsigned char Humi_Temp_Tab8=6,9,0,0,7,8,0,0; /數(shù)碼管顯示初值unsigned char numt1=0; /T1中斷計(jì)數(shù)標(biāo)志unsigned char numt0=0;unsigned char code Tab_Seg10=0x3f,0x06

2、,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f; /數(shù)碼管段碼 0-9unsigned char code Tab_Dig8=0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe; /位選第一位到第八位unsigned char code units4=0x39,0x71,0x77,0x76; /單位C/F/RH/*/* 溫濕度采集函數(shù) */*/void getdata() if(start_DHT11() read_DHT11();if(check_sum()Humi_Temp_Tab0=DHT_data.DH_H/10;Humi_

3、Temp_Tab1=DHT_data.DH_H%10;Humi_Temp_Tab2=DHT_data.DH_L/10; /存儲(chǔ)濕度數(shù)據(jù)if(flag = 0)Humi_Temp_Tab4=DHT_data.T_H/10;Humi_Temp_Tab5=DHT_data.T_H%10;Humi_Temp_Tab6=DHT_data.T_L/10; /存儲(chǔ)攝氏溫度數(shù)據(jù)elseHumi_Temp_Tab4=(9*DHT_data.T_H/5+32)/10;Humi_Temp_Tab5=(9*DHT_data.T_H/5+32)%10; Humi_Temp_Tab6=(18*DHT_data.T_H+3

4、20)%100%10; /存儲(chǔ)華氏溫度數(shù)據(jù)/*/* 主函數(shù) */*/ void main() delay_ms(500); /先進(jìn)行延時(shí) 等待進(jìn)入穩(wěn)定狀態(tài)P0 = 0;P1 = 0x0C; /初始化P1口EA = 0;TR1 = 0;TR0 = 0;TMOD = 0x11; /設(shè)置定時(shí)器 T0和T1,且工作方式都為方式1TH1 = (65536-5000)/256;TL1 = (65536-5000)%256;TH0 = (65536-2000)/256;TL0 = (65536-2000)%256;/設(shè)定初值2msTR1 = 1;TR0 = 1;EA = 1;ET0 = 1; ET1 = 1

5、; /打開(kāi)中斷定時(shí)器T0和T1PT1 = 0;PT0 = 1; /強(qiáng)制設(shè)置優(yōu)先級(jí)delay_ms(1000); while(1) if(DHT_data.DH_H<range0) /濕度小于下限bee = 0;delay_ms(100);bee = 1;delay_ms(100);if(DHT_data.DH_H>range1) /濕度大于上限bee = 0;delay_ms(100);bee = 1;delay_ms(100);if(DHT_data.T_H<range2) /溫度小于下限bee = 0;delay_ms(10);bee = 1;delay_ms(10);i

6、f(DHT_data.T_H>range3) /溫度大于上限bee = 0;delay_ms(10);bee = 1;delay_ms(10); /*/* 定時(shí)器T0中斷 */*/void T0_timer() interrupt 1unsigned char KData = 0x00;TR0 = 0; /進(jìn)入T0后將T0中斷關(guān)閉TH0 = (65536-2000)/256;TL0 = (65536-2000)%256;switch(numt0)case 0:P0 = 0; Seg_ce = 1; Seg_ce = 0; /段選開(kāi)關(guān)if(flag2 = 1)P0 = Tab_Segran

7、ge0/10; /顯示濕度下限的十位elseP0 = Tab_SegHumi_Temp_Tab0; /顯示讀取的濕度的十位Seg_ce = 1; Seg_ce = 0;P0 = Tab_Dig0; /位選第一位Dig_ce = 1; Dig_ce = 0;numt0+;break;case 1:P0 = 0; Seg_ce = 1; Seg_ce = 0;if(flag2 = 1)P0 = Tab_Segrange0%10; /顯示濕度下限的個(gè)位elseP0 = Tab_SegHumi_Temp_Tab1; /顯示讀取的濕度的個(gè)位Seg_ce = 1; Seg_ce = 0;P0 = Tab_

8、Dig1; /位選第二位Dig_ce = 1; Dig_ce = 0;numt0+;break;case 2:P0 = 0; Seg_ce = 1; Seg_ce = 0;if(flag2 = 1)P0 = Tab_Segrange1/10;/顯示濕度上限的十位elseP0 = units2; /顯示單位RSeg_ce = 1; Seg_ce = 0; P0 = Tab_Dig2; /位選第三位Dig_ce = 1; Dig_ce = 0;numt0+;break;case 3:P0 = 0; Seg_ce = 1; Seg_ce = 0;if(flag2 = 1)P0 = Tab_Segra

9、nge1%10; /顯示濕度上限的個(gè)位elseP0 = units3; /顯示單位H Seg_ce = 1; Seg_ce = 0;P0 = Tab_Dig3; /位選第四位 Dig_ce = 1; Dig_ce = 0;numt0+;break;case 4:P0 = 0; Seg_ce = 1; Seg_ce = 0; P0 = Tab_Dig4; /位選第五位,且同時(shí)拉低鍵盤(pán)第四行Dig_ce = 1; Dig_ce = 0;Key_ce = 0;KData = P0; /掃描鍵盤(pán)第四行switch(KData)case 0xfe: case 0xfd: case 0xfb: case

10、0xf7: default:break;while(KData != 0xff)KData = P0;Key_ce = 1; if(flag2 = 1)P0 = Tab_Segrange2/10;/顯示溫度下限的十位elseP0 = Tab_SegHumi_Temp_Tab4; /顯示讀取的溫度的十位Seg_ce = 1; Seg_ce = 0;numt0+;break;case 5:P0 = 0; Seg_ce = 1; Seg_ce = 0;P0 = Tab_Dig5; /位選第六位,且同時(shí)拉低鍵盤(pán)第三行Dig_ce = 1; Dig_ce = 0;Key_ce = 0;KData = P

11、0;/掃描鍵盤(pán)第三行switch(KData)case 0xfe:if(range0<range1&&flag2=1) range0+;break; /濕度下限加case 0xfd:if(range1<90&&flag2=1) range1+;break; /濕度上限加case 0xfb:if(range2<range3&&flag2=1 range2+;break;/溫度下限加 case 0xf7:if(range3<50&&flag2=1) range3+;break; /溫度上限加default:br

12、eak;while(KData != 0xff)KData = P0;Key_ce = 1;if(flag2 = 1)P0 = Tab_Segrange2%10; /顯示溫度下限的個(gè)位elseP0 = Tab_SegHumi_Temp_Tab5-0x80; /顯示讀取溫度的個(gè)位(帶小數(shù)點(diǎn)的)Seg_ce = 1; Seg_ce = 0;numt0+;break;case 6:P0 = 0; Seg_ce = 1; Seg_ce = 0;P0 = Tab_Dig6; /位選第七位,且同時(shí)拉低鍵盤(pán)第二行Dig_ce = 1; Dig_ce = 0;Key_ce = 0;KData = P0;/掃描

13、鍵盤(pán)第二行switch(KData)case 0xfe:if(range0>20&&flag2=1) range0-;break; /濕度下限減case 0xfd:if(range0<range1&&flag2=1) range1-;break; /濕度上限減case 0xfb:if(range2>0&&flag2=1) range2-;break; /溫度下限減case 0xf7:if(range2<range3&&flag2=1) range3-;break; /溫度上限減default:break;w

14、hile(KData != 0xff)KData = P0;Key_ce = 1;if(flag2 = 1)P0 = Tab_Segrange3/10; /顯示溫度上限的十位elseP0 = Tab_SegHumi_Temp_Tab6; /顯示讀取溫度的小數(shù)位的十位 Seg_ce = 1; Seg_ce = 0;numt0+;break;case 7:P0 = 0; Seg_ce = 1; Seg_ce = 0;P0 = Tab_Dig7; /位選第八位,且同時(shí)拉低鍵盤(pán)第一行 Dig_ce = 1; Dig_ce = 0;Key_ce = 0;KData = P0; /掃描鍵盤(pán)第一行switc

15、h(KData)case 0xfe:flag2 = flag2;TR1 = TR1;break; /進(jìn)入和退出限制調(diào)整模式case 0xfd:flag = flag;break; /進(jìn)行華氏攝氏溫度的轉(zhuǎn)換設(shè)置case 0xfb: case 0xf7: default:break;while(KData != 0xff)KData = P0;Key_ce = 1;if(flag = 0&&flag2 = 0)P0 = units0; /顯示單位Celse if(flag = 1&&flag2 = 0)P0 = units1; /顯示單位Felse if(flag2

16、 = 1)P0 = Tab_Segrange3%10; /顯示溫度上限的個(gè)位Seg_ce = 1; Seg_ce = 0;numt0 = 0;break;default:numt0 = 0;break;TR0 = 1;/打開(kāi)T0 /*/* 定時(shí)器T1中斷 */*/void T1_timer() interrupt 3TR1 = 0; /關(guān)閉T0TH1 = (65536-50000)/256;TL1 = (65536-50000)%256;if(numt1 = 25) getdata(); /采集數(shù)據(jù)numt1 = 0;elsenumt1+;TR1 = 1; /打開(kāi)T0#ifndef _DHT1

17、1_h_#define _DHT11_h_#include <REGX52.H>/*/* 引 腳 定 義 */*/sbit DHT_bus = P20;/DHT11數(shù)據(jù)傳輸口sbit Key_ce=P13;/按鍵輸出使能sbit Seg_ce=P10; /段選位sbit Dig_ce=P11; /位選位sbit bee = P21;/蜂鳴器控制口/*/* 函 數(shù) 聲 明 */*/bit start_DHT11(void); /開(kāi)始void read_DHT11(void); /讀取void delay_20us(void); /20us延時(shí)void delay_ms(unsigne

18、d char m); /N ms延時(shí)bit check_sum(void); /和校驗(yàn)/*/* 宏 定 義 */*/#define HIGH 1#define LOW 0/*/* 變 量 定 義 */*/#define DHT_timeover 5 /高電平維持時(shí)間,用于識(shí)別“數(shù)據(jù)0”和“數(shù)據(jù)1”bit flag2 = 0;/設(shè)置調(diào)節(jié)上下限模式轉(zhuǎn)換標(biāo)志bit flag=0; /設(shè)置攝氏和華氏溫度模式轉(zhuǎn)換標(biāo)志/*/* 結(jié) 構(gòu) 體 */*/struct DHT_data unsigned char DH_H; /濕度整數(shù) unsigned char DH_L; /濕度小數(shù) unsigned cha

19、r T_H; /溫度整數(shù) unsigned char T_L; /溫度小數(shù) unsigned char Checksum; /校驗(yàn)和DHT_data;#endif#include "DHT11.h"#include <intrins.h>/*/* 開(kāi)始 DHT11 溫濕度計(jì) */* 輸入:無(wú) */* 輸出:應(yīng)答標(biāo)志 0:應(yīng)答失敗 1:應(yīng)答成功 */*/bit start_DHT11(void) bit DHT_start; DHT_start = 0; DHT_bus = HIGH; DHT_bus = LOW; /拉低18ms以上 delay_ms(18);

20、TR0 = 0; DHT_bus = HIGH; delay_20us(); delay_20us(); /拉高2040us while(!DHT_bus) DHT_start = 1; /DHT應(yīng)答,DHT拉低80us后拉高80us,然后開(kāi)始傳輸數(shù)據(jù) /數(shù)據(jù)(40bit)=8bit濕度整數(shù)+8bit濕度小數(shù)+8bit溫度整數(shù)+8bit 溫度小數(shù)+8bit校驗(yàn)和 while(DHT_bus); return(DHT_start); /應(yīng)答成功返回1/*/* 讀取 DHT11 溫濕度計(jì) */* 讀取結(jié)果存在DHT_data結(jié)構(gòu)體內(nèi) */* 輸入:無(wú) 輸出:無(wú) */*/void read_DHT1

21、1(void) unsigned char m,n,timer_dht; unsigned char *p; p=&DHT_data.DH_H; /數(shù)據(jù)放在DHT_date的結(jié)構(gòu)體中 for(m=0;m<5;m+) for(n=0;n<8;n+) while(DHT_bus); /DHT拉低12-14us表示1bit數(shù)據(jù)開(kāi)始 timer_dht=0x00; while(DHT_bus) /隨后DHT拉高總線,單片機(jī)通過(guò)高電 平維持的時(shí)間判斷“數(shù)據(jù)0”還是“數(shù)據(jù)1” /數(shù)據(jù)0維持2628us高電平,數(shù)據(jù)1維持116118us高電平 timer_dht+; /由于此處對(duì)延時(shí)時(shí)間的 長(zhǎng)度要求很高,所以采用另一種辦法判斷 if(timer_dht>DHT_

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論