51单片机学习笔记7 -- 超声波测距
超声波测距实操
- 1.超声波
- 2.超声波模块
- 2.1 模块参数
- 2.2 模块原理图
- 2.3 超声波位差测距
- 2.4 模块特征
- 3.超声波测距编程
- 3.1 超声波+流水灯
- 3.2 超声波+蜂鸣器
1.超声波
蝙蝠和某些海洋动物都能够利用高频率的声音进行回声定位或信息交流。它们能通过口腔或鼻腔把从喉部产生的超声波发射出去,利用折回的声波来定向,并判定附近物体的位置、大小以及是否在移动。超声波是一种频率高于20000赫兹的声波,它的方向性好,穿透能力强,易于获得较集中的声能,在水中传播距离远,可用于测距、测速、清洗、焊接、碎石、杀菌消毒等。在医学、军事、工业、农业上有很多的应用。超声波因其频率下限大于人的听觉上限而得名。科学家们将每秒钟振动的次数称为声音的频率,它的单位是赫兹(Hz)。我们人类耳朵能听到的声波频率为20Hz-20000Hz。因此,我们把频率高于20000赫兹的声波称为“超声波”。通常用于医学诊断的超声波频率为1兆赫兹-30兆赫兹。理论研究表明,在振幅相同的条件下,一个物体振动的能量与振动频率成正比,超声波在介质中传播时,介质质点振动的频率很高,因而能量很大.在中国北方干燥的冬季,如果把超声波通入水罐中,剧烈的振动会使罐中的水破碎成许多小雾滴,再用小风扇把雾滴吹入室内,就可以增加室内空气湿度,这就是超声波加湿器的原理。如咽喉炎、气管炎等疾病,很难利用血流使药物到达患病的部位,利用加湿器的原理,把药液雾化,让病人吸入,能够提高疗效。利用超声波巨大的能量还可以使人体内的结石做剧烈的受迫振动而破碎,从而减缓病痛,达到治愈的目的。超声波在医学方面应用非常广泛,可以对物品进行杀菌消毒。
2.超声波模块
2.1 模块参数
在超声波实验中常用的超声波模块是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
2.2 模块原理图
2.3 超声波位差测距
超声波传感器与单片机系统进行接口构成距离检测的硬件系统,在系统软件的控制下,单片机向位差超声波传感器发送的一个触发脉冲,位差超声波传感器被此脉冲触发后会产生一道短40 kHz的脉冲电信号,此40 kHz的脉冲电信号通过激励换能器处理以后,将转换成机械振动的能量,其振动频率约在20 kHz以上,由此形成了超声波,该信号经锥形"辐射口"处将超声波信号在空气中以每秒约1 130英尺的速度向外发射出去。
当发射出去的超声波信号遇到障碍物以后,立即被反射回来。接收器接收到反射回来的超声波信号后,通过其内部转换,将超声波变成微弱的电振荡,并将信号进行放大,就可得到所需的脉冲信号,此脉冲信号再返回给单片机,表示回波被探测,这个脉冲宽度就是对应于爆裂回声返回到传感器所需时间,其时序如图所示。
2.4 模块特征
HC-SR04超声波测距模块具有测距距离精确,能和SRF05,SRF02等超声波测距相媲美,测量距离 2cm ~ 450cm (实测:6cm ~ 330cm)。
工作原理
1)采用IO触发测距,给至少10us的高电平信号。
2)模块自动发送8个40KHz的方波,自动检测是否有信号返回。
3)有信号返回,通过模块IO输出高电平,高电平持续时间就是超声波从发射到返回的时间。只需要提供一个10uS以上脉冲触发信号,该模块内部将发出8个40kHz周期电平并检测回波。一旦检测到有回波信号则输出回响信号。回响信号的脉冲宽度与所测的距离成正比。由此通过发射信号到收到的回响信号时间间隔可以计算得到距离。
公式:
uS/58=厘米
或uS/148=英寸
或距离=高电平时间*声速(340M/S) /2
建议测量周期为60ms以上,以防止发射信号对回响信号的影响。
1、此模块不宜带电连接,若要带电连接,则先让模块的GND端先连接,否则会影响模块的正常工作。
2、测距时,被测物体的面积不少于05平方米且平面尽量要求平整,否则影响测量的结果。
3.超声波测距编程
按照超声波时序图,发送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;//高电平时间赋值,单位ustime = TH0*256 + TL0; // TH0<<8 | TL0TH0 = 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溢出时退出whileTF0 = 0; //TF0置0
}
将超声波回响信号时间间隔转换成距离
float GetDistance(unsigned int time)
{float distance;distance = (float)time * 0.017; //cmreturn 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溢出时退出whileTF0 = 0; //TF0置0
}float GetDistance(unsigned int time)
{float distance;distance = (float)time * 0.017; //cmreturn 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;//高电平时间赋值,单位ustime = TH0*256 + TL0; // TH0<<8 | TL0TH0 = 0;TL0 = 0;return time;
}void main()
{unsigned int time = 0;float distance;while(1){ time = RunOnce(); //计算超声波测距时 传感器接收到高电平的时间distance = GetDistance(time);}
}
3.1 超声波+流水灯
用流水灯点亮个数来“显示”超声波距离
#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溢出时退出whileTF0 = 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;//高电平时间赋值,单位ustime = TH0*256 + TL0; // TH0<<8 | TL0TH0 = 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));}
}
3.2 超声波+蜂鸣器
按超声波不同间隔使蜂鸣器叫出不同频率
#include<reg52.h>
#include<intrins.h>#define ON 0
#define OFF 1sbit 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溢出时退出whileTF0 = 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;//高电平时间赋值,单位ustime = TH0*256 + TL0; // TH0<<8 | TL0TH0 = 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);}}
}
51单片机学习笔记7 -- 超声波测距相关推荐
- 51单片机学习笔记-1简介及点灯
51单片机学习笔记 文章目录 51单片机学习笔记 1. 51单片机简介 1.1 安装软件 1.2 单片机简介 2. LED灯 2.1点亮一个LED 2.1.1原理分析 2.1.2 创建工程 2.2LE ...
- AutoLeaders控制组—51单片机学习笔记
文章目录 AutoLeaders控制组-51单片机学习笔记 1.1单片机及开发板介绍 单片机介绍 单片机应用领域 STC89C52单片机 内部结构 开发板介绍 2.1点亮一个Led 新建工程 编程 认 ...
- 单片机c语言北航,【下载资料】《51单片机学习笔记》北航版
原标题:[下载资料]<51单片机学习笔记>北航版 如果手机下载有问题,请移步至电脑端,链接:https://forum.mianbaoban.cn/t/topic/36906 内容简介 本 ...
- 51单片机学习笔记2 仿真器的使用及STC89Cxx简介
51单片机学习笔记2 仿真器的使用及STC89Cxx简介) 一.连接步骤 1. 硬件连接 2. 安装软件驱动 3. 检查是否安装成功 二.仿真步骤 1. 打开一个51工程 2. 选择仿真设备 3. S ...
- [51单片机学习笔记TWO]----蜂鸣器
蜂鸣器音乐播放实验 首先应该了解一下蜂鸣器音乐播放的原理,在这里我只讲一下电磁式蜂鸣器驱动原理(还有一种是压电式蜂鸣器): 电磁式蜂鸣器驱动原理: 蜂鸣器发声原理是电流通过电磁线圈,使电磁圈产生磁场来 ...
- 51单片机学习笔记5 流水灯实现及蜂鸣器控制
51单片机学习笔记5 流水灯实现及蜂鸣器控制 一.流水灯 1. 硬件电路 2. 代码实现 (1) 点亮一个LED的基本操作 (2) 使用算术左移实现流水灯 (3) 使用库文件左移函数 二.蜂鸣器 1. ...
- 51单片机学习笔记1 简介及开发环境
51单片机学习笔记1 简介及开发环境 一.51单片机 1. STC89C52单片机简介 2. 命名规则 3. 封装 (1)PDIP (2)LQFP (3)PLCC (4)PQFP 二.STC8051结 ...
- 【51单片机学习笔记】基于STC11F04E的蜂鸣器音乐播放器
微型播放器 --基于STC11F04E的蜂鸣器控制 青岛科技大学 信息科学技术学院 集成162 Listen C 一.简介 1. ...
- Autoleaders控制组——51单片机学习笔记
前要:本笔记为初学者上b站江科大自化协的51单片机入门教程P1-P12所得笔记,包含单片机简介和LED.独立按键.数码管相关内容. 目录 1.1.什么是单片机以及为什么要学单片机?51是什么? 2-1 ...
- 51单片机学习笔记-6串口通信
6 串口通信 [toc] 注:笔记主要参考B站江科大自化协教学视频"51单片机入门教程-2020版 程序全程纯手打 从零开始入门". 注:工程及代码文件放在了本人的Github仓库 ...
最新文章
- vue开发页面自适应_vue-cli 【flexible】屏幕字体自适应布局及配置
- 3. 什么是icmp?icmp与ip的关系_你知道如何跟女生,确定恋人关系吗?
- java中常见的编译错误的是_编译时JAVA最常见的错误有哪些
- 模块A:大数据平台搭建(容器环境)
- mysql 数据库复制软件_mysql 快速复制数据库
- nodejs 前端 返回数组给_互联网寒冬,一年经验字节跳动、虾皮、快手、拼多多前端面试总结...
- java虚拟机jvm_java虚拟机jvm - zhuyuansj的个人空间 - OSCHINA - 中文开源技术交流社区...
- 关于一个类中方法的调用
- QEMU文档之bypass iommu
- LCD1602芯片的使用——简单易懂
- 中国建筑抗震设计规范反应谱v2.0(2012a)运行环境
- PSP实机用虚拟机wifi网卡联机
- rn在java中什么意思,RN150中RN是什么意思
- day16 正则检测、匹配次数、分组与分支、re模块、匹配参数
- WPS和office办公软件的word同时存在时,想用office的word的解决办法
- 无界键鼠(MouseWithoutBorders)的安装与无法连接的解决方案
- 如何做一个基于JAVA失物招领网站系统毕业设计毕设作品(springboot框架)
- 稳定渐进稳定,一致有界一致最终有界
- 用扩展程序下载油管视频(好用
- [C#问题--WebBrowser继续追踪]WebBrowser在Form程序中使用的感想2
热门文章
- newifi mini php,NewFi(newifi mini华硕固件)
- 在XX小学六一儿童节庆祝大会上的致辞
- 大数据项目实战——基于某招聘网站进行数据采集及数据分析(六)
- springboot生成二维码可扫描自定义内容
- python快速实现简易超级玛丽小游戏
- 国家代码查询表(ISO 3166 Codes A2)
- 可中心可边缘,云计算“罗马大路”需要什么样的超融合新基建?
- 用rand(7)构造rand(10)
- 华为手机灵敏度设置_和平精英灵敏度怎么调最稳华为手机?华为二指灵敏度调整设置一览[多图]...
- keil更改黑色背景颜色