天天看點

基于51單片機的超音波測距儀

制作超音波測距儀,是很多單片機愛好者動手實踐的一個項目,接下來,筆者介紹一下一個建議的簡易的超音波測距儀的制作。超音波測距子產品使用的是HC-SR04,接線方式如下:Trig ——- P2^1; Echo ——- P2^0;

VCC ——– +5v GND ——– GND。

源代碼如下:

#include<reg51.h>
#include<intrins.h> 
#include"lcd.h"

sbit Trig = P2^;
sbit Echo = P2^;



unsigned char PuZh[]=" Pechin Science ";
unsigned char code ASCII[] =    {'0','1','2','3','4','5','6','7','8','9','.','-','M'};

static unsigned char DisNum = ; //顯示用指針                  
       unsigned int  time=;
       unsigned long S=;
       bit      flag =;
       unsigned char disbuff[]    ={ ,,,,};
/*******************************************************************************
* 函 數 名         : main
  * 函數功能       : 主函數
* 輸    入         : 無
* 輸    出         : 無
  *******************************************************************************/
  void Conut(void)
  {
   time=TH0*+TL0;
   TH0=;
   TL0=;

   S=(time*)/;     //算出來是CM
   if((S>=)||flag==) //超出測量範圍顯示“-”
   {     
    flag=;

    DisplayOneChar(, , ASCII[]);
    DisplayOneChar(, , ASCII[]);    //顯示點
    DisplayOneChar(, , ASCII[]);
    DisplayOneChar(, , ASCII[]);
    DisplayOneChar(, , ASCII[]);    //顯示M
   }
   else
   {
    disbuff[]=S%/;
    disbuff[]=S%%/;
    disbuff[]=S%% %;
    DisplayOneChar(, , ASCII[disbuff[]]);
    DisplayOneChar(, , ASCII[]);    //顯示點
    DisplayOneChar(, , ASCII[disbuff[]]);
    DisplayOneChar(, , ASCII[disbuff[]]);
    DisplayOneChar(, , ASCII[]);    //顯示M
   }
  }

  void zd0() interrupt      //T0中斷用來計數器溢出,超過測距範圍
  {
    flag=;                          //中斷溢出标志
  }

   void  StartModule()           //啟動子產品
  {
    Trig=;                              //啟動一次子產品
    _nop_(); 
    _nop_(); 
    _nop_(); 
    _nop_(); 
    _nop_(); 
    _nop_(); 
    _nop_(); 
    _nop_(); 
    _nop_(); 
    _nop_(); 
    _nop_(); 
    _nop_(); 
    _nop_(); 
    _nop_(); 
    _nop_(); 
    _nop_(); 
    _nop_();
    _nop_(); 
    _nop_(); 
    _nop_(); 
    _nop_();
    Trig=;
  }



void delayms(unsigned int ms)
{
    unsigned char i=,j;
    for(;ms;ms--)
    {
        while(--i)
        {
            j=;
            while(--j);
        }
    }
}

void main(void)
{

     TMOD=;        //設T0為方式1,GATE=1;
     TH0=;
     TL0=;          
     ET0=;             //允許T0中斷
     EA=;             //開啟總中斷  

    InitLcd1602();
    LcdShowStr(,,PuZh);
    while()
    {
         StartModule();
         while(!Echo);      //當RX為零時等待
         TR0=;             //開啟計數
         while(Echo);           //當RX為1計數并等待
         TR0=;             //關閉計數
         Conut();           //計算
         delayms();
    }

}
           

繼續閱讀