×
单片机 > 单片机程序设计 > 详情

「51单片机」收发一体超声波测距模块分析+代码

发布时间:2020-06-19 发布时间:
|

我用的超声波型号是US-020,四个接口的超声波用法基本相同。

 

一、概述

US-020超声波模块测距范围:2cm~7m

供电电压5V,静态功耗低于3mA

 

二、实物图

 

尺寸:45mm*20mm*1.6mm

 

三、接口

1.VCC 电源,直流5V

2.Trig 向此管脚输入10us以上高电平,可触发模块测距

3.Echo 测距结束时会输出高电平,电平时长为超声波信号往返时间之和

4.GND 接地

 

四、测距工作原理

只要在Trig管脚输入10us以上高电平,系统会自动发出8个40KHz的超声波脉冲,然后检测回波信号。检测到后通过Echo管脚输出。

 

计算方式:(Echo高电平时间*340m/s)/2

[注]:利用计数器检测Echo高电平时间。计时器计数频率为晶振的1/12。设晶振频率XMHz,计数值t(方式1下t=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

#include


#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();

    }    

}


关键字:51单片机  收发一体  超声波测距

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
STM32中断向量表的位置.重定向