单片机的超声波测距系统的设计.docx
《单片机的超声波测距系统的设计.docx》由会员分享,可在线阅读,更多相关《单片机的超声波测距系统的设计.docx(23页珍藏版)》请在冰豆网上搜索。
单片机的超声波测距系统的设计
基于单片机的超声波测距系统的设计
摘要:
这是一种可应用于倒车雷达的超声波测距系统。
本系统采用单片机为核心,
结合发射和接受模块构成整个的测距系统。
倒车雷达是用来探测车身和周围的障碍物并显示其距离,以帮助驾驶员安全倒车或泊车的辅助电子设备,在纵多的汽车中逐渐普及应用,而且较多的应用了本系统设计采用的无源探头。
采用无源探头能够降低整个系统的设计成本,为能够更广泛的应用超声波测距系统打了坚实的基础。
因此,本系统的设计具有广泛的运用价值和意义。
关键字:
超声波测距;倒车雷达;运用价值
引言·····················································4
一、超声波测距系统主要功能的概述························4
二、超声波测距系统的主要技术指标····················4
三、超声波测距系统的原理·····························4
四、超声波测距系统的硬件组成·························5
五、超声波测距系统的软件设计·························9
六、超声波测距系统的测试数据和测试结果分析········10
七、总结···············································11
谢辞····················································11
参考文献···············································12
附录一——超声波测距系统原理图··························13
附录二——超声波测距系统的PCB图···················14
附录三——超声波测距系统的源程序·························15
引言:
本系统以STC89C52单片机控制为核心、发出40K发波信号,经发射电路升压后驱动超声波换能器,然后再由超声波接收头接受信号,送到单片机处理后,由液晶显示模块显示测量数据。
此外,本系统还包括了测温系统,测温工作由DS18B20完成,由本系统构成的超声波测距系统具有测量准确,显示便捷,操作灵活,反应迅速,系统工作稳定,耗电低,报警提示等特点。
一、超声波的主要功能概述:
●实时显示当前测量距离;
●实时显示当前测量温度;
●具有近距离和远距离两种测量模式;
●能够实时报警功能;
●具有开机系统自检功能;
二、超声波测距仪的主要技术指标
测量距离:
0.20m-10.00m
测温范围:
0℃-125℃
测量距离精度:
1cm
实时功率:
0.05W
系统发射功率:
1mW(max)
工作电流:
80mA(min)、90mA(max)
输入电源电压:
DC5V
三、超声波测距系统的原理
超声波测距的方法有很多种,如相位检测法,声波幅值检测法和往返时间检测法等。
相位检测法虽然精度高,但检测范围有限:
声波幅值检测法容易受反射波的映像。
本系统采用超声波往返时间检测法,其原理是:
检测从超声波发生器发出的超声波,经气体介质的传播到接收器的时间即往返时间。
往返时间与气体介质中的声速相乘再除以2就是检测的距离。
即有:
L=V*T/2
想要通过时间测量超声波传播的时间的准确性确定距离,声速V就必须要准确测定。
实际上声速虽介质的温度,压力等变化而变化。
一般条件下,由于大气压力变化很小,因此传播速度就主要受温度的影响。
在我们的设计测距系统中采用测量温度的方法来补偿声速,即用测温元件测量实际环境的温度来修正声速。
空气中的声速与温度的关系近似用下式表示:
V=331.4+0.607Tm/sT-℃
此外,准确的测量目标还要能够精确的计算出超声波传播的时间,显然能够确定的时间的单位越小越好,本系统采用的单片机的定时器0来计算时间,单片机采用12M的晶振,那么本系统可精确到1US的最小时间单位,计算所测量的距离可精确到0.0001M,显然这已经能够完全地满足我们的设计要求。
超声波测距系统的总电路的组成部分有:
单片机控制电路,超声波发射电路,超声波接受电路,测温电路,液晶显示电路以及报警电路等共同组成。
单片机控制电路负责发生40K的方波信号,经一反向器器后分别送到MAX232的两TTL电平输入端,然后产生+/-9V的方波信号驱动超声波换能器。
再由超声波接受回来,此时,就可利用单片机定时出发射和接收的时间差。
那么单片机就可计算出实际的距离,并将其显示出来。
具体的硬件原理框图如下:
四、超声波测距系统的硬件组成
4.1单片机控制系统
单片机控制系统以单片机STC89C52为核心,结合其本身的一些外围器件构成。
STC89C52单片机是一款应用很普及的89系列的单片机,该单片机具有四个8位的I/O口,内部集成了8K的程序存储器,两个外部中断,两个定时器,支持串口的程序下载,具有应用简单,操作简便,价格便宜等许多优点。
因此我们选用这一型号的单片机作为控制器。
单片机的晶振频率为12M,这样有利于我们更准确地计算超声波的往返时间,是后面距离精确计算的基础。
图一:
超声波控制电路
4.2超声波发射电路
超声波发射电路采用基于MAX232的方波发射电路,电路的前级用74LS04非门输出正反相的40KHz方波信号驱动MAX232后实现从TTL电平到RS232电平的DC-DC转换,输出+/-9V的电压方波,驱动超声波换能器,电路图如下图2所示。
由于发射到换能器的电压高,波形完整,因此可以达到很高的发射功率与效率,可以测量到比较远的距离,同时用这个电路发射方波,电路工作稳定,电路功耗很小,也适合单电源供电。
所以我们采用这个方案作为发射电路。
图2:
基于MAX232的超声波发射电路
4.3超声波接受电路
超声波接收电路采用集成接收芯片对超声波回波信号进行放大与整形,在这里我们采用SONY公司生产的红外接收专用芯片CX20106A(电路如图3所示),由于它的接收频率在40KHz左右,而且它的外部电路简单易于实现,同时减少了生产调试的麻烦,因此我们采用这个接收方案。
CX20106A内部集成了前置放大与限幅放大,总增益可达80dB,带通滤波电路,峰值检波,噪声抑制电路,自动增益控制电路和波形整形电路。
可以通过调整外部的电容C2调整它的接收灵敏度,调整外部电阻R6可以的调整它的接收中心频率与增益,它工作稳定,灵敏度高,功耗小,接收回波能力强,所以我们采用这个方案作为接收电路。
图3:
基于CX20106A的超声波接受电路
4.4LCD液晶显示电路
LCD液晶显示电路采用LCD1602液晶显示模块,它可以显示2行*16个字符,完全可以满足我们的设计要求。
它独有的蓝色背光电路可以在环境光线较弱的条件下应用,显示清晰,颜色靓丽,价格便宜的特点,是很好的显示设备。
同时,还能够根据情况来调节显示的亮度。
由于本系统可以不用显示汉字,介于设计成本上的需要,我们采用了这个显示方案。
图4:
1602液晶显示模块
4.5温度检测模块
检测模块是以数字温度传感器DS18B20为核心,它是DALLAS公司生产的
1-Wire,即单总线器件,具有线路简单,体积小的特点。
因此用它来组成一个测温系统,具有线路简单,在一根通信线,可以挂很多这样的数字温度计。
DS18B20产品的特点
(1)、只要求一个I/O口即可实现通信。
(2)、在DS18B20中的每个器件上都有独一无二的序列号。
(3)、实际应用中不需要外部任何元器件即可实现测温。
(4)、测量温度范围在-55到+125摄氏度之间。
(5)、数字温度计的分辨率用户可以从9位到12位选择。
(6)、内部有温度上、下限告警设置。
DS18B20详细引脚功能描述1、GND地信号;2、DQ数据输入出引脚。
开漏单总线接口引脚。
当被用在寄生电源下,也可以向器件提供电源;3、VDD可选择的VDD引脚。
当工作于寄生电源时,此引脚必须接地。
DS18B20的使用方法。
由于DS18B20采用的是1-Wire总线协议方式,即在一根数据线实现数据的双向传输,而对AT89S52单片机来说,我们必须采用软件的方法来模拟单总线的协议时序来完成对DS18B20芯片的访问。
由于DS18B20是在一根I/O线上读写数据,因此,对读写的数据位有着严格的时序要求。
DS18B20有严格的通信协议来保证各位数据传输的正确性和完整性。
该协议定义了几种信号的时序:
初始化时序、读时序、写时序。
所有时序都是将主机作为主设备,单总线器件作为从设备。
而每一次命令和数据的传输都是从主机主动启动写时序开始,如果要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数据接收。
数据和命令的传输都是低位在先。
本系统采用外部电源供电方式,即:
DS18B20的1脚和3脚分别接地和VCC电源.2脚接一个5K的上拉电阻到VCC.这样接法的好处是传感器的检测范围更大.
在温度检测时,无需强上拉。
图5:
基于DS18B20的温度检测电路
五、超声波测距系统的软件设计
本系统的软件设计采用了目前比较流行的编程语言-C语言,由于C语言是面对使用者的高级语言,它通俗易懂,书写方便,给我们的编程设计带有很大的方便,我们的编程速度与效率与得到了很大的提高。
尤其是在数据运算处理方面,C语言显示出了巨大的优越性。
程序首先要初始化要用到的寄存器,内存单元,设置中断触发方式,并初始
DS18B20和1602液晶模块,然后控制P3.1口输出12US的高电平,再输出13US的低电平,循环15次便可发射15个频率为40K的方波信号,此后单片机马上启动定时器计时,经过一段时间的延时后,CPU开放中断。
当中断产生后,马上关闭定时器,并由单片机处理数据,并将计算结果显示出来。
以下是程序设计的流程图:
程序设计见附录三
六、超声波测距系统的测试数据和测试结果分析
对多种测试物体进行测试:
测试物体一:
纸箱48cm*46cm;
测试物体二:
木板43cm*35cm
测试物体三:
铜板36cm*34cm
测试物体四:
硬塑料板40cm*33cm
1、距离测试:
测试一:
测试地点:
男生宿舍24#205测试时间:
3月25日10:
00-11:
00
实际测试距离范围:
0.12m—5.15m测试者:
刘振河、王坤
单位:
cm
测试物体
纸箱
木板
铜板
硬塑料
测试距离
1
2
3
1
2
3
1
2
3
1
2
3
20
20
20
21
21
21
21
21
20
21
21
21
21
100
101
101
101
99
99
99
100
99
99
100
100
100
250
244
244
243
244
245
245
244
245
244
244
244
244
500
498
498
498
499
499
499
501
501
502
测试二:
测试地点:
信息与通信学院创新基地测试时间:
3月25日12:
00-13:
00
实际测试距离范围:
0.12m—5.30m测试者:
刘振河、王坤
单位:
cm
测试物体
纸箱
木板
铜板
硬塑料
测试距离
1
2
3
1
2
3
1
2
3
1
2
3
20
20
19
19
20
21
20
20
19
19
19
20
20
100
100
101
101
100
99
99
99
100
99
102
102
101
250
247
247
246
249
248
248
246
246
246
249
250
249
500
499
499
501
500
501
501
500
501
501
注:
1、铜板上分布着许多不规则的小孔;
2、在测试小于40cm距离时,发射头要并接一104瓷片电容;
3、由于接收头在接收到超声波后转化成的电信号极小,幅值在UV级别,因此无法在实验室的示波器上显示。
2、工作电流:
100mA
3、LCD显示清晰,亮度高,内容丰富
4、各LED指示灯均能正常工作,指示正常
5、测量温度精度:
0.0625℃
以上各项技术指标均满足了设计的要求,电路各种参数设计合理,工作稳定,性能良好。
七、总结
经过十几天的不断设计制作,我们终于完成了我们的设计。
总体上讲,这一系统测量结果在一定的误差范围内较为准确,测试数据较稳定,我们觉得这是本系统中最为成功的地方之一,为此我们也十分的满意!
当然,我们这次的设计也存在很多的不足之处,比如我们的这个设计在运动中测试的结果不够准确,测量数据变化很大,而且反应时间较长。
我们认为这是本系统中最大的不足之处,同时也是我们在设计制作之初欠缺考虑的地方。
为此,我们查阅相关的资料,了解到相关的一些信息。
据了解,目前高性能的倒车雷达大都采用有源探头,接收的回波信号在探头内部放大整形后输出,发射信号也在探头内部耦合驱动传感器,其抗干扰性更强,探头的互换性、一致性也更高。
同时采用多个探头以保证测试结果的质量。
总之,虽然我们这次超声波测距系统的制作存在一些不足,但总体上还是取得令人满意的结果!
为此,我们会再接再励,在电子制作过程中不断吸收各方面的知识、提高我们的实践能力,让我们再一次感觉到了辛苦忙碌之后收获的喜悦,同时也引起了我们对电子制作的更加广泛的兴趣和热情!
谢辞:
经过本小组所有成员的共同努力,我们终于完成这次设计制作,在设计中我们遇到各种各样的困难,但我们全小组齐心协力,共同攻关,献言献策,凭着严谨认真的科研态度,创新求实的科学精神,克服了种种困难。
同时,多得各位老师和同学的耐心分析和指导,尤其是何宁老师给予了我们很大的帮助!
为此,我们要向我们的指导老师何宁老师,廖欣老师表示由衷的感谢,在他们的耐心帮助下,我们终于顺利地完成我们的这次设计制作!
参考文献:
[1]徐爱钧彭秀华.KeilCx51V7.0单片机高级语言编程与uVision2应用实践电子工业出版社2004
[2]张毅刚彭喜源潭晓昀等.MCS-51单片机应用设计.哈尔滨工业大学出版社2000
[3]杨振江杜铁军李群.流行单片机实用子程序及应用实例.西安:
西安电子科技大学出版社,2002
[4]李群芳张士军黄建.单片微型计算机与接口技术(第三版)电子工业出版社2008
[5]李光飞.单片机C程序设计实例. 北京航空航天大学出版社2002
[6]广州周立功单片机发展有限公司.DS18B20芯片资料
附录
附录一:
超声波测距系统原理
附录二:
超声波测距PCB
附录三:
超声波测距系统源程序
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitd8=P2^7;
sbitd1=P2^0;
sbitd2=P2^2;
sbitd3=P2^4;
sbitfang=P3^1;
sbitds=P1^4;//defineds18b20
sbitlcden=P1^0;
sbitlcdrs=P1^2;
uchartable[]="TMP:
";
uchartable1[]="distance:
";
uchartable2[]="0123456789.`CM";
doubleTT;
floatS6;
uinttemp,temp1,time,V,S;
uintS5[3],temp2[3];
ucharA1,A2,A3,S1,S2,S3,S4,timeh,timel,flag;
/************延时**********/
voiddelay(uintz)
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/*********初始化DS18B20********/
voiddsreset()
{
uinti;
ds=0;
i=103;
while(i>0)i--;
ds=1;
i=4;
while(i>0)i--;
}
/**********readabit******/
bittmpreadbit()
{
uinti;
bitdat;
ds=0;
i++;
ds=1;
i++;i++;
dat=ds;
i=8;
while(i>0)i--;
return(dat);
}
/*********readabyte********/
uchartmpread()
{
uchari,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tmpreadbit();
dat=(j<<7)|(dat>>1);
}
return(dat);
}
/**********writeabyte*********/
voidtmpwritebyte(uchardat)
{
uinti;
ucharj;
bittestb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb)
{
ds=0;
i++;i++;
ds=1;
i=8;
while(i>0)i--;
}
else
{
ds=0;
i=8;
while(i>0)i--;
ds=1;
i++;i++;
}
}
}
/**********temchange温度转换命令******/
voidtmpchange()
{
dsreset();
delay
(1);
tmpwritebyte(0xcc);
tmpwritebyte(0x44);
}
/*******gettmp******/
uintgettmp()
{
floattt;
uchara,b;
dsreset();
delay
(1);
tmpwritebyte(0xcc);
tmpwritebyte(0xbe);
a=tmpread();
b=tmpread();
temp=b;
temp<<=8;
temp=temp|a;
tt=temp*0.0625;
temp=tt*10+0.5;
returntemp;
}
/**********fenli******/
voiddisplay1(uinttemp)
{
A1=temp/100;
A2=(temp%100)/10;
A3=temp%10;
}
voiddisplay2(uintS)
{
S1=S/1000;
S2=S%1000/100;
S3=S%100/10;
S4=S%10;
}
/**************writeadata***********/
voidwrite_data(uchardate)
{
lcdrs=1;//rs=1
P0=date;
delay(5);
lcden=1;//EN一个高脉冲写入
delay(5);
lcden=0;
}
/**************writeacommand*******/
voidwrite_com(ucharcom)//液晶写指令
{
lcdrs=0;//RS=0
P0=com;//送指令
delay(5);
lcden=1;//EN一个高脉冲写入
delay(5);
lcden=0;
}
/*********initlcd***********/
voidinit()//初始化液晶
{
uchari;
lcden=0;i++;i++;
write_com(0x38);
i++;i--;
write_com(0x0e);//光标不闪烁指令
i++;i--;
write_com(0x06);
i++;i--;
write_com(0x01);//清除所有指令
i++;i--;
}
voidxianshi()
{
uchara;
init();
write_com(0x80+3);
delay(5);
for(a=0;a<4;a++)
{
write_data(table[a]);
delay(5);
}
write_com(0x80+11);
delay(5);
for(a=11;a<13;a++)
{
write_data(table2[a]);
delay(5);
}
write_com(0x80+9);
delay(5);
write_data(table2[10]);
delay(5);
write_com(0xc0);
delay(5);
for(a=0;a<9;a++)
{
write_data(table1[a]);
delay(5);
}
write_com(0xc0+11);
delay(5);
write_data(table2[10]);
delay(5);
write_com(0xc0+14);
delay(5);
write_data('M');
delay(5);
}
voidxianshi1()
{
write_com(0x80+7);
delay(5);
write_data(table2[A1]);
delay(5);
write_data(table2[A2]);
delay(5);
write_com(0x80+10);
delay(5);
write_data(table2[A3]);
delay(5);
if(S1>0)
{
write_com(0xc0+9);
delay(5);
write_data(table2[S1]);
delay(5);
write_data(table2[S2]);
delay(5);
write_com(0xc0+12);
delay(5);
write_dat