新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 一款超聲波測距模塊運用程序

一款超聲波測距模塊運用程序

作者: 時間:2016-11-30 來源:網(wǎng)絡(luò) 收藏
本模塊性能穩(wěn)定,使用方便,測度距離精確。能和國外的SRF05,SRF02等超聲波測距模塊相媲美,且價格實惠,是你采購超聲波器件的理想選擇。模塊高精度,盲區(qū)(2cm)超近,穩(wěn)定的測距是此產(chǎn)品成功走向市場的有力根據(jù)!測量范圍在2cm~500cm,測量精度3mm,測量時與被測物體無直接接觸,能夠清晰穩(wěn)定地顯示測量結(jié)果。由于超聲波指向性強,能量消耗緩慢,在介質(zhì)中傳播的距離較遠,因而超聲波經(jīng)常用于距離的測量,如測距儀和物位測量儀等都可以通過超聲波來實現(xiàn)。
超聲波測距器,可以應(yīng)用于汽車倒車、建筑施工工地以及一些工業(yè)現(xiàn)場的位置監(jiān)控,也可用于液位、井深、管道長度的測量,用于機器人控制、小車躲避障礙等場合中。小車上安裝此模塊配合舵機使用能控制得更方便。利用超聲波檢測往往比較迅速、方便、計算簡單、易于做到實時控制,并且在測量精度方面能達到工業(yè)實用的要求。因此在移動機器人的研制上也得到了廣泛的應(yīng)用。
模塊性能
1:使用電壓:DC5V;
2:靜態(tài)電流:小于2mA;
3:輸出信號:電平信號,高電平5V,低電平為0V;
4:感應(yīng)角度:不大于15度;
5:探測距離:2cm-500cm
6: 高精度:可達0.3cm
超聲波測距模塊工作原理:
(1)采用單片機IO觸發(fā)測距,給至少10us的高電平信號;
(2)模塊自動發(fā)送8個40khz的方波,自動檢測是否有信號返回;
  (3)有信號返回,通過echo輸出一高電平,高電平持續(xù)的時間就是超聲波從發(fā)射到返回的時間。
用戶通過從trig腳輸入40kHz的方波信號,即用戶從單片機的IO口連續(xù)發(fā)出高低電平,產(chǎn)生方波,方波的個數(shù)一般為10個左右;然后就可以在接收端等待高電平輸出,一有輸出就可以開定時器計時,當(dāng)此口變?yōu)榈碗娖綍r就可以讀定時器的值,高電平的時間就是此次測距的時間,根據(jù)以下公式計算測量距離:
測試距離=(高電平時間*聲速(340m/s))/2;
注意事項
1、超聲波發(fā)射頭向外發(fā)射60度角的超聲束,因此,在探頭與被測物體之間不能有其他障礙物。
2、超聲波模塊測得的是被測物體與探頭之間的垂直距離,測量時要保持探頭正對被測物體。
3、超聲波測量會受環(huán)境風(fēng)速、溫度等的影響。
4、模塊應(yīng)先插好在電路板上再通電,避免產(chǎn)生高電平的誤動作,如果產(chǎn)生了,重新通電方可解決。
可能出現(xiàn)的問題
1、由于超聲波會受到被測物體不平整、反射角度、環(huán)境風(fēng)速溫度以及多次反射的影響,可能會帶來測量數(shù)據(jù)誤差增大。
2、由于超聲波有測量盲區(qū)的固有特性,因此,如果近距離測量時,當(dāng)測量位置發(fā)生變化而接收到的數(shù)據(jù)不變時,說明進入了測量盲區(qū)。
3、模塊在測量遠處物體時,如果沒有測量數(shù)據(jù)返回,可能是超出測量范圍,或是測量角度不對。可以適當(dāng)調(diào)整測量角度。
***********************************************************************************/
/*模塊高精度,盲區(qū)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()//數(shù)據(jù)分割
{
temp[0]=s%1000/100;//百位
temp[1]=s%1000%100/10; //十位
temp[2]=s%100%100%10; //個位
}
void display() //顯示函數(shù)
{
uchar i;
if(s>=500||s<=2||flag==1) //進入盲區(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; //定時器工作方式0
TH0=0;
TL0=0;
EA=1; //開總中斷
ET0=1;//開定時器中斷
while(1)
{
start();//啟動模塊
while(!RX); //當(dāng)RX為零時等待
TR0=1; //啟動計數(shù)
while(RX); //當(dāng)RX為1時計數(shù)并等待
TR0=0; //關(guān)閉計數(shù)器
count(); //計數(shù)
dispros(); //處理,分割數(shù)據(jù)
display(); //顯示
delay(1);
}
}
void t0() interrupt 0
{

flag=1; //溢出標(biāo)志
}


關(guān)鍵詞: 超聲波測距模塊運用程

評論


技術(shù)專區(qū)

關(guān)閉