基于超声波传感器的测距系统设计毕业设计论文.docx
《基于超声波传感器的测距系统设计毕业设计论文.docx》由会员分享,可在线阅读,更多相关《基于超声波传感器的测距系统设计毕业设计论文.docx(32页珍藏版)》请在冰豆网上搜索。
![基于超声波传感器的测距系统设计毕业设计论文.docx](https://file1.bdocx.com/fileroot1/2023-1/1/b1bbc105-731e-4ea0-8c3e-0ae997b1de88/b1bbc105-731e-4ea0-8c3e-0ae997b1de881.gif)
基于超声波传感器的测距系统设计毕业设计论文
JIANGXINORMALUNIVERSITY
传感器原理课程设计
题目:
基于超声波传感器的测距系统
院系名称:
物理与通信电子学院
学生姓名:
学生学号:
专业:
电子信息工程
任课老师:
完成时间:
2015年6月
摘要
本文主要介绍了基于超声波传感器的测距系统的工作原理、硬件电路的设计和软件设计。
该测距系统由单片机最小系统模块、温度采集模块、超声波测距模块,LCD显示模块组成。
能够完成距离和温度的测量、显示等功能。
关键词:
超声波测距,单片机最小系统,温度采集
1引言
近年来,随着电子测量技术的发展,运用超声波作出精确测量已成可能。
由于的经济发展,电子测量技术应用也越来越广泛,而超声波测量精确高,成本低,性能稳定则备受青睐。
由于超声测距是一种非接触检测技术,不受光线、被测对象颜色等的影响,较其它仪器更卫生,更耐潮湿、粉尘、高温、腐蚀气体等恶劣环境,具有少维护、不污染、高可靠、长寿命等特点。
因此可广泛应用于纸业、矿业、电厂、化工业、水处理厂、污水处理厂、农业用水、环保检测、食品(酒业、饮料业、添加剂、食用油、奶制品)、防汛、水文、明渠、空间定位、公路限高等行业中。
可在不同环境中进行距离准确度在线标定,可直接用于水、酒、糖、饮料等液位控制,可进行差值设定,直接显示各种液位罐的液位、料位高度。
利用超声波检测往往比较迅速、方便、计算简单、易于实现实时控制,由于超声波测距系统具有以上的这些优点,因此在汽车倒车雷达的研制方面也得到了广泛的应用。
2设计要求
设计并制作一个基于超声波传感器的测距系统,基本要求如下:
测量范围为0.2-1m;测量精度为±2mm;并能实时显示。
3方案论证
根据本题设计要求,确定了本系统的原理框图如图3-1所示。
图3-1原理框图
3.1方案论证与比较
根据题目的要求,我提出了以下的两种系统设计方案供选择:
方案1:
由单片机编程产生40kHz的方波,由IO口输出,再经过放大电路,驱动超声波发射探头发射超声波。
发射出去的超声波经障碍物反射回来后,由超声波接收头接收到信号,通过接收电路的检波放大、积分整形及一系列处理,送至单片机。
单片机利用声波的传播速度和发射脉冲到接收反射脉冲的时间间隔计算出障碍物的距离,并由单片机控制显示出来。
方案2:
由单片机控制集成超声波测距模块HC-SR04,通过用一IO口发一个10us以上的高电平给集成模块控制口,就可以在接收口等待高电平输出,一
有输出就可以开定时器计时,当此口变为低电平时就可以读定时器的值,并由单片机实时检测。
单片机利用声波的传播速度和发射脉冲到接收反射脉冲的时间间隔计算出障碍物的距离,并由单片机控制显示出来。
由于超声波也是一种声波,其声速c与温度有关,所以温度的影响不能忽略不计,本方案中对声速c还添加了温度补偿。
通过上述两种方案的比较,由于集成超声波测距模块HC-SR04提供2cm至400cm的非接触式距离感测功能,测距精度可达3mm,模块自身包括超声波发射器、接收器与控制电路,且编程和制作相比方案一容易许多。
因此本超声波测距系统的设计采用方案2。
3.2单片机最小系统模块的方案
方案1:
采用PIC单片机。
PIC单片机的各个型号的兼容性强,功能全,型号多,抗干扰能力强。
缺点:
PIC单片机价格贵,烧写器较贵,烧写程序比较麻烦。
方案2:
采用MCS-51单片机。
MCS-51系列单片机是8位增强型。
51单片机具有功能强,体积小,可靠性好和价格便宜的优点,并且编程较为容易,程序的烧写也较为简单。
综合上面两个方案以及本人日常学习到的单片机,选择方案二作为本设计的核心处理模块。
3.3温度采集模块的方案
采用温度传感器DS18B20。
DS18B20具有体积小、质量轻、精密度高、全数字化、性能稳定等优点。
它的测量范围在-50℃至+125℃,在-10℃至+85℃范围内精度为±0.5℃,当电源电压在5-10V之间,稳定度为1﹪时,其各方面特性都满足了本系统的设计要求。
此外DS18B20可直接将温度转化成串行数字信号供处理器处理,可以简化硬件电路和提高可靠性。
3.4超声波测距模块的方案
采用HC-SR04超声波模块。
本模块性能稳定,测度距离精确,模块高精度,盲区小的优点。
本模块使用方法简单,一个控制口发一个10US以上的高电平,就可以在接收口等待高电平输出.一有输出就可以开定时器计时,当此口变为低电平时就可以读定时器的值,此时就为此次测距的时间,这样就可算出距离。
3.5显示模块的方案
方案一:
选用数码管显示,用普通的数码管显示简单的数字、字母,数码管分时显示距离和温度。
方案二:
选用液晶显示,显示的内容更加的丰富。
根据所学知识与方案显示内容的设定,我选择了方案二。
4工作原理
测距原理如图4-1所示:
s
hd测量目标
图4-1
被测距离
。
式中:
s为超声波传播距离的一半,h为发射探头和接受探头之间的距离。
由于s远大于h,因此可近似认为d=s,则d=s=ct/2,t为发射超声波与接收超声波的时间间隔,c为超声波在空气中的传播速度。
在空气中,常温下超声波的传播速度是334m/s,但其传播速度c易受空气中温度的影响,声速与温度关系如表4-1所示,由此可修正超声波传播速度为
表4-1声速与温度关系表
温度(℃)
-30
-20
-10
0
10
20
30
40
声速(m/s)
313
319
325
332
338
344
350
356
可见,只要测得超声波发射和接收回波的时间差t以及环境温度T,就能得到较为精确的距离。
测温是通过DS18B20来实现,通过程序将温度读出并送到LCD显示,并将此温度作为测距的温度补偿。
5系统设计
本系统选用的模块包括:
单片机最小系统模块、温度采集模块、超声波测距模块、LCD1602显示模块。
5.1单片机最小系统模块的设计
此次的课程设计的核心部分是单片机的控制,本次选用的是ATMEL公司生产的芯片STC89C52,主要是它的价格便宜,而且在学习中接触较多比较熟悉,容易获得。
5.1.1复位电路的设计
复位使单片机处于起始状态,并从该起始状态开始运行。
STC89C52的RST引脚为复位端,该引脚连续保持2个机器周期(24个时钟振动周期)以上高电平,就可以使单片机复位。
单片机的外部复位有上电复位和按键电平复位。
由于单片机运行过程中,其本身的干扰或外界干扰会导致出错,此时我们可按复位键重新开始运行。
考虑到本系统的运行和调试,复位电路采用按键复位方式,如图5-1所示。
图5-1复位电路
5.1.2时钟电路设计
时钟电路是单片机的心脏,它控制着单片机的工作节奏。
STC89C52内部有一个反相振荡放大器,XTAL1和XTAL2分别是该反向振荡放大器的输入端和输出端。
本设计采用的晶振频率为12MHZ。
51系列单片机还可使用外部时钟,在使用外部时钟时,外部时钟必须从XTAL1输入,而XTAL2悬空。
图5-2为晶振电路
图5-2晶振电路
5.1.3单片机的I/O口的分配
首先对LCD和单片机的连接分配I/O口,LCD的E,RW,RS端分别为P0.0-P0.2,
然后再对HC-SR04进行I/O口分配,HC-SR04的触发控制信号输入口Trig为P1.4,回响信号输出口Echo为P3.2;DS18B20温度传感器是单总线的结构,和单片机的通讯只需要一个I/O口,可以设置P1.3为DS18B20温度传感器的总线和单片机的通讯接口。
5.2LCD1602显示模块的设计
在本设计中采用LCD1602来充当显示的作用,对LCD模块的电路的设计得先了解LCD的各个引脚然后再设置其各个引脚和单片机连接的的I/O口。
LCD1602液晶显示模块的读写操作,屏幕和光标的操作都是通过指令编程来实现的。
1602液晶模块内部的控制器共有11条控制指令,如表5-1所示:
表5-1LCD1602液晶模块内部的控制器共有11条控制指令
序号
指令
RS
R/W
D7
D6
D5
D4
D3
D2
D1
D0
1
清显示
0
0
0
0
0
0
0
0
0
1
2
光标返回
0
0
0
0
0
0
0
0
1
*
3
置输入模式
0
0
0
0
0
0
0
1
I/D
S
4
显示开/关控制
0
0
0
0
0
0
1
D
C
B
5
光标或字符移位
0
0
0
0
0
1
S/C
R/L
*
*
6
置功能
0
0
0
0
1
DL
N
F
*
*
7
置字符发生存贮器地址
0
0
0
1
字符发生存贮器地址
8
置数据存贮器地址
0
0
1
显示数据存贮器地址
9
读忙标志或地址
0
1
BF
计数器地址
10
写数到CGRAM或DDRAM)
1
0
要写的数据内容
11
从CGRAM或DDRAM读数
1
1
读出的数据内容
根据LCD1602的引脚定义和资料设计了测距系统的显示模块,电路图如下图5-3
图5-3
5.2.11602接口信号说明
1602接口信号说明如表5-2所示
表5-21602接口说明
编号
符号
引脚说明
编号
符号
引脚说明
1
VSS
电源地
9
D2
数据口
2
VDD
电源正极
10
D3
数据口
3
VO
液晶显示对比度调节端
11
D4
数据口
4
RS
数据/命令选择端
12
D5
数据口
5
R/W
读写选择端
13
D6
数据口
6
E
使能端
14
D7
数据口
7
D0
数据口
8
D1
数据口
5.2.21602操作时序
1602的操作时序图(见图5-4)
图5-41602操作时序
分析时序图可知1602液晶的流程如下
(1)通过RS确定是写数据还是写命令。
写命令包括液晶的光标显示/不显示、光标闪烁/不闪烁、需不需要移动屏幕、在液晶什么位置显示等。
写数据是指要显示什么内容。
(2)读/写控制端设置为写模式,即低电平。
(3)将数据或命令送至数据线。
(4)给E一个高脉冲将数据送入液晶控制器,完成写操作。
5.3DS18B20温度采集模块的设计
DS18B20的管脚排列如图5-5所示,DQ为数字信号输入/输出端;GND为电源地;VDD为外接供电电源输人端。
本温度控制系统采用外接供电方式,电路图如下图5-6所示
图5-5DS18B20管脚图
图5-6DS18B20电路图
5.3.1DS18B20的分辨率
DS18B20温度传感器可完成对温度的测量,温度分辨率的设定能够影响到温度传感器的转换时间和转换的精确度。
温度的分辨率设置如表5-3所示。
表5-3:
温度分辨率设置表
R1
R0
分辨率
温度最大转换时间
0
0
9位
93.75ms
0
1
10位
187.5ms
1
0
11位
375ms
1
1
12位
750ms
由于本系统的主要误差是温度影响声速,故对温度采集的精度要求较高,所以选择DS18B20的分辨率位12位,在12位分辨率的时候的温度采集精度是0.0625度,满足系统精度的要求,所以R1和R0的设置分别为R1=1,R0=1。
5.3.2DS18B20工作时序图
(1)初始化(时序图见5-7)
图5-7初始化时序
(2)写数据(时序图见图5-8)
图5-8写数据时序
(3)读数据(时序图见图5-9)
图5-9读数据时序
5.4超声波测距模块的设计
超声波测距测距模块采用HC-SR04模块,其芯片如图5-10所示:
图5-10
HR-SR04超声波集成模块工作原理采用的是I/O触发测距,给至少10 us的高电平信号。
另外,此模块可以自动发送8个40 kHz的方波脉冲,并能够自动检测是否有信号返回,如果检测到有信号返回则通过I/O口输出低电平,高电平的持续时间就是超声波从发射到返回所用的时间,则所测量的距离=(高电平时间×声速)/2,时序图如图5-11。
图5-11
此模块不宜带电连接,如果要带电连接,则先让模块的Gnd端先连接。
测距时,被测物体的面积不少于0.5平方米且要尽量平整。
否则会影响测试结果。
6软件设计
6.1程序流程图
6.1.1主程序流程图
否
是
6.1.2外部中断0流程图
6.2子程序设计
子程序包括了LCD显示模块程序,DS18B20温度采集模块程序。
6.2.1温度采集模块子程序
根据DS18B20的相关资料编写了温度采集程序
voiddsreset(void)//DS18B20初始化
{
uinti;
DS=0;
i=103;
while(i>0)i--;
DS=1;
i=4;
while(i>0)i--;
}
bittmpreadbit(void)//读一位
{
uinti;
bitdat;
DS=0;
i++;//小延时一下
DS=1;
i++;i++;
dat=DS;
i=8;
while(i>0)i--;
return(dat);
}
uchartmpread(void)//读一个字节
{
uchari,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tmpreadbit();
dat=(j<<7)|(dat>>1);//读出的数据最低位在最前面,这样刚好一个字节在DAT里
}
return(dat);//将一个字节数据返回
}
voidtmpwritebyte(uchardat)//写一个字节
{
uinti;
ucharj;
bittestb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb)//写1部分
{
DS=0;
i++;i++;
DS=1;
i=8;
while(i>0)i--;
}
else
{
DS=0;//写0部分
i=8;
while(i>0)i--;
DS=1;
i++;i++;
}
}
}
voidtmpchange(void)//发送温度转换命令
{
dsreset();//初始化DS18B20
delayb
(1);//延时
tmpwritebyte(0xcc);//跳过序列号命令
tmpwritebyte(0x44);//发送温度转换命令
}
inttmp()//获得温度
{
inttemp;
uchara,b;
dsreset();
delayb
(1);
tmpwritebyte(0xcc);
tmpwritebyte(0xbe);//发送读取数据命令
a=tmpread();//连续读两个字节数据
b=tmpread();
temp=b;
temp<<=8;
temp=temp|a;//两字节合成一个整型变量。
returntemp;//返回温度值
}
6.2.2LCD显示子程序
根据1602的资料编写了距离、温度显示模块的程序
voidwrite_com(ucharcommon)//1602写指令函数
{
RS=0;
P0=common;
delay
(1);
EN=1;
delay
(1);
EN=0;
}
voidwrite_data(ucharData)//1602写数据函数
{
RS=1;
P0=Data;
delay
(1);
EN=1;
delay
(1);
EN=0;
}
voidinit_1602()//初始化1602
{
RW=0;//只写不读
EN=0;
write_com(0x38);//7*52*16;八位数据接口
write_com(0x0c);//开显示,无光标
write_com(0x06);//地址自动加一
write_com
(1);//清屏
}
voiddisplay(uinttemp)//显示函数
{
ucharge,shi,bai,qian,i;//分别为距离的千、百、十、个位
qian=temp/1000;
bai=temp%1000/100;
shi=temp%100/10;
ge=temp%10;
write_com(0x80);//光标在第一行第一列
for(i=0;i<7;i++)
write_data(table1[i]);//显示“juli:
”字样
write_data(qian+0x30);//显示距离数值
write_data(bai+0x30);
write_data(shi+0x30);
write_data(ge+0x30);
write_com(0x80+11);//光标在第一行第12列
for(i=0;i<2;i++)
write_data(table2[i]);//显示“MM”字母
write_com(0x80+0x40);//光标在第二行第一列
for(i=0;i<8;i++)
write_data(table3[i]);//显示“wendu:
”字样
write_data(ly_dis[0]+0x30);//显示温度数值
write_data(ly_dis[1]+0x30);
write_com(0x80+0x40+11);//光标第二行第12列
for(i=0;i<1;i++)
write_data(table4[i]);//显示“C”字母
}
7误差分析
7.1温度
环境温度影响声速是本设计中存在误差最主要的原因。
当温差较大时,前后两次测距的误差肯定前后相差较大,故本设计采用了温度补偿的方法来减少温度的影响。
7.2障碍物表面材料
因为障碍物的发射面比较粗糙会引起发射信号散射开那么回波信号就会减弱,这样就会导致测量结果的误差增大,这是本设计不可避免的误差。
7.3超声波模块探头距离
两个超声波探头即发射探头和接收探头和障碍物之间存在一个几何角度,当两个探头的距离很近并远小于与被测物距离时这个几何角度被忽略不计,这样测得的距离才约等于实际距离,这也是本设计不可避免的误差。
8总结
此测距系统的硬件电路比较简单,都是使用现成模块搭建。
在实际测量中,性能指标也达到了设计要求。
本次设计的步骤如下:
1、根据任务要求选择合理方案
2、元件的选择
3、硬件设计(本设计选用的是51开发板和超声波测距集成模块)
4、软件设计
5、对整个系统进行调试,使其达到要求
参考文献
郭天祥.51单片机C语言教程[M].北京:
电子工业出版社
郁有文.常健.程继红.传感器原理及工程应用(第四版).西安电子科技大学出版社
附录一:
源程序
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitDS=P1^3;//定义DS18B20接口
sbitRS=P2^2;//1602管脚
sbitRW=P2^1;
sbitEN=P2^0;
sbitTrig=P1^4;//超声波模块接口
sbitEcho=P3^2;//回波信号接口在外部中断0
inttime;
intsucceed_flag;
intSpeed;
charltemp;
ucharly_dis[2];
uchartimeL;
uchartimeH;
ucharcodetable1[]="juli:
";
ucharcodetable3[]="wendu:
";
ucharcodetable2[]="MM";
ucharcodetable4[]="C";
voiddelay(uintz)//毫秒延时
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voiddelayb(uintcount)//温度延时
{
uinti;
while(count)
{
i=200;
while(i>0)
i--;
count--;
}
}
voiddelay_20us()//微秒延时
{
uchara;
for(a=0;a<100;a++);
}
voidwrite_com(ucharcommon)//1602写指令函数
{
RS=0;
P0=common;
delay
(1);
EN=1;
delay
(1);
EN=0;
}
voidwrite_data(ucharData)//1602写数据函数
{
RS=1;
P0=Data;
delay
(1);
EN=1;
delay
(1);
EN=0;
}
voidinit_1602()
{
RW=0;//只写不读
EN=0;
write_com(0x38);//7*52*16;八位数据接口
write_com(0x0c);//开显示,无光标
write_com(0x06);//地址自动加一
write_com
(1);//清屏
}
//显示数据
voiddisplay(uinttemp)
{
ucharge,shi,bai,qian,i;
qian=temp/1000;
bai=temp%1000/100;
shi=temp%100/10;
ge=temp%10;
write_com(0x80);
for(i=0;i<7;i++)
write_data(table1[i]);
write_data(qian+0x30);
write_data(bai+0x30);
write_data(shi+0x30);
write_data(ge+0x30);
write_com(0x80+11);
for(i=0;i<2;i++)
write_data(table2[i]);
write_com(0x80+0x40);
for(i=0;i<8;i++)
write_data(table3[i]);
wr