本模块功能安稳,运用便利,测度间隔准确。能和国外的SRF05,SRF02等超声波测距模块相媲美,且价格实惠,是你收购超声波器材的抱负挑选。模块高精度,盲区(2cm)超近,安稳的测距是此产品成功走向市场的有力依据!丈量规模在2cm~500cm,丈量精度3mm,丈量时与被测物体无直接触摸,能够明晰安稳地显现丈量成果。因为超声波指向性强,能量消耗缓慢,在介质中传达的间隔较远,因而超声波常常用于间隔的丈量,如测距仪和物位丈量仪等都能够经过超声波来完成。
超声波测距器,能够运用于轿车倒车、修建施工工地以及一些工业现场的方位监控,也可用于液位、井深、管道长度的丈量,用于机器人操控、小车逃避妨碍等场合中。小车上装置此模块合作舵机运用能操控得更便利。运用超声波检测往往比较敏捷、便利、核算简略、易于做到实时操控,并且在丈量精度方面能到达工业有用的要求。因而在移动机器人的研发上也得到了广泛的运用。
模块功能
1:运用电压:DC5V;
2:静态电流:小于2mA;
3:输出信号:电平信号,高电平5V,低电平为0V;
4:感应视点:不大于15度;
5:勘探间隔:2cm-500cm
6: 高精度:可达0.3cm
超声波测距模块作业原理:
(1)选用单片机IO触发测距,给至少10us的高电平信号;
(2)模块主动发送8个40khz的方波,主动检测是否有信号回来;
(3)有信号回来,经过echo输出一高电平,高电平继续的时刻便是超声波从发射到回来的时刻。
用户经过从trig脚输入40kHz的方波信号,即用户从单片机的IO口接连宣布凹凸电平,发生方波,方波的个数一般为10个左右;然后就能够在接纳端等候高电平输出,一有输出就能够开定时器计时,当此口变为低电平时就能够读定时器的值,高电平的时刻便是此次测距的时刻,依据以下公式核算丈量间隔:
测验间隔=(高电平时刻*声速(340m/s))/2;
注意事项
1、超声波发射头向外发射60度角的超声束,因而,在探头与被测物体之间不能有其他妨碍物。
2、超声波模块测得的是被测物体与探头之间的垂直间隔,丈量时要坚持探头正对被测物体。
3、超声波丈量会受环境风速、温度等的影响。
4、模块应先插好在电路板上再通电,防止发生高电平的误动作,假如发生了,从头通电方可处理。
或许呈现的问题
1、因为超声波会遭到被测物体不平坦、反射视点、环境风速温度以及屡次反射的影响,或许会带来丈量数据误差增大。
2、因为超声波有丈量盲区的固有特性,因而,假如近间隔丈量时,当丈量方位发生变化而接纳到的数据不变时,阐明进入了丈量盲区。
3、模块在丈量远处物体时,假如没有丈量数据回来,或许是超出丈量规模,或是丈量视点不对。能够恰当调整丈量视点。
***********************************************************************************/
/*模块高精度,盲区2cm,丈量规模在2cm~500cm,丈量精度3mm*/
#include
#include
#define uint unsigned int
#define uchar unsigned char
unsigned char code WE0[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x80};//0x40-不带点
//unsigned char code WE1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xf0,0xef,0x80}; //0-9 带点
unsigned char temp[3];
sbit RX=P3^4; //承受端,ECHO
sbit TX=P3^5; //操控端,TRIG
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
bit flag=0;
uint time=0;
uint s=0;
void delay(int xms)//延时大约x毫秒
{
int i,j;
for(i=xms;i>0;i–)
for(j=110;j>0;j–);
}
void start() //给至少10us的高电平,发动模块
{
TX=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
TX=0;
}
uchar count()
{
time=TH0*256+TL0;
TH0=0;
TL0=0; //清零
s=(time*1.7)/100;//厘米
return s;
}
void dispros()//数据切割
{
temp[0]=s%1000/100;//百位
temp[1]=s%1000%100/10; //十位
temp[2]=s%100%100%10; //个位
}
void display() //显现函数
{
uchar i;
if(s>=500||s<=2||flag==1) //进入盲区,溢出
{
flag=0;
s=0;
TH0=0;
TL0=0; //清零
for(i=0;i<3;i++) //显现-
{
P0=0x40;
switch(i)
{
case 0:LSA=0; LSB=0; LSC=0; break;
case 1:LSA=1; LSB=0; LSC=0; break;
case 2:LSA=0; LSB=1; LSC=0; break;
}
delay(2);
}
}
else //正常显现
{
LSA=0;LSB=0;LSC=0;
P0= WE0[temp[0]]; delay(3);
LSA=1;LSB=0; LSC=0;
P0= WE0[temp[1]]; delay(2);
LSA=0;LSB=1;LSC=0;
P0= WE0[temp[2]]; delay(1);
}
}
void main()
{
TMOD=0X01; //定时器作业方式0
TH0=0;
TL0=0;
EA=1; //开总中止
ET0=1;//开定时器中止
while(1)
{
start();//发动模块
while(!RX); //当RX为零时等候
TR0=1; //发动计数
while(RX); //当RX为1时计数并等候
TR0=0; //封闭计数器
count(); //计数
dispros(); //处理,切割数据
display(); //显现
delay(1);
}
}
void t0() interrupt 0
{
flag=1; //溢出标志
}