一,超聲波
超聲波是聲波的一部分,是人耳聽不見、頻率高於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
{
}
效果圖: