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