「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以上高电平,系统会自动发出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 <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();
    }
}
时间: 2024-07-30 06:04:30

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

「51单片机」蓝牙从机基本使用方法

HC-06从机模块基本使用方法 一.蓝牙和单片机怎么连接 如图,GND和VCC就接地和电源 RXD和TXD分别接单片机的RXD和TXD RXD:接收数据 Receive(rx) Data TXD:发送数据 Transmit(tx) Data 单片机的RXD和TXD在哪里呢?打开单片机的原理图 图示P3.0和P3.1就是RXD和TXD接口,把蓝牙的接口与它们连接好 这个时候蓝牙上面的指示灯是一闪一闪的(只要通电它就会一闪一闪) 一.用串口助手调试蓝牙(AT指令) 打开设备管理器,查看单片机与计算机

「51单片机」RS232串口通信代码分析

想来想去不知道要怎么样把232串口通信说清楚,想想还是直接把代码分析一遍吧... 重点是“常用波特率与定时器1的参数关系”这张表格!波特率的设置很重要! 一.串口初始化 void usart_init() { SCON = 0x50; //REN=1允许串行接受状态,串口工作模式1 TMOD = 0x20; //定时器工作方式2 PCON = 0x00; TH1 = 0xFD; //波特率9600.数据位8.停止位1.效验位无 (11.0592M) TL1 = 0xFD; ES = 1; //开

「51单片机」红外接收、发射模块代码

一.简介 红外发射模块:电源3.3V或5V,通过发射管发射38KHz的红外信号,高电平驱动 红外接收模块:电源3.3V或5V,可接收红外信号,并解调成逻辑电平,低电平有效 二.电路图 红外发射电路图 红外接收电路图 三.红外发射模块代码 #include<reg51.h> #include<intrins.h> #define uchar unsigned char #define uint unsigned int //管脚定义 sbit key = P2^0; sbit out

[自娱自乐] 1、超声波测距模块DIY笔记(一)

前言 就像学软件要了解些组成.编译等知识一样,玩硬件如果只用人家封装好的模块,而不了解它们的内部机制,感觉也有点不自在~其实,在很长时间以前就觉得该在模拟电路方面深入点了,可是总是找不到切入点,拿无线电的知识发现根本无法涉足,最近正好由于做一个软硬件结合的“玩具”而引发了必须自己设计传感器的需求,所以就趁势在模拟电路的海洋里遨游下吧,嘿嘿~下面是今天(不,是昨天)做的关于这方面的调查和研究,哈哈,课太多又要把最新版的Ubuntu想方法装进我的老掉牙的只有40G大小的移动硬盘里,结果就忙到了现在~

[自娱自乐] 3、超声波测距模块DIY笔记(三)

前言 上一节我们已经研究了超声波接收模块并自己设计了一个超声波接收模块,在此基础上又尝试用单片机加反相器构成生成40KHz的超声波发射电路,可是发现采用这种设计的发射电路存在严重的发射功率太低问题,对齐的情况下最多只有10CM.本节主要介绍并制造一种大功率超声波发射装置~ 目录 一.浪里淘金,寻找最简超声波功率提高方案 1.1.优化波形发生程序 1.2.尝试各种其他超声模块方案 1.3.用三极管放大信号 1.4.MAX232放大信号方案 二.步步为营,打造高效准确超声测距算法 2.1.接收MCU

[自娱自乐] 2、超声波测距模块DIY笔记(二)

前言 上一节我们已经大致浏览下目前销售的超声波测距模块同时设计了自己的分析电路,这次由于我买的电子元件都到了,所以就动手实验了下!至写该笔记时已经设计出超声波接收模块和超声波发射模块,同时存在超声波发射模块功率太小的问题,下面主要做该过程的总结! 一.尝试找出一个简单的超声波接收电路: >_<" 首先根据我现有的电子元件,最终找到一个比较适合的简单设计方法:这里用一个芯片CX20106A也就是上一节我说的这种方案简单但是不利于理解超声波接收部分的具体细节!但是为了方便设计,我还是选择

[自娱自乐] 4、超声波测距模块DIY笔记(四)——终结篇&#183;基于C#上位机软件开发

前言 上一节我们已经基本上把超声波硬件的发射和接收模块全部做好了,接下来我们着手开发一个软硬结合的基于C#的平面定位软件! 目录 一.整体思路 二.效果提前展示 2-1.软件部分展示 2-2.硬件部分展示 三.基于C#的客户端软件说明 3-1.整体框架介绍: 3-2.部分技术细节介绍 3-2-1.串口操作 3-2-2.JiSuan函数说明及核心算法介绍 四.阶段小结 五.相关链接 一.整体思路 >_<" 如下图,利用我们上三节开发的超声波发射与接收设备构成一个:2固定接收头+1可移动

数字电路期末课程设计总结(二) ——超声波测距模块

废话不多说. 超声波测距模块有5个引脚,这里我们只用4个. 超声波测距模块引脚如上所示,Trig为触发信号输入,Echo为回响信号输出,这两个引脚为实现测距功能的核心功能引脚. 时序图如下: 超声波模块的工作原理为:采用触发测距,每次触发给至少10μS高电平信号,收到高电平信号后,模块自动发送8个40kHz方波的超声波信号,并自动检测是否有信号返回:若有信号范围,通过Echo输出一个高电平,高电平持续时间就是超声波从发射到返回所用的时间. 由超声波模块工作时序图可以看出,每次测量时,给Trig控

KS103超声波测距模块

max232:电平转换芯片,将电脑的RS-232标准串口(高+12V,低-12V)转换为(高+5V,低0V). 电脑串口(RS -232) => 单片机串口(TTL串口) SIPEX SP3232EEN:西伯斯 KS103超声波测距模块,布布扣,bubuko.com