HC-SR04超声波测距模块介绍

2023-05-16

超声波简介

      超声波是由机械振动产生的, 可在不同介质中以不同的速度传播, 具有定向性好、能量集中、传输过程中衰减较小、反射能力较强等优点。超声波传感器可广泛应用于非接触式检测方法,它不受光线、被测物颜色等影响, 对恶劣的工作环境具有一定的适应能力, 因此在水文液位测量、车辆自动导航、物体识别等领域有着广泛的应用。

超声波测距原理

      超声波测距是通过不断检测超声波发射后遇到障碍物所反射的回波, 从而测出发射和接收回波的时间差Δt , 然后求出距离S 。在速度v 已知的情况下,距离S 的计算,公式如下:S = vΔt/ 2在空气中,常温下超声波的传播速度是334 米/秒,但其传播速度V 易受空气中温度、湿度、压强等因素的影响,其中受温度的影响较大,如温度每升高1 ℃, 声速增加约0. 6 米/ 秒。因此在测距精度要求很高的情况下, 应通过温度补偿的方法对传播速度加以校正。已知现场环境温度T 时, 超声波传播速度V 的计算公式如下:

      V = 331. 5+0.607T

      这样, 只要测得超声波发射和接收回波的时间差Δt 以及现场环境温度T,就可以精确计算出发射点到障碍物之间的距离。

HC-SR04超声波测距模块简介

      HC-SR04超声波测距模块可提供2cm-400cm的非接触式距离感测功能,测距精度可达高到3mm;模块包括超声波发射器、接收器与控制电路。

HC-SR04超声波测距模块实物图

HC-SR04超声波测距模块特点

      1、典型工作用电压:5V

      2、超小静态工作电流:小于5mA

      3、感应角度(R3 电阻越大,增益越高,探测角度越大):

            R3 电阻为392,不大于15 度

            R3 电阻为472, 不大于30 度

      4、探测距离(R3 电阻可调节增益,即调节探测距离):

            R3 电阻为392 2cm-450cm

            R3 电阻为472 2cm-700cm

      5、高精度:可达0.3cm

      6、盲区(2cm)超近

HC-SR04超声波测距模块管脚

      VCC(5V)、 Trig(控制端)、 Echo(接收端)、地(GND)

      使用方法:控制口发一个10US 以上的高电平,就可以在接收口等待高电平输出。一有输出就可以开定时器计时,当此口变为低电平时就可以读定时器的值,此时就为此次测距的时间,方可算出距离。如此不断的周期测,就可以达到你移动测量的值了。

HC-SR04超声波测距模块工作原理

      1、采用IO 触发测距,给至少10us 的高电平信号;

      2、模块自动发送8 个40khz 的方波,自动检测是否有信号返回;

      3、有信号返回,通过IO 输出高电平,高电平持续时间就是超声波从发射到返回时间.测试距离=(高电平时间*声速(340M/S))/2。

      以上时序图表明只需要提供一个10US以上的脉冲触发信号,该模块内部将发出8个40kHz周期电平并检测回波。一旦检测到有回波信号则输出回响信号。回响信号的脉冲宽度与所测的距离成正比。由此通过发射信号到收到的回响信号时间间隔可以计算得到距离。距离=高电平时间*声速。 

HC-SR04超声波测距模块应用注意事项

      1、此模块不宜带电连接,如果要带电连接,则先让模块的Gnd 端先连接。否则会影响模块工作。

      2、测距时,被测物体的面积不少于0.5 平方米且要尽量平整。否则会影响测试结果。

HC-SR04超声波测距模块测距例程

/***********************超声波测距串口输出**********************

*  处理器:STC89C52RC

*  开发环境:KEIL

*  名称:超声波测距串口输出

*  说明:波特率9600

/****************************包含头文件***************************/

#include <reg52.h>

/*******************************宏定义*****************************/

#define SPEED_30C 3495          //30摄氏度时的声速,声速V=331.5+0.6*温度;

