蓝桥杯单片机必备知识—–(9)超声波测距

蓝桥杯单片机必备知识—–(9)超声波测距

蓝桥杯单片机必备知识—–(9)超声波测距

超声波测距原理:

超声波发射器向某一方向发射超声波,在发射时刻的同时开始计时,超声波在空气中传播,途中碰到障碍物就立即返回来,超声波接收器收到反射波就立即停止计时。超声波在空气中的传播速度为340m/s,根据计时器记录的时间t,就可以计算出发射点距障碍物的距离(s),即:s=340t/2 。这就是所谓的时间差测距法。
超声波测距的原理是利用超声波在空气中的传播速度为已知,测量声波在发射后遇到障碍物反射回来的时间,根据发射和接收的时间差计算出发射点到障碍物的实际距离。由此可见,超声波测距原理与雷达原理是一样的。
测距的公式表示为:L=C×T
式中L为测量的距离长度;C为超声波在空气中的传播速度;T为测量距离传播的时间差(T为发射到接收时间数值的一半)。
超声波测距主要应用于倒车提醒、建筑工地、工业现场等的距离测量,虽然目前的测距量程上能达到百米,但测量的精度往往只能达到厘米数量级。
由于超声波易于定向发射、方向性好、强度易控制、与被测量物体不需要直接接触的优点,是作为液体高度测量的理想手段。在精密的液位测量中需要达到毫米级的测量精度,但是目前国内的超声波测距专用集成电路都是只有厘米级的测量精度。

核心代码:

//切记,计算距离不使用分频
sbit TX = P1^0;  //发射引脚
sbit RX = P1^1;  //接收引脚
void main(void)
{

cls();
AUXR = 0x80;
TMOD = 0x10;  //配置定时器工作模式
TH0 = 0xcd;
TL0 = 0xd4;  
TH1 = 0;
TL1 = 0;  
TR0 = 1;  //启动定时器
EA = 1;
ET0 = 1;  //打开定时器0中断
while(1)
{

/** 100毫秒更新一次数据 */
if(s_flag)
{

s_flag = 0;
send_wave();  //发送方波信号
TR1 = 1;  //启动计时
while((RX == 1) && (TF1 == 0));  //等待收到脉冲,没有计满溢出
TR1 = 0;  //关闭计时
//发生溢出
if(TF1 == 1)
{

TF1 = 0;
distance = 9999;  //无返回
}
else
{

/** 计算时间 */
time=TH1*256+TL1;
distance = (unsigned int)(time*0.017);  //计算距离 
}
TH1 = 0;
TL1 = 0;
}
}
}
//12us
void Delay12us()//@11.0592MHz
{

unsigned char i;
_nop_();
_nop_();
_nop_();
i = 30;
while (--i);
}
void send_wave()//发送八段脉冲波(40Khz)
{

unsigned char i = 8;
while(i --)
{

TX = 1;
Delay12us();
TX = 0;
Delay12us();
}
}

测试结果:
在这里插入图片描述

整个代码粘贴

#include <stc15f2k60s2.h>
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
sbit TX = P1^0;  //发射引脚
sbit RX = P1^1;  //接收引脚
uchar tab[] = {
 0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0xff};
