《电子DIY》之基于51单片机的超声波测距(HC-SR04超声波模块)

一,超声波

超声波是声波的一部分,是人耳听不见、频率高于20KHZ的声波,它和声波有共同之处,即都是由物质振动而产生的,并且只能在介质中传播;同时,它也广泛地存在于自然界,许多动物都能发射和接收超声波,其中以蝙蝠最为突出,它能利用微弱的超声回波在黑暗中飞行并捕捉食物。但超声还有它的特殊性质’如具有较高的频率与较短的波长,所以,它也与波长很短的光波有相似之处。(摘自百度)

二,超声波模块(HC-SR04)

1,实物图
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
2,引脚定义

引脚          功能
VCC          电源正(通常+5V)
GND         电源地
trig           触发信号(输出)
echo        回响信号(输入)

3,电气参数
在这里插入图片描述
4,原理分析
(1)时序如下:
在这里插入图片描述
(2)分析及距离计算方式

由时序图可知:需要提供一个10uS 以上脉冲触发信号,该模块内部将发出8个40kHz周期电平并检测回波。一旦检测到有回波信号则输出回响号。
回响信号的脉冲宽度与所测的距离成正比。由此通过发射信号到收到的回响信号时间间隔可以计算得到距离。公式:uS/58=厘米或者uS/148=英寸:或是:距离=高电平时间*声速(340M/S)/2。建议测量周期为60ms 以上,以防止发射信号。
备注:
1,如果要更精确,声速与温度有关,可测温度然后计算声速
2,此模块不宜带电连接,若要带电连接,则先让模块的GND端先连接,否则会影响模块的正常工作。
3,测距时,被测物体的面积不少于0.5平方米且平面尽量要求平整,否则影响测量的结果
4,建议测量周期为60ms 以上,以防止发射信号。

三,程序源码

/**********************************************/

/**********************************************/	  
#include "reg51.h"
#include "intrins.h"

#define uchar unsigned  char
#define uint  unsigned   int  

sbit  Trig=P1^1;
sbit  Echo=P1^2;
sbit  LED=P1^3;

uint  time=0;
int distance=0;
bit   Time_flag =0;
uchar dat[9];

void Data_Handler(void);
void delay_ms(int ms);
void  Start_Work(void);

void Data_Handler(void)
{	
	uchar i=0;
	TI=0;
	time=TH0*256+TL0;
	TH0=0;
	TL0=0;
	distance=(time*1.7)/10;     
	dat[0]=distance/1000+0x30;
	dat[1]=distance%1000/100+'0';
	dat[2]=distance%100/10+'0';
	dat[4]=distance%10+'0';
	dat[3]='.';
	dat[5]='C';
	dat[6]='M';
	dat[7]=0x0a;
	dat[8]=0x0d;
	if(Time_flag==1)		    
	{
		Time_flag=0;
		return ;
	}
	for(i=0;i<9;i++)
	{
		SBUF=dat[i];
		while(!TI);
		TI=0;	
	}
}
 
void delay_ms(int ms)
{
	int i,j;
	for(i=0;i<ms;i++)
		for(j=0;j<118;j++);
}


void T0Interrupt(void) interrupt 1 		 
{
	Time_flag=1;							 
}

void  Start_Work(void) 		     
{
	Trig=0;
	_nop_();
	Trig=1;			                 
	_nop_(); 
	_nop_(); 
	_nop_(); 
	_nop_(); 
	_nop_(); 
	_nop_(); 
	_nop_(); 
	_nop_(); 
	_nop_(); 
	_nop_(); 
	_nop_(); 
	_nop_(); 
	_nop_(); 
	_nop_(); 
	_nop_(); 
	_nop_(); 
	_nop_();
	_nop_(); 
	_nop_();  
	_nop_();
	Trig=0;
}

/********************************************************/
int main()
{  
	TMOD=0x21;		   
	SCON=0x50;
	TH1=0xFD;
	TL1=0xFD;
	TH0=0;
	TL0=0; 
	TR0=1;  
	ET0=1;             
	TR1=1;			   
	TI=0;
	LED=1;	
	Trig=1;
	EA=1;			   
	while(1)
	{
		Start_Work();
		while(!Echo);		
		TR0=1;			    
		
		while(Echo);			
		TR0=0;			
		
		Data_Handler();			
				LED=!LED;	
		delay_ms(1000);	

		
	}
	return 0;
}  

void T1Inter(void)interrupt 3
{

}            

效果图:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/liuxianfei0810/article/details/106227469