找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3492|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

基于51單片機(jī)實現(xiàn)實時測量溫濕度以及距離顯示

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:457999 發(fā)表于 2019-12-26 16:18 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
一、整體介紹
實時監(jiān)測空氣中的溫度與濕度,測試范圍內(nèi)的距離,在LCD1602液晶顯示器上面顯示溫度濕度,時間,在數(shù)碼管上面顯示距離。
使用了DTH11溫濕度模塊,LCD1602模塊,DS1302模塊,HC-SR04超聲波模塊,蜂鳴器,數(shù)碼管。
硬件:基于KST-51開發(fā)板,芯片是STC89C52RC
軟件:keil編譯器,stc下載工具
二、項目硬件介紹
DHT11是一款有已校準(zhǔn)數(shù)字信號輸出的溫濕度傳感器。 其精度 濕度+-5%RH, 溫度+-2℃,量程濕度20-90%RH, 溫度0~50℃。

DS1302模塊內(nèi)含一個實時時鐘/日歷和31字節(jié)靜態(tài)RAM,可以通過串行接口與單片機(jī)進(jìn)行通信。實時時鐘/日歷電路提供秒、分、時、日、星期、月、年的信息,每個月的天數(shù)和閏年的天數(shù)可自動調(diào)整,時鐘操作可通過AM/PM標(biāo)志位決定采用24或12小時時間格式

HC-SR04超聲波模塊:
(1)采用IO口TRIG觸發(fā)測距,給至少10us的高電平信號;
(2)模塊自動發(fā)送8個40khz的方波,自動檢測是否有信號返回;
     (3)有信號返回,通過IO口ECHO輸出一個高電平,高電平持續(xù)的時間就是超聲波從發(fā)射到返回的時間。測試距離=(高電平時間*聲速(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位數(shù)據(jù)
  
    {         
  
      while(!Data);   ////等待50us低電平過去
  
      DHT11_delay_us(8);     //延時60us,如果還為高則數(shù)據(jù)為1,否則為0
  
      dat<<=1;           //移位使正確接收8位數(shù)據(jù),數(shù)據(jù)為0時直接移位
  
      if(Data==1)    //數(shù)據(jù)為1時,使dat1來接收數(shù)據(jù)1
  
         dat+=1;
  
      while(Data);  //等待數(shù)據(jù)線拉低   
  
     }  
  
     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);    //結(jié)束
  
  
        if((R_H+R_L+T_H+T_L)==revise)      //校正
  
        {
  
            RH=R_H;
  
            RL=R_L;
  
            TH=T_H;
  
            TL=T_L;
  
        }
  
        /*數(shù)據(jù)處理,方便顯示*/
  
        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模塊
  
//用單次寫操作向寄存器寫入一個字節(jié)
  
void DS1302SingleWrite(unsigned  char reg, unsigned char dat)
  
{
  
         DS1302_CE  = 1;        //使能片選信號
  
         DS1302ByteWrite((reg<<1)  | 0x80);        //發(fā)送寫寄存器指令
  
         DS1302ByteWrite(dat);            //寫入字節(jié)數(shù)據(jù)
  
         DS1302_CE  = 0;
  
}
  
  
//用單次讀操作從某一寄存器讀取一個字節(jié)
  
unsigned char  DS1302SingleRead(unsigned char reg)
  
{
  
         unsigned  char dat;
  
  
         DS1302_CE  = 1;
  
         DS1302ByteWrite((reg<<1)  | 0x81);                 //發(fā)送讀寄存器指令
  
         dat  = DS1302ByteRead();                   //讀取字節(jié)數(shù)據(jù)
  
         DS1302_CE  = 0;
  
  
         return  dat;
  
}
  

HC-SR04超聲波模塊:
  
                                     init_time();  //初始化定時器
  
        flag = 0;    //置溢出標(biāo)志位為0
  
        //控制口發(fā)一個10US 以上的高電平
  
        TRIG = 1;   
  
        delay(3);
  
        TRIG = 0;
  
        //等待接收端出現(xiàn)高電平
  
        while(!ECHO);
  
        TR0 = 1; //啟動計時器 開始計時
  
        while(ECHO); //等待高電平結(jié)束
  
        TR0 = 0; //關(guān)閉低電平
  
  
        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--)//加此循環(huán)只是為了將結(jié)果在數(shù)碼管上停留時間長點便于觀察
  
            {
  
                display(distance);
  
            }
  
        }
  
        delay(1000);//60ms的周期,這里不是6ms,太多會閃爍。
  


項目.rar

75.01 KB, 下載次數(shù): 18, 下載積分: 黑幣 -5

源碼

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表