版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
附錄1:#include<regx52.h>#include<intrins.h>#include"DHT11.H"#include"DHT11.C"unsignedcharrange[4]={55,75,10,30}; //溫濕度上下限初值unsignedcharHumi_Temp_Tab[8]={6,9,0,0,7,8,0,0}; //數(shù)碼管顯示初值unsignedcharnumt1=0; //T1中止計數(shù)標(biāo)志unsignedcharnumt0=0; unsignedcharcodeTab_Seg[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //數(shù)碼管段碼0-9unsignedcharcodeTab_Dig[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; //位選第一位到第八位unsignedcharcodeunits[4]={0x39,0x71,0x77,0x76};//單位C/F/RH/**********************************************//*溫濕度采集函數(shù)*//**********************************************/voidgetdata() { if(start_DHT11()) { read_DHT11(); } if(check_sum()) { Humi_Temp_Tab[0]=DHT_data.DH_H/10; Humi_Temp_Tab[1]=DHT_data.DH_H%10; Humi_Temp_Tab[2]=DHT_data.DH_L/10; //存放濕度數(shù)據(jù) if(flag==0) { Humi_Temp_Tab[4]=DHT_data.T_H/10; Humi_Temp_Tab[5]=DHT_data.T_H%10; Humi_Temp_Tab[6]=DHT_data.T_L/10;//存放攝氏溫度數(shù)據(jù) } else { Humi_Temp_Tab[4]=(9*DHT_data.T_H/5+32)/10; Humi_Temp_Tab[5]=(9*DHT_data.T_H/5+32)%10; Humi_Temp_Tab[6]=(18*DHT_data.T_H+320)%100%10; //存放華氏溫度數(shù)據(jù) } } }/**********************************************//*主函數(shù)*//**********************************************/ voidmain(){ delay_ms(500); //先進行延時等候進入穩(wěn)定狀態(tài) P0=0; P1=0x0C; //初始化P1口 EA=0; TR1=0; TR0=0; TMOD=0x11; //設(shè)置定時器T0和T1,且工作方式都為方式1 TH1=(65536-5000)/256; TL1=(65536-5000)%256; TH0=(65536-)/256; TL0=(65536-)%256; //設(shè)定初值2ms TR1=1; TR0=1; EA=1; ET0=1; ET1=1; //打開中止定時器T0和T1 PT1=0; PT0=1; //強制設(shè)置優(yōu)先級 delay_ms(1000); while(1) { if(DHT_data.DH_H<range[0]) //濕度小于下限 { bee=0; delay_ms(100); bee=1; delay_ms(100); } if(DHT_data.DH_H>range[1]) //濕度大于上限 { bee=0; delay_ms(100); bee=1; delay_ms(100); } if(DHT_data.T_H<range[2]) //溫度小于下限 { bee=0; delay_ms(10); bee=1; delay_ms(10); } if(DHT_data.T_H>range[3]) //溫度大于上限 { bee=0; delay_ms(10); bee=1; delay_ms(10); }}}/**********************************************//*定時器T0中止*//**********************************************/voidT0_timer()interrupt1{ unsignedcharKData=0x00; TR0=0; //進入T0后將T0中止關(guān)閉 TH0=(65536-)/256; TL0=(65536-)%256; switch(numt0) { case0: P0=0;Seg_ce=1;Seg_ce=0; //段選開關(guān) if(flag2==1) P0=Tab_Seg[range[0]/10]; //顯示濕度下限十位 else P0=Tab_Seg[Humi_Temp_Tab[0]];//顯示讀取濕度十位 Seg_ce=1;Seg_ce=0; P0=Tab_Dig[0]; //位選第一位 Dig_ce=1;Dig_ce=0; numt0++;break; case1: P0=0;Seg_ce=1;Seg_ce=0; if(flag2==1) P0=Tab_Seg[range[0]%10]; //顯示濕度下限個位 else P0=Tab_Seg[Humi_Temp_Tab[1]];//顯示讀取濕度個位 Seg_ce=1;Seg_ce=0; P0=Tab_Dig[1]; //位選第二位 Dig_ce=1;Dig_ce=0; numt0++;break; case2: P0=0;Seg_ce=1;Seg_ce=0; if(flag2==1) P0=Tab_Seg[range[1]/10]; //顯示濕度上限十位 else P0=units[2]; //顯示單位R Seg_ce=1;Seg_ce=0; P0=Tab_Dig[2]; //位選第三位 Dig_ce=1;Dig_ce=0; numt0++;break; case3: P0=0;Seg_ce=1;Seg_ce=0; if(flag2==1) P0=Tab_Seg[range[1]%10]; //顯示濕度上限個位 else P0=units[3]; //顯示單位H Seg_ce=1;Seg_ce=0; P0=Tab_Dig[3]; //位選第四位 Dig_ce=1;Dig_ce=0; numt0++;break; case4: P0=0;Seg_ce=1;Seg_ce=0; P0=Tab_Dig[4]; //位選第五位,且同時拉低鍵盤第四行 Dig_ce=1;Dig_ce=0; Key_ce=0; KData=P0; //掃描鍵盤第四行 switch(KData) { case0xfe: case0xfd: case0xfb: case0xf7: default:break; } while(KData!=0xff) { KData=P0; } Key_ce=1; if(flag2==1) P0=Tab_Seg[range[2]/10]; //顯示溫度下限十位 else P0=Tab_Seg[Humi_Temp_Tab[4]]; //顯示讀取溫度十位 Seg_ce=1;Seg_ce=0; numt0++;break; case5: P0=0;Seg_ce=1;Seg_ce=0; P0=Tab_Dig[5]; //位選第六位,且同時拉低鍵盤第三行 Dig_ce=1;Dig_ce=0; Key_ce=0; KData=P0; //掃描鍵盤第三行 switch(KData) { case0xfe:if(range[0]<range[1]&&flag2==1) range[0]++;break; //濕度下限加 case0xfd:if(range[1]<90&&flag2==1) range[1]++;break; //濕度上限加 case0xfb:if(range[2]<range[3]&&flag2==1 range[2]++;break; //溫度下限加 case0xf7:if(range[3]<50&&flag2==1) range[3]++;break;//溫度上限加 default:break; } while(KData!=0xff) { KData=P0; } Key_ce=1; if(flag2==1) P0=Tab_Seg[range[2]%10]; //顯示溫度下限個位 else P0=Tab_Seg[Humi_Temp_Tab[5]]-0x80; //顯示讀取溫度個位(帶小數(shù)點) Seg_ce=1;Seg_ce=0; numt0++;break; case6: P0=0;Seg_ce=1;Seg_ce=0; P0=Tab_Dig[6]; //位選第七位,且同時拉低鍵盤第二行 Dig_ce=1;Dig_ce=0; Key_ce=0; KData=P0; //掃描鍵盤第二行 switch(KData) { case0xfe:if(range[0]>20&&flag2==1) range[0]--;break; //濕度下限減 case0xfd:if(range[0]<range[1]&&flag2==1) range[1]--;break;//濕度上限減 case0xfb:if(range[2]>0&&flag2==1) range[2]--;break; //溫度下限減 case0xf7:if(range[2]<range[3]&&flag2==1) range[3]--;break; //溫度上限減 default:break; } while(KData!=0xff) { KData=P0; } Key_ce=1; if(flag2==1) P0=Tab_Seg[range[3]/10]; //顯示溫度上限十位 else P0=Tab_Seg[Humi_Temp_Tab[6]]; //顯示讀取溫度小數(shù)位十位 Seg_ce=1;Seg_ce=0; numt0++;break; case7: P0=0;Seg_ce=1;Seg_ce=0; P0=Tab_Dig[7]; //位選第八位,且同時拉低鍵盤第一行 Dig_ce=1;Dig_ce=0; Key_ce=0; KData=P0; //掃描鍵盤第一行 switch(KData) { case0xfe:flag2=~flag2;TR1=~TR1;break; //進入和退出限制調(diào)整模式 case0xfd:flag=~flag;break; //進行華氏攝氏溫度轉(zhuǎn)換設(shè)置 case0xfb: case0xf7: default:break; } while(KData!=0xff) { KData=P0; } Key_ce=1; if(flag==0&&flag2==0) P0=units[0]; //顯示單位C elseif(flag==1&&flag2==0) P0=units[1]; //顯示單位F elseif(flag2==1) P0=Tab_Seg[range[3]%10]; //顯示溫度上限個位 Seg_ce=1;Seg_ce=0; numt0=0;break; default:numt0=0;break; } TR0=1; //打開T0}/**********************************************//*定時器T1中止*//**********************************************/voidT1_timer()interrupt3{ TR1=0; //關(guān)閉T0 TH1=(65536-50000)/256; TL1=(65536-50000)%256; if(numt1==25) { getdata(); //采集數(shù)據(jù) numt1=0; } else numt1++; TR1=1; //打開T0}#ifndef__DHT11_h__#define__DHT11_h__#include<REGX52.H>/**********************************************//*引腳定義*//**********************************************/sbitDHT_bus=P2^0 ; //DHT11數(shù)據(jù)傳輸口sbitKey_ce=P1^3; //按鍵輸出使能sbitSeg_ce=P1^0;//段選位sbitDig_ce=P1^1;//位選位sbitbee=P2^1; //蜂鳴器控制口/**********************************************//*函數(shù)聲明*//**********************************************/bitstart_DHT11(void); //開始voidread_DHT11(void); //讀取voiddelay_20us(void); //20us延時voiddelay_ms(unsignedcharm); //Nms延時bitcheck_sum(void);//和校驗/**********************************************//*宏定義*//**********************************************/#defineHIGH1#defineLOW0/**********************************************//*變量定義*//**********************************************/#defineDHT_timeover5 //高電平維持時間,用于識別“數(shù)據(jù)0”和“數(shù)據(jù)1”bitflag2=0; //設(shè)置調(diào)整上下限模式轉(zhuǎn)換標(biāo)志bitflag=0; //設(shè)置攝氏和華氏溫度模式轉(zhuǎn)換標(biāo)志/**********************************************//*結(jié)構(gòu)體*//**********************************************/structDHT_data{unsignedcharDH_H;//濕度整數(shù)unsignedcharDH_L;//濕度小數(shù)unsignedcharT_H;//溫度整數(shù)unsignedcharT_L;//溫度小數(shù)unsignedcharChecksum;//校驗和}DHT_data;#endif#include"DHT11.h"#include<intrins.h>/**********************************************//*開始DHT11溫濕度計*//*輸入:無 *//*輸出:應(yīng)答標(biāo)志0:應(yīng)答失敗1:應(yīng)答成功*//**********************************************/bitstart_DHT11(void){ bitDHT_start; DHT_start=0; DHT_bus=HIGH; DHT_bus=LOW; //拉低18ms以上 delay_ms(18); TR0=0; DHT_bus=HIGH; delay_20us(); delay_20us();//拉高20~40us while(!DHT_bus) { DHT_start=1; }//DHT應(yīng)答,DHT拉低80us后拉高80us,然后開始傳輸數(shù)據(jù) //數(shù)據(jù)(40bit)=8bit濕度整數(shù)+8bit濕度小數(shù)+8bit溫度整數(shù)+8bit溫度小數(shù)+8bit校驗和 while(DHT_bus){}; return(DHT_start);//應(yīng)答成功返回1}/**********************************************//*讀取DHT11溫濕度計*//*讀取結(jié)果存在DHT_data結(jié)構(gòu)體內(nèi)*//*輸入:無輸出:無*//**********************************************/voidread_DHT11(void){ unsignedcharm,n,timer_dht; unsignedchar*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ù)開始 timer_dht=0x00; while(DHT_bus) //隨即DHT拉高總線,單片機經(jīng)過高電平維持時間判斷“數(shù)據(jù)0”還是“數(shù)據(jù)1” {//數(shù)據(jù)0維持26~28us高電平,數(shù)據(jù)1維持116~118us高電平 timer_dht++; //因為此處對延時時間長度要求很高,所以采取另一個方法判斷 } if(timer_dht>DHT_timeover) { *p<<=1; *p|=0x01; } else { *p<<=1; *p&=0xfe; } } p++; } TR0=1;}/**********************************************//*20us精確延時*//*51用在12Mhz晶振下
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 部隊安全制度
- 中考祖國作文題目及答案
- 軟件測試自動化工具介紹與分析
- 車輛使用制度
- 財務(wù)審簽制度
- 試論執(zhí)行異議制度
- 行政復(fù)議制度本質(zhì)上是司法審查制度
- 2025年永興人事資源考試及答案
- 2025年鞍鋼專業(yè)知識筆試及答案
- 2025年筆試和面試的考試及答案
- 全國民用建筑工程設(shè)計技術(shù)措施-結(jié)構(gòu)
- (正式版)YST 1693-2024 銅冶煉企業(yè)節(jié)能診斷技術(shù)規(guī)范
- 1999年勞動合同范本【不同附錄版】
- 2024年重慶中考物理模擬考試試題
- 全國優(yōu)質(zhì)課一等獎職業(yè)學(xué)校教師信息化大賽《語文》(基礎(chǔ)模塊)《我愿意是急流》說課課件
- 初三寒假家長會ppt課件全面版
- 2023年中國造紙化學(xué)品發(fā)展現(xiàn)狀與趨勢
- 《干部履歷表》1999版電子版
- 視頻旋轉(zhuǎn)滴方法在界面擴張流變性質(zhì)研究中的應(yīng)用
- 傳統(tǒng)醫(yī)學(xué)師承關(guān)系合同書
- 血流動力學(xué)不穩(wěn)定骨盆骨折急診處理
評論
0/150
提交評論