一,超声波
超声波是声波的一部分,是人耳听不见、频率高于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
{
}
效果图: