「51單片機(jī)」收發(fā)一體超聲波測(cè)距模塊分析+代碼
我用的超聲波型號(hào)是US-020,四個(gè)接口的超聲波用法基本相同。
一、概述
US-020超聲波模塊測(cè)距范圍:2cm~7m
供電電壓5V,靜態(tài)功耗低于3mA
二、實(shí)物圖
尺寸:45mm*20mm*1.6mm
三、接口
1.VCC電源,直流5V
2.Trig向此管腳輸入10us以上高電平,可觸發(fā)模塊測(cè)距
3.Echo測(cè)距結(jié)束時(shí)會(huì)輸出高電平,電平時(shí)長(zhǎng)為超聲波信號(hào)往返時(shí)間之和
4.GND接地
四、測(cè)距工作原理
只要在Trig管腳輸入10us以上高電平,系統(tǒng)會(huì)自動(dòng)發(fā)出8個(gè)40KHz的超聲波脈沖,然后檢測(cè)回波信號(hào)。檢測(cè)到后通過(guò)Echo管腳輸出。
計(jì)算方式:(Echo高電平時(shí)間*340m/s)/2
[注]:利用計(jì)數(shù)器檢測(cè)Echo高電平時(shí)間。計(jì)時(shí)器計(jì)數(shù)頻率為晶振的1/12。設(shè)晶振頻率XMHz,計(jì)數(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.初始化程序,需要設(shè)置計(jì)時(shí)器,計(jì)算Echo高電平時(shí)間
TMOD = 0x01; //設(shè)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的高電平并計(jì)算時(shí)間
while(!Ec); //等待高電平
TR0 = 1; //打開計(jì)時(shí)器
while(Ec); //等待低電平
TR0 = 0; //關(guān)閉計(jì)時(shí)器
time = TH0*256 + TL0; //計(jì)算時(shí)間
L = 0.18446*time;
TH0 = 0; //重置計(jì)時(shí)器
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; //距離長(zhǎng)度(mm)
unsigned char code LED[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};
//函數(shù)申明
void ultInit(); //超聲波初始化
void ultStart(); //超聲波觸發(fā)
void count(); //計(jì)算距離
void show(); //顯示距離于屏幕
void delay(); //延時(shí)函數(shù)
//---------------
//超聲波初始化
//---------------
void ultInit()
{
TMOD = 0x01; //設(shè)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;
}
//---------------
//計(jì)算距離
//---------------
void count()
{
uint time = 0;
while(!Ec); //等待高電平
TR0 = 1; //打開計(jì)時(shí)器
while(Ec); //等待低電平
TR0 = 0; //關(guān)閉計(jì)時(shí)器
time = TH0*256 + TL0; //計(jì)算時(shí)間
L = 0.18446*time;
TH0 = 0; //重置計(jì)時(shí)器
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í)函數(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();
}
}