張孟陽 翟士余
摘 要:為了讓盲人對障礙物進行安全避讓,導盲儀的應用與設計十分重要。導盲儀具備多樣性,并且其工作原理也各不相同。本文對基于STC89C52單片機的超聲波測距導盲系統進行設計,并對其工作原理、機構設計進行闡述。
關鍵詞:超聲波測距;導盲儀;STC89C52單片機;US-100模塊
超聲波具備良好的傳播特性,在社會的多個領域得到了廣泛應用。應用超聲波進行測距,不論是在硬件設計方面,還是在軟件編程方面都具備較強的便利性。同時基于超聲波測距的導盲系統較為輕便、快捷、攜帶方便,并且測量更加精準。
1超聲波測距原理
超聲波測距的方法主要由聲波幅值檢測法、渡越時間法等,本文利用渡越時間法實現測距。首先由超聲波發射器發出聲波,并由單片機對計時器進行控制開始計時。超聲波在碰到障礙物會產生回波,并立即返回,當接收器接收到回波時,計時器會停止計時。超聲波的空氣傳播速度v,計時器所記錄時間Δt,對傳播距離s進行計算:
s=v×Δt/2 (1)
超聲波在空氣中的傳播不僅與溫度有關,還與濕度有關。在干燥空氣中超聲波速度v0=331.5m/s。在室溫為t℃時,空氣中的聲速:
v=v01+tT0 (2)
因為空氣具備相應濕度,所以在溫度為t℃,相對濕度為r時,聲速:
v=331.51+tT0(1+0.31rPsP) (3)
2硬件及電路設計
測距系統包括單片機、檢測溫度、發射、接受處理、報警、數碼顯示模塊。以單片機STC89C52為主控單元,應用自帶溫度補償功能的US-100為超聲波傳感器。對系統電路進行設計:時鐘電路。單片機STC89C52中包含具備高增益的一個反相放大器,以組建振蕩器,并產生時鐘信號;數碼管顯示電路。應用單片機STC89C52通過P0口利用鎖存器SN74HC573DW對兩個共陰的4為一體8位數碼管進行驅動;蜂鳴報警電路。通過單片機STC89C52的P2.3管腳對蜂鳴器進行控制,當所測距離小于0.5米,蜂鳴器就會出現報警;US-100模塊。在非接觸情況下的測量距離為2-4.5米,帶有溫度補償功能,可以對測量結果進行有效校正。
3軟件設計
3.1整體設計與程序
利用US-100串口測距原理對程序進行編寫,先要對串口實施初始化,然后對超聲波脈沖進行有效發射,并對檢測狀態進行等待,在對回波進行接收后,對距離進行有效計算,再由單片機進行處理,并在數碼管上進行顯示。在距離低于0.5米時,蜂鳴器就會發出報警。所以主程序為:
void main(void)
{
unsigned long distance=0;
UART_init(); //串口和波特率初始化
while(1)
{
distance=rebuf[0]*256+rebuf[1]; //計算距離
DisplayLED(distance); //數碼管顯示距離
if(distance<500) //距離<0.5米時報警
{
int a;
for(a=0;a<500;a++)
{
buzzer=~buzzer;
}
}
}
}
程序中rebuf[0]、rebuf[1]為接收緩沖區,定義于idata區。rebuf[0]對距離值的高8位進行接收,rebuf[1]對距離值的低8位進行接收。主程序中包括蜂鳴器報警程序。
3.2初始化程序
初始化程序主要是對定時器工作以及串口通信的相應模式進行設置。初始化程序:
void UART_init()
{
…………….
TMOD=0x21; //設計定時器工作方式
…………….
SM0=0; //設置串口通信模式
SM1=1;
……………
}
3.3超聲波發送程序
void MeterTempByUART() //發送超聲波脈沖
{
UASTSnd(0X55);
}
3.4寫字符程序
void UARTSnd(unsigned char dat)
{
TI=0; //清零發送標志,如果TI為0等待
SBUF=dat; //寫字節帶特殊控制寄存器SBUF
while(!TI);
TX=~TX; //啟動超聲波發射器
}
3.5數碼管掃描程序
void UART_ISR(void)interrupt4
{
uchar temp,K;
ES=0; //關中斷
if(RI)
{
RI=0; //清接收標志
temp=SBUF;
rebuf[k]=temp;
k++;
if(k==2) //k=數據長度
k=0;
RX=~RX;
}
ES=1; //開中
}
3.6數碼管顯示程序
void DisplayLED(unsigned long number)
{
if(number>4500)
{
dispbuf[0]=10;
dispbuf[1]=10;
dispbuf[2]=10;
dispbuf[3]=10;
}
else if(number<4500)
{
dispbuf[0]=number/1000;
dispbuf[1]=number%1000/100;
dispbuf[2]=number%100/10;
dispbuf[3]=number%10;
}
P0=Tab[dispbuf[dispcount]];
…………………………………
dispcount++;
if(dispcount==4) //4位數碼管顯示位
{
dispcount=0;
}
count++;
if(count==100)
{
count=0;
MeterTempByUART();
}
4結束語
通過仿真實驗顯示,實際值和測量值之間有著0-10mm的誤差,并且具備良好的穩定性以及重復性,滿足實際的使用需求。同時超聲波測距導盲儀的應用更加便捷、精準,便于盲人進行攜帶。
參考文獻:
[1]基于單片機的超聲波導盲杖設計研究[J].張超.科技信息.2014(04).