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