基于单片机的超声波测距课程设计报告
课程设计说明书
题 目:超声波测距 院 (系):电子工程与自动化 专 业: 学生姓名: 学 号: 指导教师:
2011 年 11 月 7 日
目录
一、绪论
二、对本课程的设计分析 2.1 总体设计方案介绍
2.2 系统硬件设计方案 原理
三、主要电路模块的实现方案比较及选择 3.1 超声波发射电路 3.2 超声波检测接收电路
3.3 超声波测距系统的硬件电路设计 3.4 系统电路图及其PCB图 四、系统的软件设计 4.1 主程序流程图
4.2超声波发射子程序和超声波接收中断程序 五、测试数据以及结论
六、课程设计过程中遇到的主要问题以及解决办法 七、心得体会
一、绪论
随着社会的发展,人们对距离或长度测量的要求越来越高。超声波测距由于其能进行非接触测量和相对较高的精度,越来越受到人们的重视。超声波测距离的一个最重要的功能就是作用于倒车系统上。要实现倒车系统的准确精度,就得把超声波和单片机相结合,利用单片机的控制系统和精确的运算使超声波测距离更加快速和精确。从而,减少事故的发生。通过该实验学习利用单片机和超声波探测元件测试距离的基本方法,进一步熟悉单片机定时器技术、中断技术在数据采集和数据处理过程中的综合运用方法,提高综合应用程序的编程方法与技巧。
发射器发出的40KHz超声波以速度v在空气中传播,在到达被测物体时被反射返回,由接收器接收,其往返时间为t,由s=vt/2即可算出被测物体的距离。
报告内容包括:单片机控制主程序、中断子程序、延时子程序和超声波发射、接收电路、数码管驱动显示电路以及主电路。
二、对本课程设计的分析 2.1总体设计方案介绍 2.1.1超声波测距原理
发射器发出的超声波以速度v在空气中传播,在到达被测物体时被反射返回,由接收器接收,其往返时间为t,由s=vt/2即可算出被测物体的距离。由于超声波也是一种声波,其声速v与温度有关,下表列出了几种不同温度下的声速。在使用时,如果温度变化不大,则可认为声速是基本不变的。 表1-1 超声波波速与温度的关系表
温度(℃) -30 -20 -10 0 10 20 30 100 声速(m/s) 313 319 325 323 338 344 349 386 表1-1 2.1.2超声波测距仪原理框图如下图
采用AT89s52单片机,晶振:12MHZ,单片机P1.0口发出40kHZ的方波信号,通过超声波发射器输出;超声波接收器将接收到的超声波信号,利用外部中断0口监测超声波输出的返回信号,显示电路采用简单的4位LED数码管,位码用8550驱动。
图1-1 超声波测距原理框图
超声超声 单 数码管扫描驱 2.2 系统的硬件结构设计
硬件电路的设计主要包括单片机系统及LED显示电路、超声波发射电路和超声波检测接收电路三部分。单片机采用AT89S52来实现对CX20106A红外接收芯片和TCT40-10系列超声波转换模块的控制。采用12MHz高精度的晶振,以获得较稳定时钟频率,减小测量误差。单片机通过P1.0口经反相器来控制超声波的发送,然后单片机不断的检测INT0引脚,当INT0引脚的电平用高电平变为低电平时就认为超声波已返回。计数器所记的数据就是超声波所经历的时间,通过换算就可以得到超声波传感器与障碍物的距离。
2.2.1 51系列单片机的功能特点及测距原理
2. 51系列单片机的功能特点
51系列单片机中典型芯片(AT89S52)采用40引脚双列直插封装(DIP)形式,内部由CPU,8kB的ROM,256 B的RAM,3个16b的定时/计数器TO、T1以及T2,4个8 b的工/O端I:IP0,P1,P2,P3,一个全双功串行通信口等组成。特别是该系列单片机片内的Flash可编程、可擦除只读存储器(E~PROM),使其在实际中有着十分广泛的用途,在便携式、省电及特殊信息保存的仪器和系统中更为有用。
5l系列单片机提供以下功能:8 kB存储器;256 BRAM;32条工/O线;3个16b定时/计数器;5个2级中断源;1个全双向的串行口以及时钟电路。
空闲方式:CPU停止工作,而让RAM、定时/计数器、串行口和中断系统继续工作。
掉电方式:保存RAM的内容,振荡器停振,禁止芯片所有的其他功能直到下一次硬件复位。
5l系列单片机为许多控制提供了高度灵活和低成本的解决办法。充分利用他的片内资源,即可在较少外围电路的情况下构成功能完善的超声波测距系统。
2. 单片机实现测距原理
单片机发出超声波测距是通过不断检测超声波发射后遇到障碍物所反射的回波,从而测出发射和接收回波的时间差t,然后求出距离S=Ct/2,式中的C为超声波波速。
限制该系统的最大可测距离存在4个因素:超声波的幅度、反射的质地、反射和入射声波之间的夹角以及接收换能器的灵敏度。接收换能器对声波脉冲的直接接收能力将决定最小的可测距离。由于超声波属于声波范围,其波速C与温度有关。
三、主要电路模块的实现方案比较及选择 3.1 超声波发射电路
超声波发射电路原理图如图3-1所示。发射电路主要由反相器CD4069和超声波发射换能器TX构成,单片机P1.0端口输出的40kHz的方波信号一路经一级反向器后送到超声波换能器的一个电极,另一路经两级反向器后送到超声波换能器的另一个电极,用这种推换形式将方波信号加到超声波换能器的两端,可以提高超声波的发射强度。
图3-1 超声波发射电路原理图
3.2 超声波检测接收电路
集成电路CX20106A是一款红外线检波接收的专用芯片,常用于电视机红
外遥控接收器。考虑到红外遥控常用的载波频率38 kHz与测距的超声波频率40 kHz较为接近,可以利用它制作超声波检测接收电路(如图3-2)。实验证明用CX20106A接收超声波(无信号时输出高电平),具有很好的灵敏度和较强的抗干扰能力。
图3-2 超声波检测接收电路
3.3 超声波测距系统的硬件电路设计
本系统的特点是利用单片机控制超声波的发射和对超声波自发射至接收往返时间的计时,单片机选用AT89S52,经济易用,且片内有8K的ROM,便于编程。单片机系统及显示电路原理图如见图3-3。
图3-3 单片机系统及显示电路原理图
3.4 系统电路图及其PCB图
给出整个系统的电路图,并加以说明。要详细说明第3节中各模块如何组
合在一起来实现系统功能的。
图4-1 系统电路图及其PCB图 当电源接电的时候由AT89S52单片机实现对CX20106A红外接收芯片的控制。单片机通过P1.0引脚经反相器来控制超声波的发送,然后单片机不停的检测INT0引脚,当INT0引脚的电平由高电平变为低电平时就认为超声波已经返回。单片机开启外部中断使定时器关闭,定时器所计的数据就是超声波所经历的时间,通过运算就可以得到传感器与障碍物之间的距离,这时通过BCD码转换把十六进制的数据转换成十进制,并通过查表把距离显示在LED数码管显示器上。
四、系统的软件设计 4.1 主程序流程图
超声波测距仪的软件设计主要由主程序、超声波发射子程序、超声波接收中断程序及显示子程序等部分组成。
主程序首先对系统初始化,设置定时器T0工作模式为16位的定时计数器模式,置位总中断允许位EA。然后单片机送出超声波脉冲,为避免超声波从发射器直接传送到接收器引起的直接波触发,需延迟一段时间,保持电平20us左右,也就是超声波频率大约为40KHZ,连续发送8个波形(这也是超声波测距离会有一个最小可测距离的原因)后,才打开外中断1接收返回的超声波信号。由于采用12MHz的晶振,机器周期为1us,当主程序检测到接收成功的标志位后,将计数器T0中的数(即超声波来回所用的时间)按下式计算即可测得被测物体与测距仪之间的距离,设计时取20℃时的声速为340m/s则有:
d=(T0*344)/2(其中T0为计数器T0的计数值)
测出距离后结果将以十进制BCD码方式送到LED显示管显示,然后再发射超声波脉冲重复测量过程。主程序框图如下图5-1所示:
图5-1 超声波测距离主程序流程图
开 单片机 定时中 有无 外部中 结
4.2超声波发射子程序和超声波接收中断程序
超声波发射子程序的作用是通过P1.0端口发送8个超声波信号,频率约40KHz的方波,脉冲宽度为20us左右,同时把计数器T0打开进行计时。超声波测距离主程序利用外中断0检测返回超声波信号,一旦接收到返回超声波信号(INT0引脚出现低电平),立即进入中断程序。进入该中断后就立即关闭计时器T0停止计时,并将测距成功标志位赋值1.,中断子程序流程图如图5-2所示:
定时 外部中 关外部 读取时 N 计算 结果 定时初 发射 是否 停止 返 返图5-2 定时中断子程序流程图 外部中断子程序流程图
五、测试数据以及结论
在温度为25度左右环境下测试: 实际距离70 (mm) 实际距离72 (mm)
超声波测距仪的制作和调试都比较简单,其中超声波发射和接收采用Φ15的超声波换能器TCT40-10F1(T发射)和TCT40-10S1(R接收),中心频率为40kHz,安装时应保持两换能器中心轴线平行并相距4~8cm,其余元件无特殊要求。若能将超声波接收电路用金属壳屏蔽起来,则可提高抗干扰能力。
76 81 87 92 96 100 105 110 75 80 85 90 95 100 105 110
硬件电路制作完成并调试好后,便可将程序编译好下载到单片机试运行。根据实际情况可以修改超声波发生子程序每次发送的脉冲宽度和两次测量的间隔时间,以适应不同距离的测量需要。根据所设计的电路参数和程序,测距仪能测的范围为0.06~1m,测距仪最大误差不超过1mm。系统调试完后应对测量误差和重复一致性进行多次实验分析,不断优化系统使其达到实际使用的测量要求。
改装:由于技术水平所限暂时不能给该设计加入语音程序,如果能加入语音程序的话,就能使超声波测距离在倒车系统和其他领域中得到最完美的体现。
超声波测距离在生活中的应用越来越广泛,且也使汽车在倒车的时候能最大可能的减少事故的发生。其有很高的开发的价值和十分广泛的应用领域,为提高生活和科学技术水平提供了选择。
六、课程设计过程中遇到的主要问题以及解决办法
问题一:该实验不能在Protues上进行仿真
由于不能在Protues上仿真出超声波信号的发射和接收所以进行不了仿真,这时候我只能通过查资料直接在Protel上画出该实验的整个电路图,直接做出硬件来进行调试。
问题二:接受超声波电路的电容用错
电解电容用了瓷片电容,而且电容的大小用小了
七、心得体会
超声波测距离让我想到雷达探测,因为其利用的就是超声波原理。由于暑假电赛培训时候已经做过了其电路板,只是当时程序下载到板子上时候没有成功。所以我把上次遗留下来的问题,一并的在这次课设中考虑进去了,可以说是带着很疑问去做课设的。板子很快就做好了,而程序的编写都是自己通过网上查找资料以及询问高年级学长才一步一个坎,一步一个脚印,最终编程成功,达到了我所想要的结果。过程不算很难,同时看着自己所做出来的成果,感觉挺开心的。
通过该实验,我们认识的到了单片机在控制领域中的强大作用,也使我加深了所学的单片机知识,为我们以后的就业和学习提供了很多的基础。
附录 超声波测距离程序
#include SEG7[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; uint distance[4]; //测距接收缓冲区 uchar ge,shi,bai,temp,flag,outcomeH,outcomeL,i; bit succeed_flag; //测量成功标志 void conversion(uint temp_data); void delay_20us(); void csb_init(); void main() // 主程序 { uint distance_data,a,b; uchar CONT_1; i=0; flag=0; csb_init(); while(1) { EA=0; Tx=1; code delay_20us(); Tx=0; //产生一个20us的脉冲,在Tx引脚 while(Rx==0); //等待Rx回波引脚变高电平 succeed_flag=0; //清测量成功标志 EX0=1; //打开外部中断 TH1=0; TL1=0; TF1=0; TR1=1; //启动定时器1 EA=1; 现) TR1=0; //关闭定时器1 while(TH1 < 30); //等待测量的结果,周期65.535毫秒(可用中断实 EX0=0; //关闭外部中断 if(succeed_flag==1) { distance_data=outcomeH; //测量结果的高8位 distance_data<<=8; //放入16位的高8位 果数据 distance_data*=12; //因为定时器默认为12分频 distance_data/=58; //微秒的单位除以58等于厘米 } // X秒=( 2*Y米)/344 X秒=0.0058*Y米 if(succeed_flag==0) { distance_data=0; //没有回波则清零 } distance[i]=distance_data; //将测量结果的数据放入缓冲区 i++; if(i==3) distance_data=distance_data|outcomeL;//与低8位合并成为16位结 { distance_data=(distance[0]+distance[1]+distance[2]+distance[3])/4; a=distance_data; if(b==a) CONT_1=0; if(b!=a) CONT_1++; if(CONT_1>=3) { CONT_1=0; b=a; conversion(b); } i=0; } } } //外部中断0,用做判断回波电平 INTO_() interrupt 0 // 外部中断是0号 { outcomeH =TH1; outcomeL =TL1; succeed_flag=1; EX0=0; //关闭外部中断 } //定时器0中断,用做显示 timer0() interrupt 1 // 定时器0中断是1号 { TH0=0xfd; //写入定时器0初始值 TL0=0x77; switch(flag) { case 0x00:P2=ge; P0=0xfe;flag++;break; case 0x01:P2=shi;P0=0xfd;flag++;break; case 0x02:P2=bai;P0=0xfb;flag=0;break; } } //显示数据转换程序 void conversion(uint temp_data) { uchar ge_data,shi_data,bai_data ; bai_data=temp_data/100 ; temp_data=temp_data%100; //取余运算 shi_data=temp_data/10 ; temp_data=temp_data%10; //取余运算 ge_data=temp_data; bai_data=SEG7[bai_data]; shi_data=SEG7[shi_data]; ge_data =SEG7[ge_data]; bai = bai_data; shi = shi_data; ge = ge_data ; } void delay_20us() { uchar bt ; for(bt=0;bt<20;bt++); } void csb_init() { Tx=0; //首先拉低脉冲输入引脚 TMOD=0x11; //定时器0,定时器1,16位工作方式 TR0=1; //启动定时器0 IT0=0; //由高电平变低电平,触发外部中断 ET0=1; //打开定时器0中断 EX0=0; //关闭外部中断 EA=1; //打开总中断0 } 因篇幅问题不能全部显示,请点此查看更多更全内容