第十五届蓝桥杯单片机组——超声波测距

文章目录

  • 一、超声波测距原理
  • 二、利用定时器实现测距
    • 2.1 结合定时器实现过程
    • 2.2 伪代码
  • 三、代码示例

一、超声波测距原理

超声波测距是一种常用的测量距离的方法,凭借其非接触性、准确度高以及对环境因素影响小的优点,广泛应用于各类机器人、自动驾驶车辆、物体探测、避障等场景。
这种技术的基础是发送超声波并计算其返回时间。在理想情况下,超声波在空气中的速度约为343米/秒(在20°C下)。通过量化超声波单向或双向的传播时间,就可以计算出距离。

操作步骤如下:

  1. 发射超声波:发送器首先发射一束超声波,通常是在40kHz频率。
  2. 接收反射的超声波:发送出去的超声波会碰到障碍物然后反射回来,被超声波接收器接收。
  3. 计算传播时间:通过电路_timer_或者微控制器,计算超声波被发射和接收的时间差。
  4. 计算距离:最后,使用以下公式计算到障碍物的距离:距离= (超声波速度 * 时间) / 2

这种测距方法可以实现中短距离的精确测量,受环境条件影响小,适合在各种环境中使用。

二、利用定时器实现测距

2.1 结合定时器实现过程

  1. 设置Trig引脚高电平:通过软件使Trig引脚输出10微秒以上的高电平,这将促使超声波模块发出8个40kHz的超声波。
  2. 等待接收到Echo信号:然后等待Echo引脚从低电平变为高电平,当接收到Echo信号时,开始用定时器测量时间。
  3. 计算超声波来回时间:当Echo引脚再度变为低电平时,立即停止计时。这个时间就是超声波从发射到反射并接收回来的所有时间。
  4. 计算距离:将这个时间(单位应转化为秒)除以2(因为是来回的时间),然后乘以声速(在空气中为343m/s)即可得到距离。为了方便,我们通常直接把数值转成厘米,公式如下: 距离 =(时间 * 声速 / 2) * 100。

2.2 伪代码