#define SPEED_23C 3453          //23摄氏度时的声速,声速V=331.5+0.6*温度;

/******************************位定义******************************/

//FOSC = 11.0592MHz,12T模式,SMOD=0

#define reload_count_1200bps 0xe8

#define reload_count_2400bps 0xf4

#define reload_count_4800bps 0xfa

#define reload_count_9600bps 0xfd

sbit ECHO=P1^6;                 //回声接收端口

sbit TRIG=P1^5;                 //超声触发端口

sbit BEEP=P2^3;                 //蜂鸣器

/*************************定义变量和数组*************************/

long int distance=0;            //距离变量

unsigned char count;

void Delay5Ms(void);

void delay(int In,int Out);

unsigned char zifuchuan[]="SSLV WELCOME!";    //待显示字符

unsigned char juli[]="距离为:   . 厘米";                    //待显示字符

       

void delayt(unsigned int x)

{

 unsigned char j;

 while(x-->0){for(j=0;j<125;j++){;}}

}

void delay(int In,int Out)

{

 int i,j;

 for(i=0;i<In;i++)

 {for(j=0;j<Out;j++){;}}

}

void serial_port_initial(char TH,char TL)

{

 SCON=SCON|0x50;              //0101,0000 8位可变波特率,无奇偶校验位

 TMOD=TMOD|0x20;              //0011,0001 设置定时器1为8位自动重装记数器

 PCON=PCON|0x00;

 TH1=TH;TL1=TL;                  //设置定时器1自动重装数  

 ES=1;                                    //允许串口中断

 EA=1;                                    //开总中断   

 TR1=1;                                  //开定时器1                                                      

}

void send_UART(unsigned char i)     //发送一节函数

{

 ES=0;                                                //关串 口中断

 TI=0;                                                 //清零串口发送完成中断请求标志

 SBUF=i;

 while(TI==0);                                    //等特数据传送

 TI=0;                                                 //清除数据传送标志

 ES=1;

}

void sendc(unsigned char * pd)

{

 while((*pd)!='\0')                       //发送字符串,直到遇到0才结束

 {

  send_UART(*pd);                   //发送一个字符

  pd++;                                      //移动到下一个字符

 }

}

void Alarm(unsigned char t)

{

 unsigned char i;

 for(i=0;i<t;i++)

 {BEEP=0;delay(10,1000);BEEP=1;delay(10,1000);}

}

void Init_timer(void)

{

 TMOD=TMOD|0x01;                //定时器0初始化,设置为16位自动重装模式

 TL0=0x66;TH0=0xfc;               //1ms

 ET0=1;                                     //开定时器0

 EA=1;                                      //总中断使能

}

void Init_Parameter(void)

{TRIG=1;ECHO=1;count=0;distance=0;}

   

void display(int number)

{

 unsigned char b,c,d,e;

 b=(number/1000);

 c=(number/100)%10;

 d=(number/10)%10;

 e=number%10;

 juli[7]=0x30+b;

 juli[8]=0x30+c;

 juli[9]=0x30+d;

 juli[11]=0x30+e;

 sendc(juli);

}

void Trig_SuperSonic(void)                            //出发声波

{TRIG=1;delayt(1);TRIG=0;}

void Measure_Distance(void)

{

 unsigned char l;

 unsigned int h,y;

 TR0=1;

 while(ECHO){;}

 TR0=0;

 l=TL0;h=TH0;

 y=(h<<8)+l;

 y=y-0xfc66;                                              //us部分

 distance=y+1000*count;                          //计算总时间

 TL0=0x66;TH0=0xfc;

 delayt(30);

 distance=SPEED_30C*distance/20000;

}

                   

void main(void)

