源程序代碼 1.主函數(shù)部分 #include <reg52. h> //51 系列單片機(jī) #inc lude<intr ins. h> #include<stdio. h> #inc lude"De lay. h" #inc lude"DHT11. H" #define uint unsigned int //宏定 義 #define ulint unsigned long int //宏定義 #def ine uchar uns i gned char /*有符號8位整型變量 */ #define KeyPort P3 #define len 60 #define DataPort PO //LCD1602數(shù)據(jù)端 uchar flag_ MQ7, flag_ MQ2, flag_ TSC, flag_ RED, flag_ SHAKE, flag_ FI RE; uchar rh_ _h_ dat, rh_ I_ _dat, t_h_ _dat,t_ _I_ _dat, jy_ _dat, check; uchar a,b,c,d,e, f; uchar ge, shi, bai, qi an, wan, shiwan; //顯示變量 uchar flag_ RH=0, flag_ T=0, flag_ main=1; uchar RH_ c, T_ c; uchar shidu, flag; unsigned char flag1=0, flag_ alarm, flag_ alarm1=0; uchar number TO, numberT1 ; uchar a1=0, b1=20, c1=0, d1=0; uchar Sendbuf[]=" ABCD\r\n"; void DHT11(); void SendByte (uns igned char dat) ; void convers ion(long temp_ data) ; void Wr iteDataLCM (uchar dataW) ; void Wr iteCommandL CM (uchar CMD, uchar Attribc) ; void Displ ayOneChar (uchar X, uchar Y, uchar DData) ; void InitLcd(); void loading() ; void show_ main() ; void show_ RH() ; void show_ T(); void SendStr (unsigned char *s) ;//發(fā)送一個字節(jié) void suspend_ int() ; void SendByte (uns igned char dat) ; sbit LCM_ RS=P2^2;. //LCD1602 命令端口 sbit LCM_ RW=P2^1; //LCD1602 命令端口 sbit LCM_ EN=P2^ 0; //LCD1602 命令端口 sbit key1=P1" 2; sbit bee=P2 5; void InitLcd () Wr iteCommandl .CM (0x38, 1) ; Wr iteCommandL .CM (0x08, 1) ; Wr iteCommandLCM(0x01, 1); Wr iteCommandL CM (0x06, 1) ; Wr iteCommandl .CM (0x0c, 1) ; } /*******************************/ void Displ ayOneChar (uchar X, uchar Y, uchar DData) Y&=1; X&=15; if (Y)X |=0x40; x|=0x80; Wr iteCommandl .CM(X, 0) ; Wr iteDataLCM (DData) ; } void WaitForEnable (void) DataPor t=0xff; LCM_ RS=0;LCM_ RW=1;_ nop_ () ; LCM_ EN=1; .nop_ 0); _nop_ 0); whi le (DataPort&0x80) ; . LCM_ EN=0; /****************************/ void Wr iteCommandL CM (uchar CMD, uchar Attr ibc) if (Attr ibe) WaitForEnable() ; LCM_ RS=0;LCM_ RW=0;_ nop_ () ; DataPort=CMD; _nop_ 0); _nop_ () ; LCM_ EN=1;_ nop_ 0; nop_ ();LCM_ EN=0; /****************************/ void Wr iteDataLCM (uchar dataW) Wa itForEnable() ; LCM_ RS=1;LCM_ _RW=0; _nop_ 0; DataPort=dataW;_ nop_ 0); nop_ (): LCM_ EN=1; _nop_ (); _nop_ () ;LCM_ EN=0; } void DHT11() read() ; if(flag==1) { a = 0x30+t_ h_ dat/10; //分離溫度十位 b = 0x30+t_ h_ dat%10; //分離溫度個位 e = 0x30+rh_ h_ dat/10; //分離濕度十位 f= 0x30+rh_ h_ _dat%10; // 分離濕度個位 Sendbuf[0]=e; Sendbuf[1]=f; Sendbuf[2]=a; Sendbuf [3]=b; de lay (30) ; } void convers ion(long temp data) // 取值運算 { shiwan=temp_ data/100000+0x30 ; temp_ data=temp_ _data%100000; // 取余運算 wan=temp_ data/ 10000+0x30 ; temp_ data=temp_ data%10000; // 取余運算 qian=temp_ data/ 1000+0x30 ; temp_ _data=temp_ _data%1000; //取余運算 ba i=temp_ _data/ 100+0x30 temp_ data=temp_ data%100; //取余運算 shi=temp_ data/ 10+0x30 temp_ data=temp_ data%10; //取余運算 ge=temp_ data+0x30; } void show main() void show_ main() { InitLcd() ; DisplayOneChar(3, 0, e); DisplayOneChar(4, 0. f); DisplayOneChar (5.0, '%'); //濕度顯示 DisplayOneChar (6, 0, 'R'); DisplayOneChar(7,0, 'H'); De | ayMs(1) ; Displ ay0neChar (9, 0,'T'); Di spl ay0neChar(10,0, ':); Di spl ay0neChar(11,0, a); DisplayOneChar(12, 0, b) ; //溫度顯示 Disp | ay0neChar (13, 0, 0XDF) ; Di spl ay0neChar(14,0, 'C'); } void loading () DisplayOneChar(3, 0,'L'); DisplayOneChar(4, 0,'o'); DisplayOneChar(5,0,'a'); DisplayOneChar (6, 0, 'd'): DisplayOneChar(7,0,'i'); Disp lay0neChar(8, 0, 'n'); Displ ay0neChar (9,0,'g'); Displ ay0neChar(10,0,'.'); DisplayOneChar(11.0.'.'); DisplayOneChar(12, 0,'. ); /*------- 發(fā)送一個字符串. void SendByte (uns igned char dat) SBUF = dat; while(!TI); TI=0; void SendStr (unsigned char *s) while(*s!='\0')// \0表示字符串結(jié)束標(biāo)志,通過檢測是否 字符串末尾 SendByte (*s) ; s++; } void InitUART (void) //串口初始化 { SCON = 0x50; . // SCON: 模式1, 8-bit UART,使能接收 TMOD |= 0x20; // TMOD: timer 1, mode 2, 8-bit重裝 TH1 = 0xFD; // TH1:重裝值9600波 特率晶振11.0592MHz TR1 =1; // TR1: timer 1打開 EA = 1; //打開總中斷 // ES = 1; //打開串口中斷 } void UART_ SER (void) interrupt 4 // 串行中斷服務(wù)程序 uns igned char Temp; //定義臨時變量 if(RI) //判斷是接收中斷產(chǎn)生 RI=0; //標(biāo)志位清零 Temp=SBUF; //讀入緩沖區(qū)的值 P1=Temp; //把值輸出到P1口,用于 觀察 SBUF=Temp; //把接收到的值再發(fā)回 電腦端 if(TI) //如果是發(fā)送標(biāo)志位,清 零 TI=0; } void main() { bee=0; InitLcd () ;//液晶初始化 loading() ; DelayMs (100) ; InitUART(); if (key1==0) while(1) DHT11() ;//濕度溫度數(shù)據(jù)讀取 De I ayMs (50) ; show_ main( ; DelayMs (200) ; SendStr (Sendbuf) ; } } 2 DHT11部分 /*DHT11溫濕傳感器驅(qū)動*/ #include <reg52. H> #inc lude"Delay. h" #inc lude"DHT11. h" #inc lude<intrins. h> #inc lude<stdio. h> sbit DQ=P2' 5; //DHT11 數(shù)據(jù)線//單總線 10 extern uchar rh_ h_ dat, rh_ I_ dat,t_ _h_ dat, t_ I_ dat, jy_ dat, check; uint count; extern uchar shidu, flag; uchar k=0x10; . bit DHT_ init() //DHT11的初始存在 bit f=0; DQ=1; _ nop_ 0; DQ=0; //拉低總線大于18ms delay(18) ; DQ=1; //拉高 delay10us(); de lay10us(); delay10us() ; delay10us0; //延時30us while(!DQ) //DHT 響應(yīng)80us的低電平信號 { f=1; } while(DQ); //dht 在拉高80us return f; uchar rdat() //讀一個字節(jié) uint i, dat; for(i=0;i<8;i++) while(!DQ) ; _nop 0; nop_ 0;_ nop_ (); while (DQ) count++; dat=_ crol_ (dat, 1) ; if (count>5) // 高低電平信號的時間不同,若大于50ms則為1 { else //否則為0 dat=dat&Oxfe; count=0; . nop_ (); nop_ 0; _nop_ 0; return dat; } void read() //讀5個字節(jié)的 bit f; f=DHT_ init(); if(f==1) rh_ _h_ dat=rdat(); //前兩個是濕度的整數(shù)、小數(shù) rh_ 1 _dat=rdat () ; t_ h_ _dat=rdat(); //后兩個是溫度的整數(shù)小數(shù) t_ 1_ _dat=rdat(); jy_ dat=rdat(); //最后-位校驗位 DQ=1; check=rh_ h_ _dat+rh_ I_ dat+t_ h_ _dat+t_ 1_ dat; //檢驗數(shù)據(jù)是否 正確 i--; i-- ; i--; } /*-- mS延時函數(shù),含有輸入?yún)?shù)unsigned char t, 無返回值 void De layMs (unsigned int t) { while(t--) int d; for (d=100;d>0;d--); delay10us () ; } i--; i-- ; i--; } /*-- mS延時函數(shù),含有輸入?yún)?shù)unsigned char t, 無返回值 void De layMs (unsigned int t) { while(t--) int d; for (d=100;d>0;d--); delay10us () ; }
|