#define Trig P2_0  // Trig接口
#define Echo P2_1  // Echo接口
#define Sound_Velocity 343 // 声速343m/svoid Timer0Init(void);  // 初始化定时器
void Ultrasonic_Init(void); // 超声波初始化double Distance; 
unsigned int High_Time; // 高电平时间
unsigned int Low_Time; // 低电平时间void main()
{Ultrasonic_Init();while(1){Trig = 1;delay(15);   // 发出至少10us的高电平Trig = 0;while(!Echo); //等待Echo反馈TL0 = 0; TH0 = 0; // 装初值TR0 = 1;      // 打开定时器while(Echo);TR0 = 0;      // 关闭定时器High_Time = TH0<<8|TL0;  //读取计数器值Distance = (double)High_Time * Sound_Velocity / 2 / 12;delay(50);   // 延时等待超声波模块稳定}
}

三、代码示例

#include <stc15f2k60s2.h>
#include <intrins.h>
//#include <smg.h>
sbit Tx=P1^0;
sbit Rx=P1^1;
unsigned long dis;unsigned char code dat[]={0xc0, 0xf9, 0xa4, 0xb0, 0x99,0x92, 0x82, 0xf8, 0x80, 0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,0xbf,0x7f,0xff};unsigned char smg_display[]={18,18,18,18,18,18,18,18}; //保存数码管显示的数字void Delay2ms()		//@12.000MHz
{unsigned char i, j;i = 24;j = 85;do{while (--j);} while (--i);
}void selectHC573(unsigned char num)  
{switch(num){case 4:P2=(P2 & 0x1f) | 0x80;break;case 5:P2=(P2 & 0x1f) | 0xa0;break;case 6:P2=(P2 & 0x1f) | 0xc0;break;case 7:P2=(P2 & 0x1f) | 0xe0;break;case 0:P2=(P2 & 0x1f) | 0x00;break;}
}void display_SMG_Bit(unsigned char dat, unsigned pos)
{/*消影法1*/
//	selectHC573(6);
//	P0=0x01<<(pos-1);
//	selectHC573(7);
//	P0=dat;
//	
//	delay(100);
//	P0=0xff;/*消影法2*/P0=0xff;selectHC573(7);selectHC573(0);P0=0x01<<(pos-1);selectHC573(6);selectHC573(0);P0=dat;selectHC573(7);selectHC573(0);}void display_D_SMG()
{	display_SMG_Bit(dat[smg_display[0]],1);Delay2ms();display_SMG_Bit(dat[smg_display[1]],2);Delay2ms();display_SMG_Bit(dat[smg_display[2]],3);Delay2ms();display_SMG_Bit(dat[smg_display[3]],4);Delay2ms();display_SMG_Bit(dat[smg_display[4]],5);Delay2ms();display_SMG_Bit(dat[smg_display[5]],6);Delay2ms();display_SMG_Bit(dat[smg_display[6]],7);Delay2ms();display_SMG_Bit(dat[smg_display[7]],8);Delay2ms();
}void system_Init()
{selectHC573(5);P0=0x00;selectHC573(0);
}void Delay13us()		//@12.000MHz
{unsigned char i;_nop_();_nop_();i = 36;while (--i);
}void Timer0_Init(void)		//100微秒@12.000MHz
{AUXR &= 0x7F;			//定时器时钟12T模式TMOD &= 0xF0;			//设置定时器模式TMOD |= 0x01;			//设置定时器模式TL0 = 0x00;				//设置定时初始值TH0 = 0x00;				//设置定时初始值TF0 = 0;				//清除TF0标志TR0 = 0;				//定时器0开始计时
}void csb_test()
{unsigned char i=0;for(i=0;i<2;i++){Tx=0;Delay13us();Tx=1;Delay13us();}//如果Rx=1或TF0=1者开始计算距离,如果Rx=0且TF0=1说明距离过远/* V1.0版本while(Rx==0);  //我不知道我发完触发信号好Rx引脚会不会马上置为高电平//如果马上置为高电平,它卡在这个while语句出不来。TR0=1;while(Rx==1);*//* V1.1版本 假设它马上高电平,那我去掉那个while语句TR0=1;  while(Rx==1);  // 如果太近或者太远那么Rx永远不会为0,也就一直卡在这里*//* V2.0	*/TR0=1;while(Rx==1 && TF0==0);  // Rx=1,或者定时器还没有计数满就一直循环。if(TF0==0){TR0=0;dis=TH0*256+TL0;dis=((dis*1700)/110592);//340*100/11059200/2smg_display[5]=dis/100;smg_display[6]=dis/10%10;smg_display[7]=dis%10;}else{TF0=0;TR0=0;smg_display[6]=18;smg_display[7]=18;smg_display[8]=18;}TH0=0;TL0=0;}void main()
{system_Init();Timer0_Init();while(1){csb_test();display_D_SMG();}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/639493.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++11手撕线程池 call_once 单例模式 Singleton / condition_variable 与其使用场景

一、call_once 单例模式 Singleton 大家可以先看这篇文章&#xff1a;https://zh.cppreference.com/w/cpp/thread/call_once /*std::call_oncevoid call_once( std::once_flag& flag, Callable&& f, Args&&... args ); */ #include <iostream> #i…

DT浏览器的人工智能是如何学习知识的

DT浏览器的人工智能是如何学习知识的&#xff0c;DT浏览器的人工智能通过大量的数据和算法来实现知识学习的。这是一些学习知识的方式&#xff1a; 1. 数据驱动学习&#xff1a;通过处理和分析大量的文本数据来学习语言知识和语言模式。这些数据可以来自各种来源&#xff0c;如…

解决 pnpm : 无法加载文件 C:\Program Files\nodejs\pnpm.ps1,因为在此系统上禁止运行脚本。

执行下面命令进行安装pnpm安装后 npm install -g pnpm 然后执行pnpm 报错 解决办法&#xff1a; 以管理员身份运行 Windows PowerShell &#xff0c; 在命令行输入以下命令后按回车&#xff0c; set-ExecutionPolicy RemoteSigned 再输入Y 回车即可。 再回到控制台输入p…

k8s---包管理器helm

内容预知 目录 内容预知 helm相关知识 Helm的简介与了解 helm的三个重要概念 helm的安装和使用 将软件包拖入master01上 使用 helm 安装 Chart 对chart的基本使用 查看chart信息 安装chart 对chart的基本管理 helm自定义模板 在镜像仓库中拉取chart&#xff0c;查…

大路灯和台灯哪个对眼睛好?学生备考大灯推荐

最近家长圈里开始流行这么一句话&#xff1a;鸡娃的尽头&#xff0c;是鸡眼。曾经绘画课、科学课、乐高课、思维课一样没落下&#xff0c;讲绘本、学英语也是每天的日常&#xff0c;周一到周日孩子的行程排得满满当当。可没想到有一天带着孩子去医院体检视力的时候&#xff0c;…

Javascript的基本书写方式

目录 JS 书写方式 行内JS 页面JS 外部JS JS 书写方式 在 JS 中也有三种书写方式&#xff1a; 行内JS 页面JS 外部JS 行内JS 我们在 HTML 标签上使用 JS 代码的方式就叫行内 JS&#xff0c;它一般是用于触发某种操作&#xff0c;例如点击事件。 <!DOCTYPE html> …

python 正则表达式学习(1)

正则表达式是一个特殊的字符序列&#xff0c;它能帮助你方便的检查一个字符串是否与某种模式匹配。 1. 特殊符号 1.1 符号含义 模式描述^匹配字符串的开头$匹配字符串的末尾.匹配任意字符&#xff0c;除了换行符&#xff0c;当re.DOTALL标记被指定时&#xff0c;则可以匹配包…

LangChain实战:老喻干货店社交网络Agent一

LangChain实战&#xff1a;老喻干货店社交网络Agent一 如果您也在准备AIGC前端全栈&#xff0c;LangChain是最成熟的AI应用开发框架。欢迎点赞收藏&#xff0c;一起学习AI。 LangChain 一 hello LLM LangChain 二 模型 LangChain 三 Data Connections LangChain 四 Prompts Lan…

大模型学习与实践笔记(十一)

一、使用OpenCompass 对模型进行测评 1.环境安装&#xff1a; git clone https://github.com/open-compass/opencompass cd opencompass pip install -e . 当github超时无法访问时&#xff0c;可以在原命令基础上加上地址&#xff1a; https://mirror.ghproxy.com git clon…

网络流量分析:揭秘网络世界的“魔法水晶球”

在数字化、信息化的时代&#xff0c;网络流量分析如同网络世界中的“X光机”&#xff0c;它使我们能够透视网络内部的数据流动&#xff0c;进而理解、优化并保障网络的健康运行。那么&#xff0c;究竟什么是网络流量分析&#xff1f;它有什么作用&#xff1f;又为何不可或缺&am…

司铭宇老师:房地产中介销售培训课程:如何打消购房者买房疑虑

房地产中介销售培训课程&#xff1a;如何打消购房者买房疑虑 购房是一项重大的人生决定&#xff0c;它不仅涉及到巨大的经济投入&#xff0c;还关系到购房者未来的生活品质。因此&#xff0c;购房者在做出购买决定前往往会有许多疑虑和担忧。作为房地产销售人员&#xff0c;能够…

VS2022联合Qt5开发学习9(QT5.12.3鼠标按下、释放、移动事件以及Qt上取标注点)

在研究医学图像可视化的时候&#xff0c;鼠标响应这里一直都有问题。研究了几天VTK的取点&#xff0c;还是会和Qt冲突。所以现在试试Qt的方式取点&#xff0c;看看能不能实现我的功能。 查了很多资料&#xff0c;这篇博文里的实例有部分参考了祥知道-CSDN博客这位博主的博客[Q…

函数组件useState用法 以及 useState异步回调获取不到最新值

目录 1、useState用法: 三个参数用法 2、如何监听state的变化 3、dispatch更新特点 4、解决上述demo中使用useState 异步回调获取不到最新值 4.1 下面这种情况的写法&#xff0c;仍获取不到最新值&#xff1a; 4.2 解决方案1&#xff1a;dispatch参数&#xff0c;作为函数…

超级菜鸟怎么学习数据分析?

如果你有python入门基础&#xff0c;在考虑数据分析岗&#xff0c;这篇文章将带你了解&#xff1a;数据分析人才的薪资水平&#xff0c;数据人应该掌握的技术栈。 首先来看看&#xff0c;我在搜索数据分析招聘时&#xff0c;各大厂开出的薪资&#xff1a; 那各大厂在数据领域…

DC电源模块的特点及应用案例分享

BOSHIDA DC电源模块的特点及应用案例分享 DC电源模块是一种可以将交流电转换为直流电的设备&#xff0c;具有以下特点&#xff1a; 1.高效稳定&#xff1a;DC电源模块采用高效稳定的电源转换技术&#xff0c;可以将输入的交流电转换为输出的稳定直流电&#xff0c;并且具有高…

什么是游戏盾?哪家效果好。

游戏盾是什么呢&#xff0c;很多做游戏开发的客户估计都是听说过的&#xff0c;但是也不是所有的游戏开发者会运用到。因为&#xff0c;游戏盾是针对游戏行业APP业务所推出的高度可定制的网络安全管理解决方案&#xff0c;除了能针对大型DDoS攻击(T级别)进行有效防御外&#xf…

动态规划学习——机器人运动

//一共有N个位置&#xff0c;机器人从start开始&#xff0c;走K步到end //机器人到1后只能向2运动&#xff0c;到N后只能向N-1运动&#xff0c;即不能越界&#xff0c;只能在1-N的位置运动 //求总的路线的个数 //例&#xff1a; //N4,startp1,endp3,K4 //则路线如下&#xff1a…

Leetcode的AC指南 —— 栈与队列:232.用栈实现队列

摘要&#xff1a; **Leetcode的AC指南 —— 栈与队列&#xff1a;232.用栈实现队列 **。题目介绍&#xff1a;请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作&#xff08;push、pop、peek、empty&#xff09;&#xff1a; 实现 MyQueue 类&#xff1a;…

列表列添加千分位保留两位小数

// 千分位无小数部分 function setThousandsMarkNoDecimal(num) {// console.log(num????, num, typeof num)if (!num) return num;let fu false;if (num.toString().includes(-)) {fu true;num Number(num.toString().substr(1));}// num Math.trunc(num); // 保留整数…

【Spring 篇】MyBatis注解开发:编写你的数据乐章

欢迎来到MyBatis的音乐殿堂&#xff01;在这个充满节奏和韵律的舞台上&#xff0c;注解是我们编写数据乐章的得力助手。无需繁琐的XML配置&#xff0c;通过简单而强大的注解&#xff0c;你将能够轻松地与数据库交互。在这篇博客中&#xff0c;我们将深入探讨MyBatis注解开发的精…