单片机课程设计报告
设计题目:超声波测距仪
专业班级:2009级电信1班 组 员:董 勇 2009221105200056
石家兴 2009221105200180 石 迈 2009221104110031 指导教师:田 茂
2011-12-18
一、 功能要求
超声波就是频率超过声波频率的机械波,一般频率在20KHz—40KHz的范围内。由于超声波的速度较光速小,其传播时间容易检测,且其传播方向性及强度均好,易于控制等,使得超声波检测技术在物体位置测量、物体识别、空间导航等方面应用越来越广泛。
(1)能应用于汽车倒车,建筑施工工地以及一些工业现场的位置监控; (2)显示模块采用LED数码管,能清晰稳定地显示测量结果;
(3)测量范围在0.10—4.00 m,测量精度1 cm,测量时与被测物体无直接接触。
二、 方案论证
我们知道,由于超声波指向性强,能量消耗缓慢,在介质中传播的距离较远,因而超声波经常用于距离的测量。利用超声波检测距离设计比较方便,计算处理也比较简单,并且在测量精度方面也能达到日常使用要求。 超声波发射器可以分为两大类:一类是用电气方式产生超声波;另一类是用机械方式产生超声波。电气方式包括压电性、电动型等;机械方式有加尔统笛、液哨和气流旋笛等。他们所产生的超声波的频率、功率和声波特性各不相同。目前在近距离测量方面较为常用的方式是压电式超声波换能器。 根据设计要求并综合各方面因素,本里决定采用STC89C51单片机作为主控制器,用动态扫描法实现LED数字显示,超声波驱动信号用单片机的定时器完成。超声波测距系统设计框图如下所示:
三、 系统硬件电路的设计
硬件电路主要分为单片机系统、LED显示电路及超声波发射电路和超声波检测接收电路三部分。
1、单片机最小系统模块
单片机控制电路核心是单片机芯片,单片机要正常工作,必须有其基本电路,包括晶振电路、复位电路。
单片机选用STC89C51。系统采用12MHZ高精度的晶振,以获得较稳定的时钟频率,并减小测量误差。C1和C2的作用是稳定振荡频率和快速起振。复位电路采用上电与按键复位。开机瞬间RST获得高电平,随着电容C3的充电,RST引脚的高电平将逐渐下降。若该高电平能保持足够2个机器周期,就可以实现复位操作。根据经典电路选择参数,选取C3=20µF,R1=10KΩ。
晶振电路 上电与按键复位电路
2、显示电路模块
显示电路采用LED数码管显示。LED数码管显示有静态显示方式和动态显示方式,本系统采用并行输出的动态显示方式。
(1)动态显示原理
七段LED显示器由8个发光二极管组成,通常构成字形“日”,其中一个发光二极管用来显示小数点。各段LED显示器由驱动电路驱动,控制相应的二极管导通,相应的一个笔画或一个点就发光,由此就能显示出对应字符。通常将各段发光二极管的阴极或阳极连在一起作为公共端;将各段发光二极管阳极连在一起的叫共阳极显示器,用低电平驱动;将阴极连在一起的叫共阴极显示器,用高电平驱动。
动态显示,就是一位一位地轮流点亮显示器的各个位。LED显示器工作于动态显示方式时,所有位的段码线相应段并联在一起,由1个8位I/O口驱动控制,形成段码线多路复用。各位的共阴极选择线分别由相应的1条I/O线控制,形成各位的分时选通。对显示器的每一位而言,每隔一段时间点亮一次。虽然在同一时刻只有一位显示器点亮,但由于人眼的视觉暂留效应和发光二极管熄
灭时的余辉,我们看到的却是多个字符“同时”显示。
显示器亮度既与点亮时的导通电流有关,也与点亮时间长短和点亮的间隔时间有关。对于确定的LED,调整点亮时的导通电流和点亮的间隔时间参数,即可实现亮度较高较稳定的显示。动态显示的优点是大大简化了硬件电路,但控制程序更复杂,控制时占用大量CPU时间;实质就是牺牲CPU时间换取器件减少。
(2)显示电路结构
根据本超声波测距器显示测距数据的需要,采用4位共阴LED动态显示电路。显示信息输入部分由单片机P0输出端,经限流电阻连接相应字段码端;字位控制部分分别连接单片机的P2口。显示电路如图所示。
(3)显示电路工作过程
工作中某时段,P0口输出相关位显示的段码,由P2口相应端输出位控信号,控制相应的显示位显示数据,同理,另一时间段,相应的另外的显示位显示数据,从而实现动态扫描显示。
3、超声波发射与接收模块
该部分采用市面上卖的一款很成熟的超声波发射与接收块HY-SRF05。实物图如下:
(1) 工作原理
a. 采用IO口TRIG触发测距,给至少10us的高电平信号;
b. 模块自动发送8个40KHZ的方波,自动检测是否有信号返回;
c. 有信号返回时,通过IO口ECHO输出一个高电平,高电平持续时间就是
超声波从发射到返回的时间。测试距离=(高电平时间*声速)/2。 (2) 引脚定义
VCC供5V电源,
TRIG触发控制,信号输入, ECHO回响信号输出,
OUT开关量输出(当报警模块使用), GND为地线。 (3) 工作时序图
以上时序图表明,只要提供一个10us以上脉冲触发信号,该模块内部将发出8个40KHZ周期电平并检测回波。一旦检测到回波,信号则输出回响信号。回响信号的脉冲宽度与所测量的距离成正比。由此通过发射信号到收到的回响信号时间间隔可以计算得到距离。
4、工作原理
超声波测距器工作原理:打开电源,整个电路通电,单片机执行程序,对系统环境初始化,设置定时器T0工作模式,启动T0, 调用超声波发生子程序,等待反射超声波,计算距离,显示距离;重复。工作过程中,相关的子程序和中断程序被执行,相应硬件配合行动,显示测量结果。
四、 系统程序的设计
超声波测距器的软件设计主要由主程序、超声波发生子程序、超声波接收中断程序及显示子程序组成。由于C语言有利于实现较复杂的算法,所以采用C语言编写程序。
1、超声波测距器算法的设计
如图示意了超声波测距的原理,即超声波发生器T在某一时刻发出一个超声波信号,当这个超声波遇到被测物体后反射回来,就会被超声波接收器R接收到。这样,只要计算出从发出超声波信号到接收到返回信号所用时间,就可以算出超声波发生器与反射物之间的距离。该距离的计算公式如下:
d=s/2=(v*t)/2
其中,d为被测物体与测距器的距离;s为声波的来回路程;v声速;t为声波来回所用时间。 超声波也是一种声波,其声速v与温度有关。下表列出了几种不同温度下的超声波声速。在使用时,如果温度变化不大,则可认为声速是基本不变的。如果测距精度要求很高,则应通过温度补偿的方法加以矫正。本设计要求不高,故不采用温度补偿法,可根据当前温度选用对应的声速值。声速确定后,只要测得超声波往返时间,即可求得距离。
不同温度下超声波声速表
温度/℃ 声速/(m/s)
2、主程序
-30 313 -20 319 -10 325 0 323 10 338 20 344 30 349 100 386 主程序流图如右图所示。主程序首先要对系统环境初始化,设置定时器T0工作模式为16为定时/计数模式,设置门控位GATE=1,定时/计数器的运行将同时受TRX位和INT0引脚电平的控制。在TRX=1时,若INT0=1,则启动计数,若INT0=0时,则停止计数。这一特点可极为方便地用于测试外部输入脉冲的宽度。为了避免超声波从发射器直接传送到接收器引起的直射波触发,需要延时约0.1ms(这也就是超声波测距器会有一个最小可测距离的原因)后才打开外部中断0接收返回的超声波信号。由于采用的是12MHZ的晶振,计数器每计一个数就是1us,当主程序检测到接收成功的标志位后,计数器T0中的数即是超声波来回所用的时间。
————
————
————
算出距离后,结果将以十进制BCD码方式送往LED显示约0.5s,然后再重复测量过程。
3、超声波发程序和超声波接收中断程序
由超声波发射接收模块时序图可知,通过单片机的P1^1口给它一个10us以上脉冲触发信号,同时把计数器T0打开进行计时。
超声波测距器主程序利用外中断0检测返回超声波信号,一旦接收到返回超声波信号(即INT0引脚出现低电平),T0立即停止计数,并且进入超声波接收中断程序。进入该中断后,将测距成功标志字赋值1。
如果当计时器溢出时还未检测到超声波返回信号,则定时器T0溢出中断将外中断0关闭,并将测距成功标志字赋值2,以表示本次测距不成功。
————
五、 控制源程序清单
#include #define uint unsigned int #define uchar unsigned char #define ulong unsigned long sbit p10=P1^0; sbit p32=P3^2; sbit a=P3^7; uchar code table1[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77}; //uchar code table1[]={0xbF,0x86,0xdB,0xcF,0xe6,0xeD,0xfD,0x87,0xfF,0xdF,0xf7}; uchar test; //定义测距成功标志。 ulong time; uint x1,x2,x3,x4; void display(); void delay(uint); void init(); void count(); void main() { uint m; while(1) { init(); p10=0; delay(1); p10=1;; delay(1); p10=0; while(p32==0); EA=1; EX0=1; ET0=1; TR0=1; while(p32==1); if(test==1) { time=TH0*256+TL0; time*=169; time/=1000; } else if(test==2) { time=0; } count(); for(m=0;m<150;m++) display(); } } void intr0() interrupt 0 { TR0=0; EX0=0; ET0=0; test=1; } void overtime() interrupt 1 { TR0=0; EX0=0; ET0=0; p32=0; test=2; } void init() { EA=0; ET0=0; TR0=0; IT0=0; IE0=0; TF0=0; TMOD=0x09; TH0=0; TL0=0; } void count() { x4=time/1000; x3=time%1000/100; x2=time%1000%100/10; x1=time%1000%100%10; } void display() { P2=0xf7; P0=table1[x4]; //千位 delay(6); P2=0xfb; P0=table1[x3]; //百位 delay(6); P2=0xfd; P0=table1[x2]; //十位 delay(6); P2=0xfe; P0=table1[x1]; //个位 delay(6); } void delay(uint i) //延时子程序(即延时ims) { uint j; while(i--) for(j=0;j<40;j++); } 六、 硬件制作 超声波测距器主要由单片机工作电路、超声波发射与接收模块、LED数码管显示三部分组成。由于元件多,电路复杂,连线多,因此我们画了PCB图,制作电路板。为了便于调试和检测纠正错误,这三部分分开制作。 1、单片机及其工作电路 2、LED数码管显示 3、超声波发射与接收模块 HY-SRF05 七、 调试及性能分析 1、调试 PCB板刻出来后,按照电路图焊接元器件,然后把三部分用杜邦线连接。硬件电路制作完成并调整好后,便可将程序编译好下载到单片机试运行。 首先发现LED显示亮度很低,这可能是点亮电流不够,去掉限流电阻后,效果不是很明显。由于共阴数码管是用高电平驱动,而单片机的P0口驱动能力有限,故采用74HC573锁存器驱动。这样改进后,数码管的亮度达到了正常。经过不断的修改与调整程序,最终到达了理想的状态。 2、性能指标 经过实际运行,测距器可测量范围为0.01m~5.2m。重复一致性好。 八、结论与心的 本次设计制作是我们本科以来制作的第一个硬件与软件结合的作品。经过团队的努力,最终完成了本次设计。 在设计超声波发射与接收模块时,准备采用课本上的电路图,用TCT40—l0Fl作超声波发射器、用TCT40—l0Sl和CX20106A构成超声波检测接收电路。我们制作了这个模块,结果却不尽人意,效果不是很好,稳定性不够。后来采用成品模块HY-SRF05,修改程序后,测距效果很好。 在画PCB时,原本是三部分整体画的,有人提出把这三部分分开来制作。这确实是个很好的想法,分开来制作,可以分别检测,问题出在哪一部分很明了,避免了“一颗老鼠屎坏了满锅粥”的现象。模块化设计还可以是某些部分再利用,比如单片机最小系统,是每个单片机工作电路不可或缺的,还有LED显示模块,很多电路也用LED来显示结果。 在这个过程中,每个人都付出了很大的努力,收获了知识与宝贵的经验。 因篇幅问题不能全部显示,请点此查看更多更全内容