张孟阳 翟士余
摘 要:为了让盲人对障碍物进行安全避让,导盲仪的应用与设计十分重要。导盲仪具备多样性,并且其工作原理也各不相同。本文对基于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).