基于单片机的超生波测距系统课程设计正文--学位论文.doc
JIANGXINORMALUNIVERSITY传感器原理课程设计题目: 基于超声波传感器的测距系统院系名称:物理与通信电子学院学生姓名: 黄路瑶 学生学号: 1208063015 专 业: 电子信息工程 任课老师: 刘刚 完成时间: 2015年6月 摘要本文主要介绍了基于超声波传感器的测距系统的工作原理、硬件电路的设计和软件设计。该测距系统由单片机最小系统模块、温度采集模块、超声波测距模块,LCD显示模块组成。能够完成距离和温度的测量、显示等功能。关键词:超声波测距,单片机最小系统,温度采集摘要I1引言22 设计要求23 方案论证23.1 方案论证与比较33.2 单片机最小系统模块的方案33.3温度采集模块的方案43.4超声波测距模块的方案43.5 显示模块的方案45 系统设计55.1单片机最小系统模块的设计55.1.1复位电路的设计55.1.2 时钟电路设计65.1.3单片机的I/O口的分配65.2 LCD1602显示模块的设计75.2.1 1602接口信号说明85.2.2 1602操作时序85.3 DS18B20温度采集模块的设计95.3.1 DS18B20的分辨率105.3.2 DS18B20工作时序图105.4超声波测距模块的设计116 软件设计126.1 程序流程图136.1.1 主程序流程图136.1.2 外部中断0流程图146.2子程序设计146.2.1温度采集模块子程序146.2.2 LCD显示子程序167 误差分析187.1 温度187.2 障碍物表面材料187.3 超声波模块探头距离188总结18参考文献19附录一:源程序20附录二:实物图2601引言近年来,随着电子测量技术的发展,运用超声波作出精确测量已成可能。由于的经济发展,电子测量技术应用也越来越广泛,而超声波测量精确高,成本低,性能稳定则备受青睐。由于超声测距是一种非接触检测技术,不受光线、被测对象颜色等的影响,较其它仪器更卫生,更耐潮湿、粉尘、高温、腐蚀气体等恶劣环境,具有少维护、不污染、高可靠、长寿命等特点。因此可广泛应用于纸业、矿业、电厂、化工业、水处理厂、污水处理厂、农业用水、环保检测、食品(酒业、饮料业、添加剂、食用油、奶制品)、防汛、水文、明渠、空间定位、公路限高等行业中。可在不同环境中进行距离准确度在线标定,可直接用于水、酒、糖、饮料等液位控制,可进行差值设定,直接显示各种液位罐的液位、料位高度。利用超声波检测往往比较迅速、方便、计算简单、易于实现实时控制,由于超声波测距系统具有以上的这些优点,因此在汽车倒车雷达的研制方面也得到了广泛的应用。2 设计要求设计并制作一个基于超声波传感器的测距系统,基本要求如下:测量范围为0.2-1m;测量精度为±2mm;并能实时显示。3 方案论证 根据本题设计要求,确定了本系统的原理框图如图3-1所示。单片机最小系统模块:触发、中断接收、距离计算超声波测距模块 Lcd显示模块温度采集模块 图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 h d 测量目标 超声波接收探头图4-1被测距离。式中:s为超声波传播距离的一半,h为发射探头和接受探头之间的距离。由于s远大于h,因此可近似认为d=s,则d=s=ct2,t为发射超声波与接收超声波的时间间隔,c为超声波在空气中的传播速度。在空气中,常温下超声波的传播速度是334ms,但其传播速度c易受空气中温度的影响,声速与温度关系如表4-1所示,由此可修正超声波传播速度为 表4-1 声速与温度关系表温度()-30-20-10 0 10 20 30 40声速(m/s)313319325 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.2 LCD1602显示模块的设计在本设计中采用LCD 1602来充当显示的作用,对LCD模块的电路的设计得先了解LCD的各个引脚然后再设置其各个引脚和单片机连接的的I/O口。LCD1602液晶显示模块的读写操作,屏幕和光标的操作都是通过指令编程来实现的。1602液晶模块内部的控制器共有11条控制指令,如表5-1所示:表5-1 LCD1602液晶模块内部的控制器共有11条控制指令序号指令RSR/WD7D6D5D4D3D2D1D01清显示00000000012光标返回000000001*3置输入模式00000001I/DS4显示开/关控制0000001DCB5光标或字符移位000001S/CR/L*6置功能00001DLNF*7置字符发生存贮器地址0001字符发生存贮器地址8置数据存贮器地址001显示数据存贮器地址9读忙标志或地址01BF计数器地址10写数到CGRAM或DDRAM)10要写的数据内容11从CGRAM或DDRAM读数11读出的数据内容 根据LCD1602的引脚定义和资料设计了测距系统的显示模块,电路图如下图5-3图5-35.2.1 1602接口信号说明1602接口信号说明如表5-2所示表5-2 1602接口说明编号符号引脚说明编号符号引脚说明1VSS电源地9D2数据口2VDD电源正极10D3数据口3VO液晶显示对比度调节端11D4数据口4RS数据/命令选择端12D5数据口5R/W读写选择端13D6数据口6E使能端14D7数据口7D0数据口8D1数据口5.2.2 1602操作时序1602的操作时序图(见图5-4)图5-4 1602操作时序分析时序图可知1602液晶的流程如下(1) 通过RS确定是写数据还是写命令。写命令包括液晶的光标显示/不显示、光标闪烁/不闪烁、需不需要移动屏幕、在液晶什么位置显示等。写数据是指要显示什么内容。(2) 读/写控制端设置为写模式,即低电平。(3) 将数据或命令送至数据线。(4) 给E一个高脉冲将数据送入液晶控制器,完成写操作。5.3 DS18B20温度采集模块的设计DS18B20的管脚排列如图5-5所示,DQ为数字信号输入/输出端;GND 为电源地;VDD为外接供电电源输人端。本温度控制系统采用外接供电方式,电路图如下图5-6所示图5-5 DS18B20管脚图图5-6 DS18B20电路图5.3.1 DS18B20的分辨率DS18B20温度传感器可完成对温度的测量,温度分辨率的设定能够影响到温度传感器的转换时间和转换的精确度。温度的分辨率设置如表5-3所示。表5-3:温度分辨率设置表R1R0分辨率温度最大转换时间009位93.75ms0110位187.5ms1011位375ms1112位750ms由于本系统的主要误差是温度影响声速,故对温度采集的精度要求较高,所以选择DS18B20的分辨率位12位,在12位分辨率的时候的温度采集精度是0.0625度,满足系统精度的要求,所以R1和R0的设置分别为R1=1,R0=1。5.3.2 DS18B20工作时序图(1) 初始化(时序图见5-7)图5-7初始化时序(2)写数据(时序图见图5-8)图5-8写数据时序(3) 读数据(时序图见图5-9)图5-9读数据时序5.4超声波测距模块的设计超声波测距测距模块采用HC-SR04模块,其芯片如图5-10所示:图5-10HR-SR04超声波集成模块工作原理采用的是I/O触发测距,给至少10 us的高电平信号。另外,此模块可以自动发送8个40 kHz的方波脉冲,并能够自动检测是否有信号返回,如果检测到有信号返回则通过I/O口输出低电平,高电平的持续时间就是超声波从发射到返回所用的时间,则所测量的距离=(高电平时间×声速)/2,时序图如图5-11。图5-11此模块不宜带电连接,如果要带电连接,则先让模块的 Gnd 端先连接。测距时,被测物体的面积不少于 0.5 平方米且要尽量平整。否则会影响测试结果。6 软件设计6.1 程序流程图6.1.1 主程序流程图 数据初始化 定时器初始化 显示初始化进入while循环 温度计算 声速计算 读取定时器值 距离清零 Lcd显示 距离计算超声波测量触发等待中断是否触发 否是6.1.2 外部中断0流程图 外部中断0入口读取当前定时器值 置测量成功标志 返回6.2子程序设计子程序包括了LCD显示模块程序,DS18B20温度采集模块程序。6.2.1温度采集模块子程序根据DS18B20的相关资料编写了温度采集程序void dsreset(void) /DS18B20初始化 uint i; DS=0; i=103; while(i>0)i-; DS=1; i=4; while(i>0)i-;bit tmpreadbit(void) /读一位 uint i; bit dat; DS=0; i+; /小延时一下 DS=1; i+;i+; dat=DS; i=8; while(i>0)i-; return (dat);uchar tmpread(void) /读一个字节 uchar i,j,dat; dat=0; for(i=1;i<=8;i+) j=tmpreadbit(); dat=(j<<7)|(dat>>1); /读出的数据最低位在最前面,这样刚好一个字节在DAT里 return(dat); /将一个字节数据返回void tmpwritebyte(uchar dat) /写一个字节 uint i; uchar j; bit testb; 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+; void tmpchange(void) /发送温度转换命令 dsreset(); /初始化DS18B20 delayb(1); /延时 tmpwritebyte(0xcc); / 跳过序列号命令 tmpwritebyte(0x44); /发送温度转换命令int tmp() /获得温度 int temp; uchar a,b; dsreset(); delayb(1); tmpwritebyte(0xcc); tmpwritebyte(0xbe); /发送读取数据命令 a=tmpread(); /连续读两个字节数据 b=tmpread(); temp=b; temp<<=8; temp=temp|a; /两字节合成一个整型变量。 return temp; /返回温度值6.2.2 LCD显示子程序根据1602的资料编写了距离、温度显示模块的程序void write_com(uchar common) /1602写指令函数RS=0;P0=common;delay(1);EN=1;delay(1);EN=0;void write_data(uchar Data) /1602写数据函数RS=1;P0=Data;delay(1);EN=1;delay(1);EN=0;void init_1602() /初始化1602RW=0;/只写不读EN=0;write_com(0x38);/7*5 2*16; 八位数据接口write_com(0x0c); /开显示,无光标write_com(0x06);/地址自动加一write_com(1);/清屏void display(uint temp) /显示函数 uchar ge,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(table1i);/显示“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(table2i);/显示“MM”字母write_com(0x80+0x40); /光标在第二行第一列for(i=0;i<8;i+)write_data(table3i); /显示“wendu:”字样write_data(ly_dis0+0x30); /显示温度数值write_data(ly_dis1+0x30);write_com(0x80+0x40+11); /光标第二行第12列for(i=0;i<1;i+)write_data(table4i); /显示“C”字母 7 误差分析7.1 温度环境温度影响声速是本设计中存在误差最主要的原因。当温差较大时,前后两次测距的误差肯定前后相差较大,故本设计采用了温度补偿的方法来减少温度的影响。7.2 障碍物表面材料因为障碍物的发射面比较粗糙会引起发射信号散射开那么回波信号就会减弱,这样就会导致测量结果的误差增大,这是本设计不可避免的误差。7.3 超声波模块探头距离两个超声波探头即发射探头和接收探头和障碍物之间存在一个几何角度,当两个探头的距离很近并远小于与被测物距离时这个几何角度被忽略不计,这样测得的距离才约等于实际距离,这也是本设计不可避免的误差。8总结此测距系统的硬件电路比较简单,都是使用现成模块搭建。在实际测量中,性能指标也达到了设计要求。 本次设计的步骤如下: 1、根据任务要求选择合理方案 2、元件的选择 3、硬件设计(本设计选用的是51开发板和超声波测距集成模块) 4、软件设计 5、对整个系统进行调试,使其达到要求参考文献郭天祥.51单片机C语言教程M.北京:电子工业出版社郁有文.常健.程继红.传感器原理及工程应用(第四版).西安电子科技大学出版社 附录一:源程序 #include <reg52.h> #define uchar unsigned char#define uint unsigned intsbit DS=P13; /定义DS18B20接口 sbit RS=P22; /1602管脚sbit RW=P21;sbit EN=P20;sbit Trig=P14; /超声波模块接口sbit Echo=P32; /回波信号接口在外部中断0int time;int succeed_flag;int Speed;char ltemp;uchar ly_dis2;uchar timeL;uchar timeH;uchar code table1=" juli:"uchar code table3=" wendu:"uchar code table2="MM"uchar code table4="C"void delay(uint z) /毫秒延时 uint x,y; for(x=z;x>0;x-) for(y=110;y>0;y-);void delayb(uint count)/温度延时 uint i; while(count) i=200; while(i>0) i-; count-; void delay_20us()/微秒延时 uchar a ; for(a=0;a<100;a+); void write_com(uchar common) /1602写指令函数RS=0;P0=common;delay(1);EN=1;delay(1);EN=0;void write_data(uchar Data) /1602写数据函数RS=1;P0=Data;delay(1);EN=1;delay(1);EN=0;void init_1602()RW=0;/只写不读EN=0;write_com(0x38);/7*5 2*16; 八位数据接口write_com(0x0c); /开显示,无光标write_com(0x06);/地址自动加一write_com(1);/清屏/显示数据void display(uint temp) uchar ge,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(table1i); 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(table2i);write_com(0x80+0x40);for(i=0;i<8;i+)write_data(table3i);write_data(ly_dis0+0x30);write_data(ly_dis1+0x30);write_com(0x80+0x40+11);for(i=0;i<1;i+)write_data(table4i); void dsreset(void) /DS18B20初始化 uint i; DS=0; i=103; while(i>0)i-; DS=1; i=4; while(i>0)i-;bit tmpreadbit(void) /读一位 uint i; bit dat; DS=0; i+; /小延时一下 DS=1; i+;i+; dat=DS; i=8; while(i>0)i-; return (dat);uchar tmpread(void) /读一个字节 uchar i,j,dat; dat=0; for(i=1;i<=8;i+) j=tmpreadbit(); dat=(j<<7)|(dat>>1); /读出的数据最低位在最前面,这样刚好/一个字节在DAT里 return(dat); /将一个字节数据返回void tmpwritebyte(uchar dat) /写一个字节 uint i; uchar j; bit testb; 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+; void tmpchange(void) /发送温度转换命令 dsreset(); /初始化DS18B20 delayb(1); /延时 tmpwritebyte(0xcc); / 跳过序列号命令 tmpwritebyte(0x44); /发送温度转换命令int tmp() /获得温度 int temp; uchar a,b; dsreset(); delayb(1); tmpwritebyte(0xcc); tmpwritebyte(0xbe); /发送读取数据命令 a=tmpread(); /连续读两个字节数据 b=tmpread(); temp=b; temp<<=8; temp=temp|a; /两字节合成一个整型变量。 return temp; /返回温度值void main() uint distance; uint i; Trig=0; /首先拉低脉冲输入引脚 EA=1; /打开总中断0 TMOD=0x10; /定时器1,16位工作方式 init_1602(); while(1) /温度计算 if(i=0)/先发转换命令,再读数值,以减少速度慢带来的显示抖动tmpchange(); /温度转换if(i=30)ltemp=tmp()/16;/得到十进制温度值,因为DS18B20可以精确到0.0625度,这里取整数显示 ly_dis0=ltemp/10;/显示温度十位值 ly_dis1=ltemp%10;/显示温度个位值i+;if(i=50)/3000一个读取周期i=0;Speed=0.6*ltemp+331.5; EA=0; /关总中断 Trig=1; /超声波输入端 delay_20us(); /延时20us Trig=0; /产生一个20us的脉冲 while(Echo=0); /等待Echo回波引脚变高电平 succeed_flag=0; /清测量成功标志 EA=1; EX0=1; /打开外部中断0 TH1=0; /定时器1清零 TL1=0; /定时器1清零 TF1=0; /计数溢出标志 TR1=1; /启动定时器1 delay(20); /等待测量的结果 TR1=0; /关闭定时器1 EX0=0; /关闭外部中断0 if(succeed_flag=1) time=timeH*256+timeL; distance=(unsigned long)(Speed)*time)/2000; /毫米 if(succeed_flag=0) distance=0; /没有回波则清零 display(distance) ; /外部中断0,用做判断回波电平void exter() interrupt 0 / 外部中断0是0号 EX0=0; /关闭外部中断 timeH =TH1; /取出定时器的值 timeL =TL1; /取出定时器的值 succeed_flag=1;/至成功测量的标志 /定时器1中断,用做超声波测距计时void timer1() interrupt 3 TH1=0; TL1=0; 附录二:实物图由上图可知:误差达到了±2mm!25