【蓝桥杯单片机进阶强化-05】超声波测距_超声波测距公式-程序员宅基地

技术标签: 蓝桥杯省赛  c语言  蓝桥杯  单片机  

【蓝桥杯单片机进阶强化-05】超声波测距

内容学习来自小蜜蜂老师

一、超声波测距原理

超声波发射模块向某一方向发射超声波,在发射时刻的同时开始计时,超声波在空气中传播,途中碰到障碍物就立即返回来,超声波接收器收到反射波就立即停止计时。

二、计算公式

距离 = 声速 × 发出超声波到接收返回的时间/2
因为超声波在空气中的传播速度受温度影响。声波在空气中的传播速度与温度的关系是:
在20摄氏度时,声速V = 332 + 0.607t (m/s)
利用超声波进行距离测量,要求精度一般都不高,取20摄氏度时候的声速344M/S进行计算,再进行适当的补偿就可以。所以,其计算公式为:距离L = 344M/S * T / 2 = 172M/S * T

三、测距步骤

1-产生8个40KHz的超声波信号,通过TX引脚发射出去。
2-启动定时器,计算计数脉冲。
3-等待超声波信号返回,如果接收到反射回来的信号,RX引脚变为低电平。
4-停止定时器,读取脉冲个数,即获得时间T。
5-根据公式,L = V * T /2m,进行距离的计算。

四、代码实现
#include "reg52.h"
#include "intrins.h"

/********************************************
Date:2022-1-19
Author:小殷同学
Base Learn From:B 站小蜜蜂老师
*********************************************/

sbit TX = P1^0;
sbit RX = P1^1;
unsigned int Time = 0;
unsigned int dis = 0;
#define somenop() {
      _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}
//共阳数目管段码
unsigned char month = 0;	 //定义一个变量让其变化显示
//0-f  0xbf代表 -
unsigned char code SMG_Duan[] = {
    0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
															   0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xbf};


//---------------------------------简单延时函数-------------------------
void delay(unsigned int t)
{
    
 	while(t--);
}


void Delay12us()                  //@12.000MHz 延时12us
{
    
	unsigned char i;
 
	_nop_();
	_nop_();
	i = 33;
	while (--i);
}

//-------------------------------74HC138初始化---------------------------
void Init_74HC138(unsigned char n)
{
    
 	switch(n)
	{
    
	 	case 4:P2 = P2| 0x1f; P2 = 0x80; break;
		case 5:P2 = P2| 0x1f; P2 = 0xa0; break;
		case 6:P2 = P2| 0x1f; P2 = 0xc0; break;
		case 7:P2 = P2| 0x1f; P2 = 0xe0; break;
		case 0:P2 = P2| 0X1f; P2 = 0x00; break; //所有锁存器都不选择
	}
}

//----------------------------------系统初始化---------------------------
void InitSystem(void)
{
    
 	 Init_74HC138(5);
	 P0 = 0x00;			 //关闭继电器与蜂鸣器
	 Init_74HC138(4);
	 P0 = 0xff;   //关闭led
}



//---------------------------------数码管安位显示--------------------------
void SMG_DisplayBit(unsigned char pos ,unsigned char dat)
{
    
 		Init_74HC138(6);
		P0 = 0x01 << pos ;//位选
		Init_74HC138(7);
		P0 = dat;        //段码
}


//-------------------------------关闭所有数码管----------------------
void SMG_CLOSEALL(unsigned char dat)
{
    
	 Init_74HC138(6);
	 P0 = 0xff; //选中所有数码管
	 Init_74HC138(7);
	 P0 = dat; //关闭
}

void SMG_Display_Dynamic(void)
{
    
		SMG_DisplayBit(0,0xff);
		delay(200);
		SMG_DisplayBit(1,0xff);
		delay(200);
		SMG_DisplayBit(2,0xff);
		delay(200);
		SMG_DisplayBit(3,0xff);
		delay(200);
		SMG_DisplayBit(4,0xff);
		delay(200);
		SMG_DisplayBit(5,SMG_Duan[dis/100]);
		delay(200);
		SMG_DisplayBit(6,SMG_Duan[dis/10%10]);
		delay(200);
		SMG_DisplayBit(7,SMG_Duan[dis%10]);
		delay(200);
		SMG_CLOSEALL();
		delay(200);
}


