51单片机关于超声波测距(可用串口助手显示距离)

*************************************************************************************

声明:我使用的单片机的型号是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,接收区要求选择文本模式;要不然之能显示一串数字。

能看到这,说明你是个爱学习的人,如果我文章中有不旦之处,请私信作者,我会尽快改正,我会感谢您宝贵的意见。若这篇文章对您有些许的帮助,我会欣喜不已,也请您点赞收藏,让更多人看到这篇文章。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值