蓝桥杯单片机快速开发笔记——超声波测距

一、原理分析

        超声波测距是一种常见的测距方法,其原理是利用超声波在空气中传播的速度恒定且较快的特性,通过发送超声波信号并接收回波,计算出物体与传感器之间的距离。以下是超声波测距的原理和应用:

原理:

  1. 发送超声波信号:超声波传感器发送一个短脉冲的超声波信号。
  2. 接收回波:超声波信号遇到物体后会被反射回来,传感器接收到回波信号。
  3. 计算时间差:通过测量发送超声波和接收回波之间的时间差,可以计算出超声波在空气中传播的时间。
  4. 计算距离:利用声波在空气中的传播速度(约为340m/s),将时间差转换为距离,即距离 = 速度 x 时间差。

应用:

  1. 测距应用:超声波测距广泛应用于机器人导航、智能车辆、无人机等领域,用于测量物体与传感器之间的距离,实现避障、定位等功能。
  2. 液位检测:超声波传感器可以用于检测液体的液位高度,常见于水箱、油箱等液位监测系统中。
  3. 智能家居:超声波传感器可以用于智能家居系统中,如智能灯光控制、智能门窗感应等。
  4. 工业自动化:在工业自动化领域,超声波传感器常用于测量物体的距禋、检测物体的存在等。

  注意事项:

        超声波模块的TX引脚接到单片机的P1.0端口RX引脚接到单片机的P1.1端口,注意按照上图连接好。

二、思维导图

三、示例框架

#include "intrins.h"
#include "stc15.h"
#include "smg.h"


sbit TX = P1^0;
sbit RX = P1^1;


extern unsigned int dat_f;

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

void Send_Wave()                 //产生8个40KHx超声波信号
{
	unsigned char i;
	for(i = 0; i < 8; i++)
	{
		TX = 1;           //将 TX 端口置为高电平,表示开始发送超声波信号。
		Delay12us();	    //调用延时函数 Delay12us(),延时12微秒。
		TX = 0;           //将 TX 端口置为低电平,表示停止发送超声波信号。
		Delay12us();
	}
}
 
void Measure_Distance()	        //超声波测距
{
	unsigned int time = 0;    //定义了一个无符号整型变量 time,用于存储测量到的时间。
														//将 TMOD 寄存器的高四位清零,保留低四位不变。这样可以确保只修改定时器1的工作模式,而不影响其他位。
	
	TMOD &= 0x0f;	            //定时器1模式0,13位定时器,最大8192个计数脉冲								
	TL1 = 0x00;										
	TH1 = 0x00;		
	
	Send_Wave();		    //发送超声波信号							
	TR1 = 1;            //启动定时器1						
	while((RX == 1) && (TF1 == 0));    //在循环中等待接收到超声波信号的回波且没有超出测量范围。
									   //TF1 是一个标识符,用于表示定时器1的溢出标志
	TR1 = 0;            //停止定时器				
	
	if(TF1 == 0)	            //正常测量范围							
	{
		time = TH1;			                        //将定时器1的值 TH1 读取到 time 变量中。						
		time = (time << 8) | TL1;		            //将定时器1的值 TL1 读取并与 TH1 合并,得到完整的时间值。
		dat_f = ((time / 10) * 17) / 100 + 3;   //根据计算公式将测量到的时间转换为距离,并存储在 dat_f 变量中。
	}
	else                        //超出测量范围			
	{
		TF1 = 0;
		dat_f = 999;
	}
}
  1. unsigned int dat_f;:定义一个无符号整型变量 dat_f,用于存储测量到的距离。

  2. void Delay12us():定义一个延时函数,用于实现12微秒的延时。

  3. void Send_Wave():定义一个函数,用于产生8个40KHz的超声波信号。在循环中,先将 TX 端口置为高电平,然后调用 Delay12us() 函数实现延时,再将 TX 端口置为低电平,再次调用 Delay12us() 函数实现延时。

  4. void Measure_Distance():定义一个超声波测距函数。在函数中:

    • 清零定时器1的模式位,设置为模式0,13位,最大8192个计数脉冲。
    • 将定时器1的低8位寄存器 TL1 和高8位寄存器 TH1 初始化为0。
    • 调用 Send_Wave() 函数发送超声波信号。
    • 启动定时器1。
    • 在 while 循环中,等待接收到超声波信号的回波或者超出测量范围。
    • 停止定时器1。
    • 如果测量在正常范围内,将定时器1的值读取到 time 变量中,然后根据一定的计算公式将测量到的时间转换为距离,并存储在 dat_f 变量中。
    • 如果超出测量范围,将 dat_f 设为999。

相关推荐

最近更新

  1. TCP协议是安全的吗?

    2024-03-23 22:36:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-23 22:36:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-23 22:36:01       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-23 22:36:01       20 阅读

热门阅读

  1. NSURLSessionConfiguration

    2024-03-23 22:36:01       18 阅读
  2. centos7 安装php82

    2024-03-23 22:36:01       17 阅读
  3. 编写人脸检测程序

    2024-03-23 22:36:01       21 阅读
  4. Vue3:编程式路由导航

    2024-03-23 22:36:01       24 阅读
  5. MySQL系统参数配置实战:生产环境优化

    2024-03-23 22:36:01       22 阅读
  6. Android设计规范及分辨率简介

    2024-03-23 22:36:01       22 阅读