{

 serial_port_initial(reload_count_9600bps,reload_count_9600bps);

 Alarm(2);

 sendc(zifuchuan);

 Init_timer();

 Init_Parameter();

 while(1)

 {

  Trig_SuperSonic();                  //触发超声波发射

  while(ECHO == 0){;}               //等待回声

  Measure_Distance();              //计算脉宽并转换为距离

  display(distance);                   //显示距离

  Init_Parameter();                    // 参数重新初始化

  delayt(100);                            //延时,两次发射之间要至少有10ms间隔

 }

}

void timer0 (void) interrupt 1

{

 TF0=0;

 TL0=0x66;TH0=0xfc;

 count++;

 if(count==18)                        //超声波回声脉宽最多18ms

 {

  TR0=0;

  TL0=0x66;TH0=0xfc;

  count=0;

 }

}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HC-SR04超声波测距模块介绍 的相关文章

  • 接口优化方案

    1 批量思想 xff1a 批量操作数据库 优化前 xff1a for循环单笔入库 for TransDetail detail transDetailList insert detail 优化后 xff1a batchInsert tran
  • springboot前端传一个对象后台怎么接受

    34 courseId 34 3 34 userId 34 34 1234456676 34 34 list 34 34 id 34 34 1 34 34 answer 34 34 B 34 34 id 34 34 1 34 34 answ
  • 前端传一个数组或者集合后台怎么接受

    34 id 34 34 1 34 34 answer 34 34 A 34 34 id 34 34 1 34 34 answer 34 34 A 34 这样的可以直接用一个 64 RequesBody List lt QuestionBac
  • Java8处理List的双层循环

    Java处理List的双层循环程序员经常遇到 xff0c 一般都是当两个List某个值满足某条件时候 xff0c 进行相应的处理 xff1b 1 list和map之间的相互转换 两个List对象当id相同的时候 注意是两个对象 而非两个集合
  • java如何抛出异常

    1 什么时候抛出异常 如果你觉得某些 问题 解决不了了 xff0c 那么你就可以抛出异常了 比如 xff0c 你在写一个service 其中在写到某段代码处 你发现可能会产生问题 xff0c 那么就请抛出异常吧 xff0c 相信我 xff0

