一、模塊介紹
1.1 模塊圖示
模塊共有四個引腳,分別是Vcc(供5V電源)、Trig(控制端,下文簡稱Tr)、Echo(接收端,下文簡稱Ec)、Gnd(地線)
2.2 產品參數
二、 工作原理(時序)
在初始狀態時,Tr引腳電平由單片機拉高,Ec引腳電平由傳感器拉低。工作時,首先由單片機將Tr引腳拉低後再給一個高電平脈衝(持續時間至少爲10us),傳感器收到該脈衝信號後開始向外發射8個40KHz的方波即用來測距的超聲波。該測距超聲波以聲速(340m/s)向前傳播,在遇到障礙物時,該超聲波被反彈向回傳播,因此最終能夠被傳感器接收到,傳感器會記錄從發射超聲波到接收到超聲波的所經歷的時間t。傳感器在收到返回的信號後,由Ec引腳輸出一個與t相同時間的高電平脈衝。此時,我們只需要通過單片機內部定時/計數器記錄Ec引腳高電平脈衝時間即可得超聲波的傳播時間t。因此可算出傳感器到障礙物間的距離=340*(t/2) (因爲t是超聲波一來一回經歷的時間,所以單程時間要除以2)。
三、例程(例程均爲自己編寫且仿真通過)
單片機爲AT89C52,工作頻率爲12Mhz,最終結果通過八段數碼管顯示。
#include<reg52.h>
#include<intrins.h>
typedef unsigned char uchar;
typedef unsigned int uint;
sbit Tr=P1^0;//觸發信號
sbit Ec=P1^1;//迴響信號
void Delay10us(void);//10us延時函數
void Delay1ms(void);//1ms延時函數
uint Read_value(void);//讀值函數
void InitTimer0(void);//定時器0初始化
void show(uint Out);//顯示函數
void main()
{
uint distance;
Tr=0;//出發引腳首先拉低
InitTimer0();//初始化定時器0
distance=Read_value();//讀值
show(distance);//顯示距離
}
/********************讀值函數***********************/
uint Read_value()
{
float temp;
uint result;
Tr=1;//觸發引腳發出11us的觸發信號(至少10us)
Delay10us();
_nop_();
Tr=0;
while(!Ec);//度過迴響信號的低電平
TR0=1;//開啓定時器0
while(Ec);//度過迴響信號高電平
TR0=0;//關閉定時器0
temp=TH0*256+TL0;//最終us時間
temp/=1000.0;//最終ms時間
temp*=17.0;//距離(cm) (17=光速34cm/ms 除2)
result=temp;//四捨五入
if(temp-result>=0.5)
{
result+=1;
}
return result;
}
/***********************10us延時函數*****************************/
void Delay10us()
{
uchar i;
i=2;
while(--i);
}
/***********************1ms延時函數*****************************/
void Delay1ms() //誤差 0us
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=142;b>0;b--)
for(a=2;a>0;a--);
}
/************************定時器0初始化*****************************/
void InitTimer0(void)
{
TMOD = 0x01;
TH0 = 0x00;
TL0 = 0x00;
TR0 = 0;//先關閉定時器0
}
/**********************顯示函數*************************************/
void Show(uint Out)
{
char duan[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//段碼
while(1)
{
P2=0x01;//第四位(個位)
Delay10us();
P3=duan[Out%10];
Delay1ms();
P3=0xff;
P2=0x02;//第三位(十位)
Delay10us();
P3=duan[(Out/10)%10];
Delay1ms();
P3=0xff;
P2=0x04;//第二位(百位)
Delay10us();
P3=duan[(Out/100)%10];
Delay1ms();
P3=0xff;
P2=0x08;//第一位(千位)
Delay10us();
P3=duan[(Out/1000)%10];
Delay1ms();
P3=0xff;
}
}
注意:因爲12MHz的單片機的機器週期爲1us,即計數值就等於以us爲單位的時間值,因此計算公式 可以寫爲 時間=TH0*256+TL0;但如果使用的單片機工作頻率爲11.0592MHz,其機器週期爲1.085us,因此時間計算公式需寫爲 時間=(TH0*256+TL0)*1.085
四、仿真電路
左肩理想右肩擔當,君子不怨永遠不會停下腳步!