《電子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
{

}            

效果圖:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章