*************************************************************************************
声明:我使用的单片机的型号是stc89c51rc,
大家请根据自己的实际情况来配置
****************************************************************************************************
简介
由于超声波指向性强,能量消耗缓慢,在介质中传播的距离较远,因而超声波经常用于距离的测量,如测距仪和物位测量仪等都可以通过超声波来实现。利用超声波检测往往比较迅速、方便、计算简单、易于做到实时控制,并且在测量精度方面能达到工业实用的要求,因此在移动机器人研制上也得到了广泛的应用。------百度百科
工作原理
超声波发射器向某一方向发射超声波,在发射时刻的同时开始计时,超声波在空气中传播,途中碰到障碍物就立即返回来,超声波接收器收到反射波就立即停止计时。超声波在空气中的传播速度为340m/s,根据计时器记录的时间t,就可以计算出发射点距障碍物的距离(s),即:s=340t/2 。这就是所谓的时间差测距法。
超声波测距的原理是利用超声波在空气中的传播速度为已知,测量声波在发射后遇到障碍物反射回来的时间,根据发射和接收的时间差计算出发射点到障碍物的实际距离。由此可见,超声波测距原理与雷达原理是一样的。
测距的公式表示为:L=C×T
式中L为测量的距离长度;C为超声波在空气中的传播速度;T为测量距离传播的时间差(T为发射到接收时间数值的一半)。
所用材料
软件以及超声波测距模块以及最小开发板
认识超声波模块及其原理
电路图
简化一下
测距原理
我们可以根据时序图来理解
发射超声波:
(软件控制)给Trig引脚一个超过10us的高电平
然后超声波会从模块内部发送出来
接收超声波
有信号返回,通过IO输出一高电平,高电平持续的时间就是超声波在空气中的传播时间
算距离
测试距离=(高电平时间*声速(340M/S))/2;
代码实现(模块化编程)图片概览
代码
UART头文件
#ifndef __UART_H__
#define __UART_H__
void UART_Init(void);
void UART_SendByte(void);
#endif
UART.c
#include <REGF51RC.H>
#include <stdio.h>
#include <Delay.h>
//******设置引脚(根据自己的设计作改动)
sbit TRIG=P1^6;
sbit ECHO=P1^7;
/**
* @brief 串口初始化
* @param void
* @retval void
*/
void UART_Init(void)
{
PCON |= 0x80;
SCON = 0x50;
/*TMOD &= 0x0f;
TMOD |=0x20;*/
TMOD=0x21;//定时器1为模式2,定时器0为模式1;
TH1 = 0xf3;
TL1 = 0xf3;
TR1 = 1;
ET1=0;
}
/**
* @brief 串口发送一个字节数据,然后开始测距
* @param void
* @retval void
*/
//接收模块
float time,distance;
void UART_SendByte(void)
{
SBUF=0x01;
TRIG=0;
TMOD=0x21;
TL0 = 0x00;
TH0 = 0x00;
TR0 = 0;
ET0=1;
EA=1;
//给Trig引脚一个至少为10us色高电平
TRIG=1;
Delay(2);
TRIG=0;
//等待接收
while(ECHO==0);
//ECHO=1定时器0开始技术(定时器1被串口通信占用)
TH0=0x00;
TL0=0x00;
TR0=1;
while(ECHO==1);
//ECHO=0;
//停止计数
TR0=0;
//计算时间的方法
time=TH0*256.0+TL0;
distance=(time/2.0)*0.034;//cm
//输出距离以文本的形式
printf("%3f",distance);
while(TI==0);
TI=0;
}
Delay.h(延时x*10us)
#ifndef __DELAY_H__
#define __DELAY_H__
void Delay(unsigned int us);
#endif
Delay.c
#include <intrins.h>
void Delay(unsigned int us)//10*us us;
{
unsigned int j;
for(j=0;j<us;j++){
unsigned char data i;
_nop_();
i = 2;
while (--i);}
}
主函数
#include <REGF51RC.H>
#include "Delay.h"
#include "UART.H"
void main()
{
UART_Init();
while(1){
UART_SendByte();
Delay(100000);
}
}
现象
距离相对正确,成功!
***********************************************
注意波特率的设置,我选择的是4800,接收区要求选择文本模式;要不然之能显示一串数字。
能看到这,说明你是个爱学习的人,如果我文章中有不旦之处,请私信作者,我会尽快改正,我会感谢您宝贵的意见。若这篇文章对您有些许的帮助,我会欣喜不已,也请您点赞收藏,让更多人看到这篇文章。
标签:__,UART,void,51,Delay,单片机,串口,include,超声波 From: https://blog.csdn.net/ice_typ2024/article/details/143865013