uchar dspbuf[] = {
10,10,10,10,10,10,10,10};
uint distance,time = 0;
uchar s_flag = 0;
void display();
void load();
void Delay12us();
void send_wave();
void cls()
{

P2 = (P2 & 0x1f) | 0x80;
P0 = 0xff;
P2 = 0x1f;
P2 = (P2 & 0x1f) | 0xa0;
P0 = 0x00;
P2 = 0x1f;
}
void main(void)
{

cls();
AUXR = 0x80;
TMOD = 0x10;  //配置定时器工作模式
TH0 = 0xcd;
TL0 = 0xd4;  
TH1 = 0;
TL1 = 0;  
TR0 = 1;  //启动定时器
EA = 1;
ET0 = 1;  //打开定时器0中断
while(1)
{

/** 200毫秒更新一次数据 */
if(s_flag)
{

s_flag = 0;
/** 关闭定时器0中断:计算超声波发送到返回的时间 */
// ET0 = 0;
send_wave();  //发送方波信号
TR1 = 1;  //启动计时
while((RX == 1) && (TF1 == 0));  //等待收到脉冲,没有计满溢出
TR1 = 0;  //关闭计时
//发生溢出
if(TF1 == 1)
{

TF1 = 0;
distance = 9999;  //无返回
}
else
{

/** 计算时间 */
time=TH1*256+TL1;
distance = (unsigned int)(time*0.017);  //计算距离 
}
TH1 = 0;
TL1 = 0;
}
}
}
//定时器0中断服务函数
void time0()  interrupt 1  //默认中断优先级 1
{

static unsigned int intr = 0;
if(++intr == 100){
s_flag = 1;intr = 0;}
display();
}
void load()
{

dspbuf[5] = distance/100;
dspbuf[6] = distance%100/10;
dspbuf[7] = distance%10; 
}
void Delay12us()//@11.0592MHz
{

unsigned char i;
_nop_();
_nop_();
_nop_();
i = 30;
while (--i);
}
void send_wave()//发送八段脉冲波(40Khz)
{

unsigned char i = 8;
while(i --)
{

TX = 1;
Delay12us();
TX = 0;
Delay12us();
}
}
void display()
{

static unsigned char dspcom = 0;
load();
P2 = (P2 & 0x1f) | 0xe0;
P0 = 0xff;
P2 = 0x1f;
P2 = (P2 & 0x1f) | 0xc0;
P0 = 1 << dspcom;
P2 = 0x1f;
P2 = (P2 & 0x1f) | 0xe0;
P0 = tab[dspbuf[dspcom]];
P2 = 0x1f;
if(++dspcom == 8) dspcom = 0;
}

这时好多人会有疑惑,12us延时该如何做;
在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/100124.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • anaconda卸载环境[通俗易懂]

    anaconda卸载环境[通俗易懂]如果是用anaconda新建了一个环境(比如原生py2.7版本的anaconda,新建了一个py3.6的环境),现在要将py3.6卸载,也就是将这个环境、包括第三方库和python3.6本身都删除,那么可以这样做:1.打开anaconda自带的命令行工具2.确保当前激活的环境不是你要卸载的环境,如果是,那么需要运行:activatexxxxxx是其他环境名,切换到其他环境3….

  • [Cqoi2014]数三角形——组合数

    [Cqoi2014]数三角形——组合数[Cqoi2014]数三角形——组合数

  • nifi mysql hive_Nifi入门

    nifi mysql hive_Nifi入门NiFi基本概念概述简单地说,NiFi是为了自动化系统之间的数据流而构建的。虽然术语“数据流”在各种环境中使用,但我们在此处使用它来表示系统之间自动化和管理的信息流。这个问题空间一直存在,因为企业有多个系统,其中一些系统创建数据,一些系统消耗数据。已经讨论并广泛阐述了出现的问题和解决方案模式。企业集成模式中提供了一个全面且易于使用的表单。NiFi的诞生,要致力于解决的问题:因为网络故障、磁盘故障…

    2022年10月25日
  • BZOJ3995:[SDOI2015]道路修建(线段树)[通俗易懂]

    BZOJ3995:[SDOI2015]道路修建(线段树)

  • goland激活码2021【在线破解激活】

    goland激活码2021【在线破解激活】,https://javaforall.cn/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

  • 任务调度器有哪些_本地计算机上的task scheduler

    任务调度器有哪些_本地计算机上的task schedulerTaskScheduler可以看做任务调度的客户端,负责任务的提交,并且请求集群管理器对任务调度。TaskScheduler的类UML图如下,针对不同部署方式会有不同的TaskScheduler与SchedulerBackend进行组合。TaskScheduler类负责任务调度资源的分配,SchedulerBackend负责与Driver、Executor通信收集Executor上分配给该应用的资…

    2022年10月11日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号