//--------------------------------------发出声波----------------------------------
void SendWave(void)
{
    
	unsigned char i;
	for(i = 0; i < 8;i++)
	{
    
		TX = 1;
		somenop();
		TX = 0;
	 	somenop(); 	
	}
}
//------------------------------------超声波测距----------------------------------
void Ultrasonic_Dis(void)
{
    
	TMOD &= 0x0f; //定时器1模式0 13位最大值8192
	TH1 = 0x00;
	TL1 = 0x00;
	TF1  = 0; //溢出标志位
	TR1 = 0;
	SendWave();	 //发送声波信号
	TR1 = 1;//启动定时
	while(RX == 1 && TF1 == 0);	//等待超声波信号返回或者等到测量超出范围  返回RX = 0
	TR1 = 0;//停止计时
	if(TF1 == 1) //溢出了还没有返回信号
	{
    
	 	TF1 = 0;
		dis = 999;
	}
	else
	{
    
	 	 //接收到了返回信号 将定时时间合成16位
		 Time = (TH1 << 8) | TL1; //总时间
		 //dis = ((Time / 10) * 17) / 100 + 3;
		 dis = Time * 0.0172;	
	}
}
//------------------------------------------------------------------------------------
void Delay_SMG(	unsigned char t)
{
    
 	while(t--)
	{
    
		SMG_Display_Dynamic();
	}
}


void main(void)
{
    
	InitSystem();
 	while(1)
	{
    
		 Ultrasonic_Dis();
		 Delay_SMG(50);
	}
}
上面代码测距有误差 
 dis = ((Time / 10) * 17) / 100 + 3; 这个是按老师写的 实现的最大为207 这句代码有点没有理解 望大佬指点
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/boybs/article/details/122578011

智能推荐

我的演讲——科技创新的困境与解决方案_中国在过去遇到科技问题和困境-程序员宅基地

文章浏览阅读510次。这实在是一个费劲儿的事情,我又比较懒,不想一个个把自己演讲的内容再复述一遍。感觉这样做既不fashion,又没创意,于是将自己的演讲大纲结构和演讲PPT呈上,以供各位同学朋友参考。大纲如图所示,PPT在云盘上放着,如果想看,自己下载看看就可以了,聊博一笑。PPT位置,百度云盘:https://pan.baidu.com/s/1bSUIEM更多博客和文章:_中国在过去遇到科技问题和困境

https://github.com/3123958139/blog-3123958139-程序员宅基地

文章浏览阅读126次。https://github.com/3123958139/blog-3123958139转载于:https://www.cnblogs.com/blog-3123958139/p/5606707.html

Git(15)- Git 分支 - 分支开发工作流_第15讲 git分支-程序员宅基地

文章浏览阅读151次。文章目录长期分支主题分支超详细 Git 图文版小白教程(持续更新)现在你已经学会新建和合并分支,那么你可以或者应该用它来做些什么呢? 在本节,我们会介绍一些常见的利用分支进行开发的工作流程。而正是由于分支管理的便捷, 才衍生出这些典型的工作模式,你可以根据项目实际情况选择一种用用看。长期分支因为 Git 使用简单的三方合并,所以就算在一段较长的时间内,反复把一个分支合并入另一个分支,也不是什么难事。 也就是说,在整个项目开发周期的不同阶段,你可以同时拥有多个开放的分支;你可以定期地把某些主题分支合并_第15讲 git分支

Module-Apache使用说明_fatal: trafficserver has not been designed to serv-程序员宅基地

文章浏览阅读2.7k次。Module-Apache 使用说明Apache 简介Apache 是世界使用排名第一的 Web 服务器软件。它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的 Web 服务器端软件之一。它快速、可靠并且可通过简单的 API 扩充,将 Perl/Python 等解释器编译到服务器中。同时 Apache 音译为阿帕奇,是北美印第安人的一个部落,叫阿帕奇族,在..._fatal: trafficserver has not been designed to serve pages while running as r

