zoukankan      html  css  js  c++  java
  • 「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();
        }    
    }

     

  • 相关阅读:
    VBA基础一:对象、属性、方法、变量
    js画吊线图
    C++读取硬盘物理序列号-非管理员权限
    什么是句柄?
    2020年WIN7系统的几个问题处理
    静态分析:IDA逆向代码段说明 text、idata、rdata、data
    入门级汇编语法句读
    Ollydbg 单步跟踪F8
    IDA使用之旅(四)
    CSP认证201409-1-相邻数对-(Java)100分
  • 原文地址:https://www.cnblogs.com/Donut/p/4025501.html
Copyright © 2011-2022 走看看