一款超聲波測(cè)距模塊運(yùn)用程序
超聲波測(cè)距器,可以應(yīng)用于汽車倒車、建筑施工工地以及一些工業(yè)現(xiàn)場(chǎng)的位置監(jiān)控,也可用于液位、井深、管道長(zhǎng)度的測(cè)量,用于機(jī)器人控制、小車躲避障礙等場(chǎng)合中。小車上安裝此模塊配合舵機(jī)使用能控制得更方便。利用超聲波檢測(cè)往往比較迅速、方便、計(jì)算簡(jiǎn)單、易于做到實(shí)時(shí)控制,并且在測(cè)量精度方面能達(dá)到工業(yè)實(shí)用的要求。因此在移動(dòng)機(jī)器人的研制上也得到了廣泛的應(yīng)用。
模塊性能
1:使用電壓:DC5V;
2:靜態(tài)電流:小于2mA;
3:輸出信號(hào):電平信號(hào),高電平5V,低電平為0V;
4:感應(yīng)角度:不大于15度;
5:探測(cè)距離:2cm-500cm
6: 高精度:可達(dá)0.3cm
超聲波測(cè)距模塊工作原理:
(1)采用單片機(jī)IO觸發(fā)測(cè)距,給至少10us的高電平信號(hào);
(2)模塊自動(dòng)發(fā)送8個(gè)40khz的方波,自動(dòng)檢測(cè)是否有信號(hào)返回;
(3)有信號(hào)返回,通過(guò)echo輸出一高電平,高電平持續(xù)的時(shí)間就是超聲波從發(fā)射到返回的時(shí)間。
用戶通過(guò)從trig腳輸入40kHz的方波信號(hào),即用戶從單片機(jī)的IO口連續(xù)發(fā)出高低電平,產(chǎn)生方波,方波的個(gè)數(shù)一般為10個(gè)左右;然后就可以在接收端等待高電平輸出,一有輸出就可以開(kāi)定時(shí)器計(jì)時(shí),當(dāng)此口變?yōu)榈碗娖綍r(shí)就可以讀定時(shí)器的值,高電平的時(shí)間就是此次測(cè)距的時(shí)間,根據(jù)以下公式計(jì)算測(cè)量距離:
測(cè)試距離=(高電平時(shí)間*聲速(340m/s))/2;
注意事項(xiàng)
1、超聲波發(fā)射頭向外發(fā)射60度角的超聲束,因此,在探頭與被測(cè)物體之間不能有其他障礙物。
2、超聲波模塊測(cè)得的是被測(cè)物體與探頭之間的垂直距離,測(cè)量時(shí)要保持探頭正對(duì)被測(cè)物體。
3、超聲波測(cè)量會(huì)受環(huán)境風(fēng)速、溫度等的影響。
4、模塊應(yīng)先插好在電路板上再通電,避免產(chǎn)生高電平的誤動(dòng)作,如果產(chǎn)生了,重新通電方可解決。
可能出現(xiàn)的問(wèn)題
1、由于超聲波會(huì)受到被測(cè)物體不平整、反射角度、環(huán)境風(fēng)速溫度以及多次反射的影響,可能會(huì)帶來(lái)測(cè)量數(shù)據(jù)誤差增大。
2、由于超聲波有測(cè)量盲區(qū)的固有特性,因此,如果近距離測(cè)量時(shí),當(dāng)測(cè)量位置發(fā)生變化而接收到的數(shù)據(jù)不變時(shí),說(shuō)明進(jìn)入了測(cè)量盲區(qū)。
3、模塊在測(cè)量遠(yuǎn)處物體時(shí),如果沒(méi)有測(cè)量數(shù)據(jù)返回,可能是超出測(cè)量范圍,或是測(cè)量角度不對(duì)??梢赃m當(dāng)調(diào)整測(cè)量角度。
***********************************************************************************/
/*模塊高精度,盲區(qū)2cm,測(cè)量范圍在2cm~500cm,測(cè)量精度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-不帶點(diǎn)
//unsigned char code WE1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xf0,0xef,0x80}; //0-9 帶點(diǎn)
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)//延時(shí)大概x毫秒
{
int i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void start() //給至少10us的高電平,啟動(dòng)模塊
{
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()//數(shù)據(jù)分割
{
temp[0]=s%1000/100;//百位
temp[1]=s%1000%100/10; //十位
temp[2]=s%100%100%10; //個(gè)位
}
void display() //顯示函數(shù)
{
uchar i;
if(s>=500||s<=2||flag==1) //進(jìn)入盲區(qū),溢出
{
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; //定時(shí)器工作方式0
TH0=0;
TL0=0;
EA=1; //開(kāi)總中斷
ET0=1;//開(kāi)定時(shí)器中斷
while(1)
{
start();//啟動(dòng)模塊
while(!RX); //當(dāng)RX為零時(shí)等待
TR0=1; //啟動(dòng)計(jì)數(shù)
while(RX); //當(dāng)RX為1時(shí)計(jì)數(shù)并等待
TR0=0; //關(guān)閉計(jì)數(shù)器
count(); //計(jì)數(shù)
dispros(); //處理,分割數(shù)據(jù)
display(); //顯示
delay(1);
}
}
void t0() interrupt 0
{
flag=1; //溢出標(biāo)志
}
評(píng)論