超声波简介
超声波是由机械振动产生的, 可在不同介质中以不同的速度传播, 具有定向性好、能量集中、传输过程中衰减较小、反射能力较强等优点。超声波传感器可广泛应用于非接触式检测方法,它不受光线、被测物颜色等影响, 对恶劣的工作环境具有一定的适应能力, 因此在水文液位测量、车辆自动导航、物体识别等领域有着广泛的应用。
超声波测距原理
超声波测距是通过不断检测超声波发射后遇到障碍物所反射的回波, 从而测出发射和接收回波的时间差Δt , 然后求出距离S 。在速度v 已知的情况下,距离S 的计算,公式如下:S = vΔt/ 2在空气中,常温下超声波的传播速度是334 米/秒,但其传播速度V 易受空气中温度、湿度、压强等因素的影响,其中受温度的影响较大,如温度每升高1 ℃, 声速增加约0. 6 米/ 秒。因此在测距精度要求很高的情况下, 应通过温度补偿的方法对传播速度加以校正。已知现场环境温度T 时, 超声波传播速度V 的计算公式如下:
V = 331. 5+0.607T
这样, 只要测得超声波发射和接收回波的时间差Δt 以及现场环境温度T,就可以精确计算出发射点到障碍物之间的距离。
HC-SR04超声波测距模块简介
HC-SR04超声波测距模块可提供2cm-400cm的非接触式距离感测功能,测距精度可达高到3mm;模块包括超声波发射器、接收器与控制电路。
HC-SR04超声波测距模块实物图
HC-SR04超声波测距模块特点
1、典型工作用电压:5V
2、超小静态工作电流:小于5mA
3、感应角度(R3 电阻越大,增益越高,探测角度越大):
R3 电阻为392,不大于15 度
R3 电阻为472, 不大于30 度
4、探测距离(R3 电阻可调节增益,即调节探测距离):
R3 电阻为392 2cm-450cm
R3 电阻为472 2cm-700cm
5、高精度:可达0.3cm
6、盲区(2cm)超近
HC-SR04超声波测距模块管脚
VCC(5V)、 Trig(控制端)、 Echo(接收端)、地(GND)
使用方法:控制口发一个10US 以上的高电平,就可以在接收口等待高电平输出。一有输出就可以开定时器计时,当此口变为低电平时就可以读定时器的值,此时就为此次测距的时间,方可算出距离。如此不断的周期测,就可以达到你移动测量的值了。
HC-SR04超声波测距模块工作原理
1、采用IO 触发测距,给至少10us 的高电平信号;
2、模块自动发送8 个40khz 的方波,自动检测是否有信号返回;
3、有信号返回,通过IO 输出高电平,高电平持续时间就是超声波从发射到返回时间.测试距离=(高电平时间*声速(340M/S))/2。
以上时序图表明只需要提供一个10US以上的脉冲触发信号,该模块内部将发出8个40kHz周期电平并检测回波。一旦检测到有回波信号则输出回响信号。回响信号的脉冲宽度与所测的距离成正比。由此通过发射信号到收到的回响信号时间间隔可以计算得到距离。距离=高电平时间*声速。
HC-SR04超声波测距模块应用注意事项
1、此模块不宜带电连接,如果要带电连接,则先让模块的Gnd 端先连接。否则会影响模块工作。
2、测距时,被测物体的面积不少于0.5 平方米且要尽量平整。否则会影响测试结果。
HC-SR04超声波测距模块测距例程
/***********************超声波测距串口输出**********************
* 处理器:STC89C52RC
* 开发环境:KEIL
* 名称:超声波测距串口输出
* 说明:波特率9600
/****************************包含头文件***************************/
#include <reg52.h>
/*******************************宏定义*****************************/
#define SPEED_30C 3495 //30摄氏度时的声速,声速V=331.5+0.6*温度;
#define SPEED_23C 3453 //23摄氏度时的声速,声速V=331.5+0.6*温度;
/******************************位定义******************************/
//FOSC = 11.0592MHz,12T模式,SMOD=0
#define reload_count_1200bps 0xe8
#define reload_count_2400bps 0xf4
#define reload_count_4800bps 0xfa
#define reload_count_9600bps 0xfd
sbit ECHO=P1^6; //回声接收端口
sbit TRIG=P1^5; //超声触发端口
sbit BEEP=P2^3; //蜂鸣器
/*************************定义变量和数组*************************/
long int distance=0; //距离变量
unsigned char count;
void Delay5Ms(void);
void delay(int In,int Out);
unsigned char zifuchuan[]="SSLV WELCOME!"; //待显示字符
unsigned char juli[]="距离为: . 厘米"; //待显示字符
void delayt(unsigned int x)
{
unsigned char j;
while(x-->0){for(j=0;j<125;j++){;}}
}
void delay(int In,int Out)
{
int i,j;
for(i=0;i<In;i++)
{for(j=0;j<Out;j++){;}}
}
void serial_port_initial(char TH,char TL)
{
SCON=SCON|0x50; //0101,0000 8位可变波特率,无奇偶校验位
TMOD=TMOD|0x20; //0011,0001 设置定时器1为8位自动重装记数器
PCON=PCON|0x00;
TH1=TH;TL1=TL; //设置定时器1自动重装数
ES=1; //允许串口中断
EA=1; //开总中断
TR1=1; //开定时器1
}
void send_UART(unsigned char i) //发送一节函数
{
ES=0; //关串 口中断
TI=0; //清零串口发送完成中断请求标志
SBUF=i;
while(TI==0); //等特数据传送
TI=0; //清除数据传送标志
ES=1;
}
void sendc(unsigned char * pd)
{
while((*pd)!='\0') //发送字符串,直到遇到0才结束
{
send_UART(*pd); //发送一个字符
pd++; //移动到下一个字符
}
}
void Alarm(unsigned char t)
{
unsigned char i;
for(i=0;i<t;i++)
{BEEP=0;delay(10,1000);BEEP=1;delay(10,1000);}
}
void Init_timer(void)
{
TMOD=TMOD|0x01; //定时器0初始化,设置为16位自动重装模式
TL0=0x66;TH0=0xfc; //1ms
ET0=1; //开定时器0
EA=1; //总中断使能
}
void Init_Parameter(void)
{TRIG=1;ECHO=1;count=0;distance=0;}
void display(int number)
{
unsigned char b,c,d,e;
b=(number/1000);
c=(number/100)%10;
d=(number/10)%10;
e=number%10;
juli[7]=0x30+b;
juli[8]=0x30+c;
juli[9]=0x30+d;
juli[11]=0x30+e;
sendc(juli);
}
void Trig_SuperSonic(void) //出发声波
{TRIG=1;delayt(1);TRIG=0;}
void Measure_Distance(void)
{
unsigned char l;
unsigned int h,y;
TR0=1;
while(ECHO){;}
TR0=0;
l=TL0;h=TH0;
y=(h<<8)+l;
y=y-0xfc66; //us部分
distance=y+1000*count; //计算总时间
TL0=0x66;TH0=0xfc;
delayt(30);
distance=SPEED_30C*distance/20000;
}
void main(void)
{
serial_port_initial(reload_count_9600bps,reload_count_9600bps);
Alarm(2);
sendc(zifuchuan);
Init_timer();
Init_Parameter();
while(1)
{
Trig_SuperSonic(); //触发超声波发射
while(ECHO == 0){;} //等待回声
Measure_Distance(); //计算脉宽并转换为距离
display(distance); //显示距离
Init_Parameter(); // 参数重新初始化
delayt(100); //延时,两次发射之间要至少有10ms间隔
}
}
void timer0 (void) interrupt 1
{
TF0=0;
TL0=0x66;TH0=0xfc;
count++;
if(count==18) //超声波回声脉宽最多18ms
{
TR0=0;
TL0=0x66;TH0=0xfc;
count=0;
}
}