「51單片機」收發一體超聲波測距模塊分析+代碼


我用的超聲波型號是US-020,四個接口的超聲波用法基本相同。

 

一、概述

US-020超聲波模塊測距范圍:2cm~7m

供電電壓5V,靜態功耗低於3mA

 

二、實物圖

 

尺寸:45mm*20mm*1.6mm

 

三、接口

1.VCC 電源,直流5V

2.Trig 向此管腳輸入10us以上高電平,可觸發模塊測距

3.Echo 測距結束時會輸出高電平,電平時長為超聲波信號往返時間之和

4.GND 接地

 

四、測距工作原理

只要在Trig管腳輸入10us以上高電平,系統會自動發出840KHz的超聲波脈沖,然后檢測回波信號。檢測到后通過Echo管腳輸出。

 

計算方式:(Echo高電平時間*340m/s/2

[]:利用計數器檢測Echo高電平時間。計時器計數頻率為晶振的1/12。設晶振頻率XMHz,計數值t(方式1t=TH0*256+TL0)。

距離L=(t*12/(X*10^6))*340000/2  (mm)

     =0.17*t             (X=12)

 =(2.04/11.0592)*t     (X=11.0592)

 

五、代碼分析

1.初始化程序,需要設置計時器,計算Echo高電平時間

 

    TMOD = 0x01;           //設T0為方式1;
    TH0 = 0;
    TL0 = 0; 
    TR0 = 1;  
    ET0 = 1;               //允許T0中斷
    EA = 1;                //開啟總中斷
    Tr = 0;

 

2.發送10us以上高電平給Trig

    Tr = 1;
    _nop_(); 
    _nop_(); 
    _nop_(); 
    _nop_(); 
    _nop_(); 
    _nop_(); 
    _nop_(); 
    _nop_(); 
    _nop_(); 
    _nop_();
    Tr = 0; 

3.等待Echo的高電平並計算時間

    while(!Ec);                //等待高電平
    TR0 = 1;                   //打開計時器
    while(Ec);                 //等待低電平
    TR0 = 0;                   //關閉計時器

    time = TH0*256 + TL0;      //計算時間
    L = 0.18446*time;

    TH0 = 0;                   //重置計時器
    TL0 = 0;

 

六、總代碼(包括數碼管顯示部分)

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

#define uchar unsigned  char
#define uint  unsigned   int 

//管腳定義
sbit Tr = P2^0;            //超聲波觸發
sbit Ec = P2^1;            //超聲波輸出
sbit key = P2^4;           //按鍵
sbit encC = P2^5;          //38譯碼器
sbit encB = P2^6;
sbit encA = P2^7;
//P0口接數碼管

//定義變量
float L = 0;               //距離長度(mm)
unsigned char code LED[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};

//函數申明
void ultInit();            //超聲波初始化
void ultStart();           //超聲波觸發
void count();              //計算距離
void show();               //顯示距離於屏幕
void delay();              //延時函數

//---------------
//超聲波初始化
//---------------
void ultInit()
{
    TMOD = 0x01;           //設T0為方式1;
    TH0 = 0;
    TL0 = 0; 
    TR0 = 1;  
    ET0 = 1;               //允許T0中斷
    EA = 1;                //開啟總中斷
    Tr = 0;
}

//---------------
//超聲波觸發
//---------------
void ultStart()
{
    Tr = 1;
    _nop_(); 
    _nop_(); 
    _nop_(); 
    _nop_(); 
    _nop_(); 
    _nop_(); 
    _nop_(); 
    _nop_(); 
    _nop_(); 
    _nop_();
    Tr = 0; 
}

//---------------
//計算距離
//---------------
void count()
{
    uint time = 0;

    while(!Ec);                //等待高電平
    TR0 = 1;                   //打開計時器
    while(Ec);                 //等待低電平
    TR0 = 0;                   //關閉計時器

    time = TH0*256 + TL0;      //計算時間
    L = 0.18446*time;

    TH0 = 0;                   //重置計時器
    TL0 = 0;
}

//---------------
//顯示距離於屏幕
//---------------
void show()
{      
    P0 = LED[(int)L%10];
    encC = 0; encB = 1; encA = 1;
    P0 = LED[(int)L/10%10];
    encC = 0; encB = 1; encA = 0;
    P0 = LED[(int)L/100%10];
    encC = 0; encB = 0; encA = 1;
    P0 = LED[(int)L/1000%10];
    encC = 0; encB = 0; encA = 0;
}

//---------------
//延時函數
//---------------
void delay()
{
    _nop_();_nop_();_nop_();_nop_();_nop_();
}

//---------------
//主函數
//---------------
void main()
{
    ultInit();             
    key = 1;
    while(1)
    {
        if(0==key)
        {
            delay();
            if(0==key)
            {
                ultStart();
                count();
                key = 1;
            }
        }
        show();
    }    
}

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM