超声波测距实操
蝙蝠和某些海洋动物都能够利用高频率的声音进行回声定位或信息交流。它们能通过口腔或鼻腔把从喉部产生的超声波发射出去,利用折回的声波来定向,并判定附近物体的位置、大小以及是否在移动。超声波是一种频率高于20000赫兹的声波,它的方向性好,穿透能力强,易于获得较集中的声能,在水中传播距离远,可用于测距、测速、清洗、焊接、碎石、杀菌消毒等。在医学、军事、工业、农业上有很多的应用。超声波因其频率下限大于人的听觉上限而得名。科学家们将每秒钟振动的次数称为声音的频率,它的单位是赫兹(Hz)。我们人类耳朵能听到的声波频率为20Hz-20000Hz。因此,我们把频率高于20000赫兹的声波称为“超声波”。通常用于医学诊断的超声波频率为1兆赫兹-30兆赫兹。理论研究表明,在振幅相同的条件下,一个物体振动的能量与振动频率成正比,超声波在介质中传播时,介质质点振动的频率很高,因而能量很大.在中国北方干燥的冬季,如果把超声波通入水罐中,剧烈的振动会使罐中的水破碎成许多小雾滴,再用小风扇把雾滴吹入室内,就可以增加室内空气湿度,这就是超声波加湿器的原理。如咽喉炎、气管炎等疾病,很难利用血流使药物到达患病的部位,利用加湿器的原理,把药液雾化,让病人吸入,能够提高疗效。利用超声波巨大的能量还可以使人体内的结石做剧烈的受迫振动而破碎,从而减缓病痛,达到治愈的目的。超声波在医学方面应用非常广泛,可以对物品进行杀菌消毒。

在超声波实验中常用的超声波模块是4针的SR04,也有5针的超声波模块

主要技术参数
1:使用电压:DC—5V
2:静态电流:小于2mA
3:电平输出:高 5V
4:电平输出:底 0V
5:感应角度:不大于15度
6:探测距离:2cm - 450cm
7: 高精度 可达0.2cm
8: 接线方式(上图从左到右):VCC、Trig(控制端)、Echo(接收端)、 GND

超声波传感器与单片机系统进行接口构成距离检测的硬件系统,在系统软件的控制下,单片机向位差超声波传感器发送的一个触发脉冲,位差超声波传感器被此脉冲触发后会产生一道短40 kHz的脉冲电信号,此40 kHz的脉冲电信号通过激励换能器处理以后,将转换成机械振动的能量,其振动频率约在20 kHz以上,由此形成了超声波,该信号经锥形"辐射口"处将超声波信号在空气中以每秒约1 130英尺的速度向外发射出去。

当发射出去的超声波信号遇到障碍物以后,立即被反射回来。接收器接收到反射回来的超声波信号后,通过其内部转换,将超声波变成微弱的电振荡,并将信号进行放大,就可得到所需的脉冲信号,此脉冲信号再返回给单片机,表示回波被探测,这个脉冲宽度就是对应于爆裂回声返回到传感器所需时间,其时序如图所示。

HC-SR04超声波测距模块具有测距距离精确,能和SRF05,SRF02等超声波测距相媲美,测量距离 2cm ~ 450cm (实测:6cm ~ 330cm)。
工作原理
1)采用IO触发测距,给至少10us的高电平信号。
2)模块自动发送8个40KHz的方波,自动检测是否有信号返回。
3)有信号返回,通过模块IO输出高电平,高电平持续时间就是超声波从发射到返回的时间。只需要提供一个10uS以上脉冲触发信号,该模块内部将发出8个40kHz周期电平并检测回波。一旦检测到有回波信号则输出回响信号。回响信号的脉冲宽度与所测的距离成正比。由此通过发射信号到收到的回响信号时间间隔可以计算得到距离。
公式:
1、此模块不宜带电连接,若要带电连接,则先让模块的GND端先连接,否则会影响模块的正常工作。
2、测距时,被测物体的面积不少于05平方米且平面尽量要求平整,否则影响测量的结果。
按照超声波时序图,发送10us触发触发信号,并记录回响信号的时间间隔
unsigned int RunOnce()
{
unsigned int time;
//10us高电平发送触发信号
Trig = 0;
Trig = 1;
Delay10us();
Trig = 0;
//等待高电平信号接收
while(!Echo);
//T0清0重新计数(高电平持续时间)
TH0 = 0;
TL0 = 0;
TR0 = 1;
//等待高电平信号接收结束
while(Echo);
//关闭T0计数
TR0 = 0;
//高电平时间赋值,单位us
time = TH0*256 + TL0; // TH0<<8 | TL0
TH0 = 0;
TL0 = 0;
return time;
}
10us的延时用定时器0来完成(定时器0配置详情见定时器中断)
// 延时10us
void Delay10us()
{
TMOD |= 0x01; //16位定时器/计数器,TH0、TH1全用
TH0 = 0xFF;
TL0 = 0xF6;
TR0 = 1; //TR0为1时允许T0开始计数
while(!TF0); //当T0溢出时退出while
TF0 = 0; //TF0置0
}
将超声波回响信号时间间隔转换成距离
float GetDistance(unsigned int time)
{
float distance;
distance = (float)time * 0.017; //cm
return distance;
}
在main函数中做函数调用,完整demo如下
#include<reg52.h>
#include<intrins.h>
sbit Trig = P0^0;
sbit Echo = P0^1;
//毫秒延时函数
void delay_ms(unsigned int t)
{
unsigned char i, j, z;
for(z = t;z>0;z--)
{
_nop_();
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
}
// 延时10us
void Delay10us()
{
TMOD |= 0x01; //16位定时器/计数器,TH0、TH1全用
TH0 = 0xFF;
TL0 = 0xF6;
TR0 = 1; //TR0为1时允许T0开始计数
while(!TF0); //当T0溢出时退出while
TF0 = 0; //TF0置0
}
float GetDistance(unsigned int time)
{
float distance;
distance = (float)time * 0.017; //cm
return distance;
}
unsigned int RunOnce()
{
unsigned int time;
//10us高电平发送触发信号
Trig = 0;
Trig = 1;
Delay10us();
Trig = 0;
//等待高电平信号接收
while(!Echo);
//T0清0重新计数(高电平持续时间)
TH0 = 0;
TL0 = 0;
TR0 = 1;
//等待高电平信号接收结束
while(Echo);
//关闭T0计数
TR0 = 0;
//高电平时间赋值,单位us
time = TH0*256 + TL0; // TH0<<8 | TL0
TH0 = 0;
TL0 = 0;
return time;
}
void main()
{
unsigned int time = 0;
float distance;
while(1)
{
time = RunOnce(); //计算超声波测距时 传感器接收到高电平的时间
distance = GetDistance(time);
}
}
用流水灯点亮个数来“显示”超声波距离
#include<reg52.h>
#include<intrins.h>
sbit Trig = P0^0;
sbit Echo = P0^1;
//毫秒延时函数
void delay_ms(unsigned int t)
{
unsigned char i, j, z;
for(z = t;z>0;z--)
{
_nop_();
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
}
// 延时10us
void Delay10us()
{
TMOD |= 0x01; //16位定时器/计数器,TH0、TH1全用
TH0 = 0xFF;
TL0 = 0xF6;
TR0 = 1; //TR0为1时允许T0开始计数
while(!TF0); //当T0溢出时退出while
TF0 = 0; //TF0置0
}
float GetDistance(unsigned int time)
{
float distance;
distance = (float)time * 0.017;
return distance;
}
unsigned int RunOnce()
{
unsigned int time;
//10us高电平发送触发信号
Trig = 0;
Trig = 1;
Delay10us();
Trig = 0;
//等待高电平信号接收
while(!Echo);
//T0清0重新计数(高电平持续时间)
TH0 = 0;
TL0 = 0;
TR0 = 1;
//等待高电平信号接收结束
while(Echo);
//关闭T0计数
TR0 = 0;
//高电平时间赋值,单位us
time = TH0*256 + TL0; // TH0<<8 | TL0
TH0 = 0;
TL0 = 0;
return time;
}
void RunLED(unsigned int LEDnum)
{
unsigned int RunNum = LEDnum;
switch(RunNum){
case 0:
P1 = 0x00;
delay_ms(20);
P1 = 0xff;
delay_ms(20);
break;
case 1: P1 = 0xfe;
break;
case 2: P1 = 0xfc;
break;
case 3: P1 = 0xf8;
break;
case 4: P1 = 0xf0;
break;
case 5: P1 = 0xe0;
break;
case 6: P1 = 0xc0;
break;
case 7: P1 = 0x80;
break;
case 8: P1 = 0x00;
break;
default:
P1 = 0x00;
break;
}
}
void main()
{
unsigned int time = 0;
float distance;
while(1)
{
time = RunOnce();
distance = GetDistance(time);
RunLED((int)(distance/10));
}
}
按超声波不同间隔使蜂鸣器叫出不同频率
#include<reg52.h>
#include<intrins.h>
#define ON 0
#define OFF 1
sbit Trig = P0^0;
sbit Echo = P0^1;
//毫秒延时函数
void delay_ms(unsigned int t)
{
unsigned char i, j, z;
for(z = t;z>0;z--)
{
_nop_();
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
}
// 延时10us
void Delay10us()
{
TMOD |= 0x01; //16位定时器/计数器,TH0、TH1全用
TH0 = 0xFF;
TL0 = 0xF6;
TR0 = 1; //TR0为1时允许T0开始计数
while(!TF0); //当T0溢出时退出while
TF0 = 0; //TF0置0
}
float GetDistance(unsigned int time)
{
float distance;
distance = (float)time * 0.017;
return distance;
}
unsigned int RunOnce()
{
unsigned int time;
//10us高电平发送触发信号
Trig = 0;
Trig = 1;
Delay10us();
Trig = 0;
//等待高电平信号接收
while(!Echo);
//T0清0重新计数(高电平持续时间)
TH0 = 0;
TL0 = 0;
TR0 = 1;
//等待高电平信号接收结束
while(Echo);
//关闭T0计数
TR0 = 0;
//高电平时间赋值,单位us
time = TH0*256 + TL0; // TH0<<8 | TL0
TH0 = 0;
TL0 = 0;
return time;
}
void main()
{
unsigned int time = 0;
float distance;
while(1)
{
time = RunOnce();
distance = GetDistance(time);
if(distance <= 10.0){
BUZZER = ON;
delay_ms(50);
BUZZER = OFF;
delay_ms(50);
}
else if((10.0 < distance) && (distance <= 20.0)){
BUZZER = ON;
delay_ms(100);
BUZZER = OFF;
delay_ms(100);
}
else if((20.0 < distance) && (distance <= 50.0)){
BUZZER = ON;
delay_ms(160);
BUZZER = OFF;
delay_ms(160);
}
}
}
说在前面这部分我本来是合为一篇来写的,因为目的是一样的,都是通过独立按键来控制LED闪灭本质上是起到开关的作用,即调用函数和中断函数。但是写一篇太累了,我还是决定分为两篇写,这篇是调用函数篇。在本篇中你主要看到这些东西!!!1.调用函数的方法(主要讲语法和格式)2.独立按键如何控制LED亮灭3.程序中的一些细节(软件消抖等)1.调用函数的方法思路还是比较清晰地,就是通过按下按键来控制LED闪灭,即每按下一次,LED取反一次。重要的是,把按键与LED联系在一起。我打算用K1来作为开关,看了一下开发板原理图,K1连接的是单片机的P31口,当按下K1时,P31是与GND相连的,也就是说,当我按下去时
目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称
最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总
深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal
我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or
如何学习ruby的正则表达式?(对于假人) 最佳答案 http://www.rubular.com/在Ruby中使用正则表达式时是一个很棒的工具,因为它可以立即将结果可视化。 关于ruby-我如何学习ruby的正则表达式?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/1881231/
深度学习12.CNN经典网络VGG16一、简介1.VGG来源2.VGG分类3.不同模型的参数数量4.3x3卷积核的好处5.关于学习率调度6.批归一化二、VGG16层分析1.层划分2.参数展开过程图解3.参数传递示例4.VGG16各层参数数量三、代码分析1.VGG16模型定义2.训练3.测试一、简介1.VGG来源VGG(VisualGeometryGroup)是一个视觉几何组在2014年提出的深度卷积神经网络架构。VGG在2014年ImageNet图像分类竞赛亚军,定位竞赛冠军;VGG网络采用连续的小卷积核(3x3)和池化层构建深度神经网络,网络深度可以达到16层或19层,其中VGG16和VGG
文章目录1、自相关函数ACF2、偏自相关函数PACF3、ARIMA(p,d,q)的阶数判断4、代码实现1、引入所需依赖2、数据读取与处理3、一阶差分与绘图4、ACF5、PACF1、自相关函数ACF自相关函数反映了同一序列在不同时序的取值之间的相关性。公式:ACF(k)=ρk=Cov(yt,yt−k)Var(yt)ACF(k)=\rho_{k}=\frac{Cov(y_{t},y_{t-k})}{Var(y_{t})}ACF(k)=ρk=Var(yt)Cov(yt,yt−k)其中分子用于求协方差矩阵,分母用于计算样本方差。求出的ACF值为[-1,1]。但对于一个平稳的AR模型,求出其滞
写在之前Shader变体、Shader属性定义技巧、自定义材质面板,这三个知识点任何一个单拿出来都是一套知识体系,不能一概而论,本文章目的在于将学习和实际工作中遇见的问题进行总结,类似于网络笔记之用,方便后续回顾查看,如有以偏概全、不祥不尽之处,还望海涵。1、Shader变体先看一段代码......Properties{ [KeywordEnum(on,off)]USL_USE_COL("IsUseColorMixTex?",int)=0 [Toggle(IS_RED_ON)]_IsRed("IsRed?",int)=0}......//中间省略,后续会有完整代码 #pragmamulti_c
TCL脚本语言简介•TCL(ToolCommandLanguage)是一种解释执行的脚本语言(ScriptingLanguage),它提供了通用的编程能力:支持变量、过程和控制结构;同时TCL还拥有一个功能强大的固有的核心命令集。TCL经常被用于快速原型开发,脚本编程,GUI和测试等方面。•实际上包含了两个部分:一个语言和一个库。首先,Tcl是一种简单的脚本语言,主要使用于发布命令给一些互交程序如文本编辑器、调试器和shell。由于TCL的解释器是用C\C++语言的过程库实现的,因此在某种意义上我们又可以把TCL看作C库,这个库中有丰富的用于扩展TCL命令的C\C++过程和函数,所以,Tcl是