51单片机学习笔记7 -- 超声波测距

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;

	//高电平时间赋值,单位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);

	}
}
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溢出时退出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));
	}
}
3.2 超声波+蜂鸣器

按超声波不同间隔使蜂鸣器叫出不同频率

#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);
		}
	}
}
  • 77
    点赞
  • 664
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 19
    评论
### 回答1: 51单片机hc-sr04超声波测距模块是一种常用的测距设备,它可以通过发射超声波并接收回波来测量物体与模块之间的距离。该模块具有测量精度高、测距范围广、响应速度快等优点,广泛应用于智能车、机器人、安防监控等领域。 ### 回答2: 51单片机HC-SR04超声波测距模块是一种常用的距离测量工具,利用超声波技术进行非接触式的测量,实现对目标物体距离的快速、准确、稳定的测量。 该模块由超声波发射器、接收器、控制电路以及工作指示灯等部分组成,非常简单易懂,用户只需通过单片机对模块进行编程即可实现距离测量等应用。 在实际应用中,51单片机HC-SR04超声波测距模块可以广泛用于智能机器人、智能车、无人机等电子设备中,实现对目标物体的避障、追踪等功能。 其优势在于测量范围广,可测量的距离范围从2cm到4m不等,具有超低功耗、高精度、抗干扰、体积小等特点,非常适合于各种小型智能电子设备的距离测量需求。 总之,51单片机HC-SR04超声波测距模块是一款非常优秀的距离测量工具,具有广泛的应用前景和潜力,是电子工程师们的首选之一。 ### 回答3: HC-SR04超声波测距模块是一款常见的电子元器件,常用于各种自动化控制、智能机器人和测量等领域。该模块使用超声波信号进行距离测量,具有简单易用、测量精度高等特点,深受广大电子爱好者的喜爱。 HC-SR04超声波测距模块的工作原理是利用超声波在空气中传播的特性来测量物体到模块之间的距离。模块发送超声波信号,当信号遇到障碍物时会被反射回来,模块接收到反射回来的信号,并计算出信号的往返时间,从而得出距离。该模块测量精度高,最大测量距离达到4米,同时还支持多种距离单位、具有灵活的电源和数据接口等特点。 在使用HC-SR04超声波测距模块时,需要注意以下事项:首先,模块需要接入适当的电源,确保信号和电源的稳定;其次,需要正确接线,遵循模块的引脚说明书;最后,还需要注意测量时的环境因素,如温度、湿度等可能影响超声波传输的因素。 综上所述,HC-SR04超声波测距模块是一款实用性强、精度高的电子元器件,可广泛应用于各种领域。对于想要进行距离测量的爱好者和工程师来说,该模块是一款不可多得的好选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GenCoder

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值