随机推荐

  • 发送短信验证码过于频繁问题的解决

    1 对请求的接口做了一个限流的控制 2 利用到 AOP redis 定时器 3 在请求的congtroller层上加相应的注解就可以 具体的Demo工程如下 package com weigu xiaochuang project impo
  • spring的controller是单例还是多例

    我们经常说单例还是多例 那么究竟他们不同的根源在哪 或者说我们应该从哪一方面具体的去理解了 至于这个问题 今天做一个小的探讨 其实我们最终说的是 64 auowired注解的引入的service或mapper是不是单例还是多例的 这个是这个
  • 多线程-批量获取多条线程的执行结果

    当向线程池提交callable任务后 xff0c 我们可能需要一次性获取所有返回结果 xff0c 有三种处理方法 方法一 xff1a 自己维护返回结果 创建一个线程池 ExecutorService executorService 61 E
  • nautilus命令介绍

    nautilus 图形化桌面包括了一个叫做 Nautilus 的文件管理器 在GNOME中是Nautilus 鹦鹉螺 xff0c 而KDE中是Konqueror
  • 写个strcat函数

    include 34 stdio h 34 include lt string h gt void stracat char a char b char temp 128 char p 61 temp int alen 61 strlen
  • linux 下 tcp client的 demo

    include lt stdio h gt include lt stdlib h gt include lt string h gt include lt unistd h gt include lt sys socket h gt in
  • 解决MATLAB2020B关于找不到vs2019C++编译器问题

    在配置matlab 深度学习环境过程中 xff0c 出现找不到vs219C 43 43 编译器 问题 xff0c 尝试了各种办法 xff0c 还是失败 xff0c 经过摸索和结合他人经验 xff0c 最终成功 xff0c 予以总结 xff0
  • Ubuntu下使用w3m命令行模式浏览网页

    w3m是一个基于文本的网页浏览器 xff0c 支持多种操作系统 xff0c 在命令行终端可以很好的支持中文 即使在没有鼠标支持的情况下也可以检查网页的输出 我们一般用Ubuntu的X Windows来看图形界面的东西 xff0c 有没有想过
  • CC3D飞控说明书/使用手册

    CC3D飞控说明书 使用手册openpilot librepilot CC硬件配置 记得点赞哦 xff01 xff01 xff01
  • 串口服务器的原理及使用方法

    串口服务器是将来自TCP IP协议的数据包 xff0c 解析为串口数据流 xff1b 反之 xff0c 也可以将串口数据流打成TCP IP协议的数据包 xff0c 从而实现数据的网络传输 它能多个串口设备连接并能将串口数据流进行选择和处理
  • tcpdump命令

    tcpdump tcpdump命令介绍 tcpdump xff0c 用简单的语言概括就是dump the traffic on a network xff0c 是一个运行在linux平台可以根据使用者需求对网络上传输的数据包进行捕获的抓包工
  • 小程序登录后,接口调用失败返回401

    问题描述 xff1a 小程序登录后 xff0c 所有的内部接口不可调用 xff0c 全部授权失败 xff0c 接口返回401 xff1b 解决办法 xff1a 服务端清缓存就可以了 微信开发者工具中 xff0c 小程序多次登录 xff0c
  • 车牌识别算法 基于yolov5的车牌检测+crnn中文车牌识别 支持12种中文车牌识别

    yolov5 车牌识别算法 xff0c 支持12种中文车牌类型 基于yolov5的车牌检测 车牌矫正以及 基于CRNN的车牌识别 1 单行蓝牌 2 单行黄牌 3 新能源车牌 4 白色警用车牌 5 教练车牌 6 武警车牌 7 双层黄牌 8 双
  • LINUX nautilus 命令

    最近使用Ubuntu的时候发现了一个很好用的小命令 xff1a nautilus nautilus是GNOME桌面下的一个文件管理工具 通过这个命令我们可以在终端下非常方便的打开指定目录的文件 nautilus 命令后面一个 xff0c 表
  • 无人机学习之路——电机

    一 什么是电机 xff1f 电机是整个无人机的四肢 xff0c 没有电机来驱动的话整个无人机就无法飞起来 因此我们来重点介绍下电机的一些基础知识 本篇内容不会很详细 xff0c 不会全部介绍 xff0c 只会介绍无人机需要学习的知识 二 电
  • c++中“::”和“:”啥意思

    c 43 43 中 和 啥意思 1 1 类作用域操作符 指明了成员函数所属的类 如 xff1a M f s 就表示f xff08 s xff09 是类M的成员函数 2 表示 域操作符 例 xff1a 声明了一个类A xff0c 类A里声明了
  • python中执行shell脚本之subprocess模块

    一 最近subprocess使用背景和介绍 因为最近领导要求 xff0c 在Python端调用大数据的shell脚本 xff0c 所以需要用到Python来执行shell脚本 因此需要查看下subprocess模块文档 根据官网文档描述 x
  • odroid-xu4(ubuntu mate 16.04)源码编译opencv 3.2

    硬件平台 xff1a odroid xu4 软件环境 xff1a ubuntu mate 16 04 1 更新软件列表 xff1a sudo apt get update 2 安装依赖包 xff1a apt get install libq
  • Pytorch Tensor基本数学运算

    1 加法运算 示例代码 xff1a import torch 这两个Tensor加减乘除会对b自动进行Broadcasting a 61 torch rand 3 4 b 61 torch rand 4 c1 61 a 43 b c2 61
  • HC-SR04超声波测距模块介绍

    超声波简介 超声波是由机械振动产生的 可在不同介质中以不同的速度传播 具有定向性好 能量集中 传输过程中衰减较小 反射能力较强等优点 超声波传感器可广泛应用于非接触式检测方法 它不受光线 被测物颜色等影响 对恶劣的工作环境具有一定的适应能力