mysql 存储过程赋值问题以及mysql 中 ifnull 使用_mysql中ifnull(bnum,0)修改时还是当前读码-程序员宅基地

文章浏览阅读1.1k次。mysql 存储过程赋值问题以及mysql 中 ifnull 使用_mysql中ifnull(bnum,0)修改时还是当前读码

告别码农,成为真正的程序员<转载>-程序员宅基地

文章浏览阅读60次。本文是我借助 Google 从网上拼凑的文章,可能条理不是很清晰,希望对广大程序员们有些帮助。一、成长的寓言:做一棵永远成长的苹果树一棵苹果树,终于结果了。第一年,它结了10个苹果,9个被拿走,自己得到1个。对此,苹果树愤愤不平,于是自断经脉,拒绝成长。第二年,它结了5个苹果,4个被拿走,自己得到1个。「哈哈,去年我得到了10%,今年得到20%! 翻了一番」。这棵苹果树心理平衡...

随便推点

[OpenGL] 体积雾-程序员宅基地

文章浏览阅读4.5k次。开发环境:Qt, OpenGL(注 : 水平有限,实现细节不一定完全正确,可能相比一般的体积雾实现过程会显得过于复杂,所以仅供参考;动图有闪烁和条纹现象是录屏软件的问题)概念引入 体积雾,简单来说就是有体积的区域雾,在体积雾内的物体,会显得模糊;而在体积雾外的物体,则是物体的原颜色。 现在我们已经明确了,如果物体落在体积雾内,我们需要在雾的颜色和物体..._体积雾

为tmux和vim开启斜体和真彩色-程序员宅基地

文章浏览阅读1.3k次。为tmux和vim开启斜体和真彩色这篇文章是我上一篇博客:为tmux和vim开启真彩色的拓展一般终端会支持斜体,但是tmux中是无法显示斜体的。网上的很多教程都已经过时,今天我来分享下如何在tmux中启用斜体吧。参考:reference1. 检查tmux中能否显示斜体echo -e "\e[3mitalic\e[23m"2. 创建新的终端类型我们创建一种新的终端类型tmux-256c...

基于Eclipse的Hadoop应用开发环境配置_通过eclipse安装()可实现hadoop开发环境的图形化-程序员宅基地

文章浏览阅读1.2k次。Hadoop集群(第7期)_Eclipse开发环境设置1、Hadoop开发环境简介1.1 Hadoop集群简介  Java版本:jdk-6u31-linux-i586.bin  Linux系统:CentOS6.0  Hadoop版本:hadoop-1.0.0.tar.gz1.2 Windows开发简介  Java版本:jdk-6u31-win_通过eclipse安装()可实现hadoop开发环境的图形化

C++ sort函数详解_sort(起始地址,末尾地址+1)意思-程序员宅基地

文章浏览阅读748次,点赞2次,收藏4次。Sort函数,是C++里面常用函数,一般用于排序 有三个参数: 在 algorithm 函数包里面(1)第一个是要排序的数组的起始地址。(2)第二个是结束的地址(最后一位要排序的地址的下一地址)(3)第三个参数是排序的方法,可以是从大到小也可是从小到大,还可以不写第三个参数,此时默认的排序方法是从小到大排序。代码示例:#include <iostream>#i..._sort(起始地址,末尾地址+1)意思

排序问题-程序员宅基地

文章浏览阅读255次。2019独角兽企业重金招聘Python工程师标准>>> ..._documentelement.getelementsbytagname("orderno")[0].firstchild 怎么判断有没da

myeclipse安装反编译插件-程序员宅基地

文章浏览阅读2.4k次。由于需要查看class文件的源码,上网看了有好多方法说的不够详细,自己整理了相关步骤:一、准备工作1)jad.exe 下载地址:http://varaneckas.com/jad/2)net.sf.jadclipse_3.3.0.jar http://prdownloads.sourceforge.net/jadclipse/net.sf.jadclipse_3.3.0.ja

推荐文章

热门文章

相关标签