一、整體介紹 實時監測空氣中的溫度與濕度,測試范圍內的距離,在LCD1602液晶顯示器上面顯示溫度濕度,時間,在數碼管上面顯示距離。 使用了DTH11溫濕度模塊,LCD1602模塊,DS1302模塊,HC-SR04超聲波模塊,蜂鳴器,數碼管。 硬件:基于KST-51開發板,芯片是STC89C52RC 軟件:keil編譯器,stc下載工具 二、項目硬件介紹 DHT11是一款有已校準數字信號輸出的溫濕度傳感器。 其精度 濕度+-5%RH, 溫度+-2℃,量程濕度20-90%RH, 溫度0~50℃。
DS1302模塊內含一個實時時鐘/日歷和31字節靜態RAM,可以通過串行接口與單片機進行通信。實時時鐘/日歷電路提供秒、分、時、日、星期、月、年的信息,每個月的天數和閏年的天數可自動調整,時鐘操作可通過AM/PM標志位決定采用24或12小時時間格式
HC-SR04超聲波模塊: (1)采用IO口TRIG觸發測距,給至少10us的高電平信號; (2)模塊自動發送8個40khz的方波,自動檢測是否有信號返回; (3)有信號返回,通過IO口ECHO輸出一個高電平,高電平持續的時間就是超聲波從發射到返回的時間。測試距離=(高電平時間*聲速(340M/S))/2; DS1302模塊:VCC--à+5v GND--àGND CLK--àP1^7 DAT--àP3^4 RST--àP3^5 HC-SR04超聲波模塊: VCC--à+5v GND--àGND TRIG--àP2^0 ECHO--àP2^1 DHT11模塊: VCC--à+5v GND--àGND OUT--àP3^0 三、軟件介紹 DHT11模塊: unsigned char DHT11_rec_byte(){ unsigned char i,dat=0; for(i=0;i<8;i++) //從高到低依次接收8位數據 { while(!Data); ////等待50us低電平過去 DHT11_delay_us(8); //延時60us,如果還為高則數據為1,否則為0 dat<<=1; //移位使正確接收8位數據,數據為0時直接移位 if(Data==1) //數據為1時,使dat加1來接收數據1 dat+=1; while(Data); //等待數據線拉低 } return dat; }
unsigned char* DHT11_receive(){ unsigned char rec_dat[9]; unsigned char R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise;
Data=1; DHT11_delay_us(2); Data=0; DHT11_delay_ms(20); //延時18ms以上 Data=1; DHT11_delay_us(30);
if(Data==0) { while(Data==0); //等待拉高 DHT11_delay_us(40); //拉高后延時80us 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); //結束
if((R_H+R_L+T_H+T_L)==revise) //校正 { RH=R_H; RL=R_L; TH=T_H; TL=T_L; } /*數據處理,方便顯示*/ rec_dat[0]='0'+(RH/10); rec_dat[1]='0'+(RH%10); rec_dat[2]='R'; rec_dat[3]='H'; rec_dat[4]=' '; rec_dat[5]=' '; rec_dat[6]='0'+(TH/10); rec_dat[7]='0'+(TH%10); rec_dat[8]='C'; } return rec_dat; } |
DS1302模塊 //用單次寫操作向寄存器寫入一個字節 void DS1302SingleWrite(unsigned char reg, unsigned char dat) { DS1302_CE = 1; //使能片選信號 DS1302ByteWrite((reg<<1) | 0x80); //發送寫寄存器指令 DS1302ByteWrite(dat); //寫入字節數據 DS1302_CE = 0; }
//用單次讀操作從某一寄存器讀取一個字節 unsigned char DS1302SingleRead(unsigned char reg) { unsigned char dat;
DS1302_CE = 1; DS1302ByteWrite((reg<<1) | 0x81); //發送讀寄存器指令 dat = DS1302ByteRead(); //讀取字節數據 DS1302_CE = 0;
return dat; } |
HC-SR04超聲波模塊: init_time(); //初始化定時器 flag = 0; //置溢出標志位為0 //控制口發一個10US 以上的高電平 TRIG = 1; delay(3); TRIG = 0; //等待接收端出現高電平 while(!ECHO); TR0 = 1; //啟動計時器 開始計時 while(ECHO); //等待高電平結束 TR0 = 0; //關閉低電平
out_TH0 = TH0; //取定時器的值 out_TL0 = TL0; out_TH0 <<= 8; //右移8位 distance = out_TH0 | out_TL0; //合并為16位的值 distance *= 0.017;
if(flag == 1) //如果定時器溢出 則超出超聲波測量范圍 { display(-1); flag = 0; } else { for(y =5; y >=0; y--)//加此循環只是為了將結果在數碼管上停留時間長點便于觀察 { display(distance); } } delay(1000);//60ms的周期,這里不是6ms,太多會閃爍。 |
|