我用的超聲波型號是US-020,四個接口的超聲波用法基本相同。
一、概述
US-020超聲波模塊測距范圍:2cm~7m
供電電壓5V,靜態(tài)功耗低于3mA
二、實物圖
尺寸:45mm*20mm*1.6mm
三、接口
1.VCC電源,直流5V
2.Trig向此管腳輸入10us以上高電平,可觸發(fā)模塊測距
3.Echo測距結束時會輸出高電平,電平時長為超聲波信號往返時間之和
4.GND接地
四、測距工作原理
只要在Trig管腳輸入10us以上高電平,系統(tǒng)會自動發(fā)出8個40KHz的超聲波脈沖,然后檢測回波信號。檢測到后通過Echo管腳輸出。
計算方式:(Echo高電平時間*340m/s)/2
[注]:利用計數(shù)器檢測Echo高電平時間。計時器計數(shù)頻率為晶振的1/12。設晶振頻率XMHz,計數(shù)值t(方式1下t=TH0*256+TL0)。
距離L=(t*12/(X*10^6))*340000/2(mm)
=0.17*t(X=12)
=(2.04/11.0592)*t(X=11.0592)
五、代碼分析
1.初始化程序,需要設置計時器,計算Echo高電平時間
TMOD = 0x01; //設T0為方式1;
TH0 = 0;
TL0 = 0;
TR0 = 1;
ET0 = 1; //允許T0中斷
EA = 1; //開啟總中斷
Tr = 0;
2.發(fā)送10us以上高電平給Trig
Tr = 1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
Tr = 0;
3.等待Echo的高電平并計算時間
while(!Ec); //等待高電平
TR0 = 1; //打開計時器
while(Ec); //等待低電平
TR0 = 0; //關閉計時器
time = TH0*256 + TL0; //計算時間
L = 0.18446*time;
TH0 = 0; //重置計時器
TL0 = 0;
六、總代碼(包括數(shù)碼管顯示部分)
#include
#include
#define uchar unsigned char
#define uint unsigned int
//管腳定義
sbit Tr = P2^0; //超聲波觸發(fā)
sbit Ec = P2^1; //超聲波輸出
sbit key = P2^4; //按鍵
sbit encC = P2^5; //38譯碼器
sbit encB = P2^6;
sbit encA = P2^7;
//P0口接數(shù)碼管
//定義變量
float L = 0; //距離長度(mm)
unsigned char code LED[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};
//函數(shù)申明
void ultInit(); //超聲波初始化
void ultStart(); //超聲波觸發(fā)
void count(); //計算距離
void show(); //顯示距離于屏幕
void delay(); //延時函數(shù)
//---------------
//超聲波初始化
//---------------
void ultInit()
{
TMOD = 0x01; //設T0為方式1;
TH0 = 0;
TL0 = 0;
TR0 = 1;
ET0 = 1; //允許T0中斷
EA = 1; //開啟總中斷
Tr = 0;
}
//---------------
//超聲波觸發(fā)
//---------------
void ultStart()
{
Tr = 1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
Tr = 0;
}
//---------------
//計算距離
//---------------
void count()
{
uint time = 0;
while(!Ec); //等待高電平
TR0 = 1; //打開計時器
while(Ec); //等待低電平
TR0 = 0; //關閉計時器
time = TH0*256 + TL0; //計算時間
L = 0.18446*time;
TH0 = 0; //重置計時器
TL0 = 0;
}
//---------------
//顯示距離于屏幕
//---------------
void show()
{
P0 = LED[(int)L%10];
encC = 0; encB = 1; encA = 1;
P0 = LED[(int)L/10%10];
encC = 0; encB = 1; encA = 0;
P0 = LED[(int)L/100%10];
encC = 0; encB = 0; encA = 1;
P0 = LED[(int)L/1000%10];
encC = 0; encB = 0; encA = 0;
}
//---------------
//延時函數(shù)
//---------------
void delay()
{
_nop_();_nop_();_nop_();_nop_();_nop_();
}
//---------------
//主函數(shù)
//---------------
void main()
{
ultInit();
key = 1;
while(1)
{
if(0==key)
{
delay();
if(0==key)
{
ultStart();
count();
key = 1;
}
}
show();
}
}