基于51单片机的超声波测距仪说明书引言超声波测距仪,可应用于汽车倒车、建筑施工工地以及一些工业现场的位置监控,也可用于如液位、井深、管道长度的测量等场合。
利用超声波指向性强,能量消耗缓慢,在介质中传播的距离较远,因而超声波经常用于距离的测量。
利用超声波检测往往比较迅速、方便、计算简单、易于做到实时控制。
一、性能要求该超声波测距仪,要求测量范围在0.08-3.00m,测量精度1cm,测量时与被测物体无直接接触,能够清晰稳定地显示测量结果。
二、工作原理及方案论证超声波传感器及其测距原理超声波是指频率高于20KHz的机械波。
用超声波传感器产生超声波和接收超声波,习惯上称为超声波换能器或超声波探头。
超声波传感器有发送器和接收器.超声波传感器是利用压电效应的原理将电能和超声波相互转化,即在发射超声波的时候,将电能转换,发射超声波;而在收到回波的时候,则将超声振动转换成电信号。
超声波测距的原理一般采用渡越时间法TOF(timeofflight)。
首先测出超声波从发射到遇到障碍物返回所经历的时间,再乘以超声波的速度就得到二倍的声源与障碍物之间的距离。
根据要求并综合各方面因素,采用AT89C52单片机作为主控制器,用动态扫描法实现LED数字显示,超声波驱动信号用单片机的定时器完成,超声波测距仪的系统框图如下图所示:图1 超声波测距仪系统设计框图三、系统硬件部分硬件部分主要由单片机系统及显示电路、超声波发射电路和超声波检测接收电路三部分组成。
1.单片机系统及显示电路单片机采用AT89C52来实现对CX20106A红外接收芯片和TCT40-10系列超声波转换模块的控制。
单片机通过P1.1引脚发射脉冲控制超声波的发送,然后单片机不停的检测外中断0口INT0引脚,当INT0引脚的电平由高电平变为低电平时就认为超声波已经返回。
计数器所计的数据就是超声波所经历的时间,通过换算就可以得到传感器与障碍物之间的距离。
显示电路采用简单实用的4位共阳LED数码管,段码用74LS244驱动,位码用PNP三极管驱动。
单片机系统及显示电路如下图所示:图4 超声波接收电路图四.系统软件部分超声波测距程序设计软件部分主要由主程序,超声波发射子程序,超声波接受中断程序及显示子程序组成。
下面对超声波测距仪的算法,主程序,超声波发射子程序和超声波接受中断程序逐一介绍。
1.超声波测距仪的算法设计下图示意了超声波测距的原理,即超声波发生器T在某一时刻发出的一个超声波信号,当超声波遇到被测物体后反射回来,就被超声波接收器R所接受。
这样只要计算出发生信号到接受返回信号所用的时间,就可算出超声波发生器与反射物体的距离。
距离计算公式:d=s/2=(c*t)/2*d为被测物与测距器的距离,s为声波的来回路程,c为声速,t为声波来回所用的时间2.主程序主程序框图如右图所示:主程序首先对系统环境初始化,设置定时器T0工作模式为16位的定时计数器模式,置位总中断允许位EA并给显示端口P0和P2清0。
然后调用超声波发生子程序送出一个超声波脉冲,为避免超声波从发射器直接传送到接收器引起的直接波触发,需延迟0.1ms(这也就是测距器会有一个最小可测距离的原因)后,才打开外中断0接收返回的超声波信号。
由于采用12MHz的晶振,机器周期为1us,当主程序检测到接收成功的标志位后,将计数器T0中的数(即超声波来回所用的时间)按下式计算即可测得被测物体与测距仪之间的距离,设计时取20℃时的声速为344m/s则有:d=(C*T0)/2=172T0/10000cm(其中T0为计数器T0的计数值)测出距离后结果将以十进制BCD码方式LED,然后再发超声波脉冲重复测量过程。
3.超声波发生子程序和超声波接收中断程序超声波发生子程序的作用是通过P1.1端口发送超声波发射控制脉冲信号,同时把计数器T0打开进行计时。
超声波测距器主程序利用外中断0检测返回超声波信号,一旦接收到返回超声波信号(INT0引脚出现低电平),立即进入中断程序。
进入该中断后就立即关闭计时器T0停止计时,并将测距成功标志字赋值1。
如果当计时器溢出时还未检测到超声波返回信号,则定时器T0溢出中断将外中断0关闭,并将测距成功标志字赋值2以表示此次测距不成功。
五.软硬件调试及性能超声波发射和接收采用Φ15的超声波换能器TCT40-10F1(T发射)和TCT40-10S1(R接收),中心频率为40kHz,保持两换能器中心轴线平行并相距4~8cm。
主要性能指标:测距仪能测的范围为0.08~3.00m,测距仪精度1cm。
程序清单以下是用汇编语言编写的超声波测距控制源程序:采用AT89S52 12MHz晶振显示缓冲单元在40H~43H,使用内存44H、45H、46H用于计算距离20H用于标志VOUT EQU P1.0 ;脉冲输出端口*中断入口程序*ORG 0000HLJMP STARTORG 0003HLJMP PINT0ORG 000BHLJMP INTT0ORG 0013HRETIORG 001BHLJMP INTT1ORG 0023HRETIORG 002BHRETI*主程序*START: MOV SP, #4FHMOV R0, #40H ;40~43H为显示数据存放单元(40为最高位)MOV R7,#0BHCLEARDISP:MOV @R0, #00HINC R0DJNZ R7, CLEARDISPMOV 20H, #00HMOV TMOD, #21H ;T1为8位自动重装模式,T0为16位定时器MOV TH0, #00H ;65ms初值MOV TL0, #00H ;40KHz初值MOV TH1, #0F2HMOV TL1, #0F2HMOV P0, #0FFHMOV P1, #0FFHMOV P2, #0FFHMOV P3, #0FFHMOV R4, #04H ;超声波脉冲个数控制(为赋值的一半)SETB PX0SETB ET0STEB EACLR 00HSETB TR0 ;开启测距定时器START1: LCALL DISPLAYJNB 00H, START1 ;收到反射信号时标志位为1CLR EALCALL WORK ;计算距离子程序SETB EACLR 00HSETB TR0 ;重新开启测距定时器MOV R2, #64H ;测量间隔控制(约4*100=400ms)LOOP: LCALL DISPLAYDJNZ R2, LOOPSJMP START 1*中断程序*;T0中断,65ms中断一次INTT0: CLR EACLR TR0MOV TH0, #00HMOV TL0, #00HSETB ET1SETB EASETB TR0 ;启动计时器T0,用以计算超声波来回时间SETB TR1 ;开启发超声波用定时器T1 OUT: RETI;T1中断,发超声波用INTT1: CPL VOUTDJNZ R4,RETIOUTCLR TR1 ;超声波发送完毕,关T1CLR ET1MOV R4,#04HSETB EX0 ;开启接收回波中断RETIOUT: RETI;外中断0,收到回波时进入PINT0: CLR TR0 ;关计数器CLR TR1CLR ET1CLR EACLR EX0MOV 44H, TL0 ;将计数值移入处理单元MOV 45H, TH0SETB 00H ;接收成功标志RETI*延时程序*DL1MS: MOV R6, #14HDL1: MOV R7, #19HDL2: DJNZ R6, DL2DJNZ R6, DL1RET*显示程序*;40H为最高位,43H为最低位,先扫描高位DISPLAY:MOV R1, #40H;GMOV R5,#0F7H;GPLAY: MOV A, R5MOV P0, #0FFHMOV P2, AMOV A, @R1MOV DPTR, #TABMOVC A, @A+DPTRMOV P0, ALCALL DLIMSINC R1MOV A, R5JNB ACC.0, ENDOUT;GRR AMOV R5, AAJMP PLAYENDOUT; MOV P2, #0FFHMOV P0, #0FFHRETTAB; DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,88H,0BFH ;共阳数码管0 ,1, 2,3,4,5,6,7,8,9,不亮,A, —*距离计算程序(=计算值×17/1000c m) 近似WORK: PUSH ACCPUSH PSWPUSH BMOV PSW, #18HMOV R3, 45HMOV R2, 44HMOV R1, #00DMOV R0, #17DLCALL MUL2BY2MOV R3, #03HMOV R2, #0E8HLCALL DIV4BY2LCALL DIV4BY2MOV A, 40HJNZ JJ0MOV 40H, #0AH ;最高位为0,不点亮JJ0: MOV A R0MOV R4, AMOV A R1MOV R5 AMOV R3, #00DMOV R2, #100DLCALL DIV4BY2MOV 41H, R4MOV A, 41HJNZ JJ1MOV A, 40H ;此高位为0,先看最高位是否为不亮SUBB A, #0AHJNZ JJ1MOV 41H, #0AH ;最高位不亮,次高位也不亮JJ1: MOV A, R0MOV R4, AMOV A, R1MOV R5, AMOV R3, #00DMOV R2, #10DLCALL DIV4BY2MOV 42H, R4MOV A 42HJNZ JJ2MOV A, 41H ;次高位为0,先看次高位是否为不亮SUBB A, #0AHJNZ JJ2MOV 42H, #0AH ;次高位不亮,次高位也不亮JJ2: MOV 43H, R0POP BPOP PSWPOP ACCRET*两字节无符号数乘法程序MUL2BY2: CLR AMOV R7, AMOV R5, AMOV R4, AMOV 46H, #10HMULLOOP1: CLR CMOV A, R4RLC AMOV R4, AMOV A, R5RLC AMOV R5, AMOV A, R6RLC AMOV R6, AMOV A, R7RLC AMOV R7, AMOV A, R0RLC AMOV R0, AMOV A, R1RLC AMOV R1, AJNC MULLOOP2MOV A, R4ADD A, R2MOV R4, AMOV A, R5ADDC A, R3MOV R5, AMOV A, R6ADDC A, #00HMOV R6, AMOV A, R7ADDC A, #00HMOV R7, AMULLOOP2: DJNZ 46H, MULLOOP1RET*四字节/两字节无符号数除法程序* DIV4BY2: MOV 46H, #20HMOV R0, #00HMOV R1, #00HDIVLOOP1: MOV A, R4RLC AMOV R4, AMOV A, R5RLC AMOV R5, AMOV A, R6RLC AMOV R6, AMOV A, R7RLC AMOV R7, AMOV A, R0RLC AMOV R0, AMOV A, R1RLC AMOV R1, ACLR CMOV A, R0SUBB A, R2MOV B, AMOV A, R1SUBB A, R3JC DIVLOOP2MOV R0, BMOV R1, A DIVLOOP2: CPL CDJNZ 46H, DIVLOOP1MOV A, R4RLC AMOV R4, AMOV A, R5RLC AMOV R5, AMOV A, R6RLC AMOV R6, AMOV A, R7RLC AMOV R7, ARET;END附C51程序#INCLUDE <REG51.H>#DEFINE UCHAR UNSIGNED CHAR#DEFINE UINT UNSIGNED INT#DEFINE ULONG UNSIGNED LONGEXTERN VOID CS_T(VOID);EXTERN VOID DELAY(UINT); EXTERN VOID DISPLAY(UCHAR*);//DATA UCHAR DISPLAY(UCHAR*);DA TA UCHAR TESTOK;VOID MAIN (VOID){DA TA UCHAR DISPRAM[5];DA TA UINT I;DA TA ULONG TIME;P0=0XFF;P2=0XFF;TMOD=0X11;IE=0X80;WHILE (1){CS_T();DELAY(1);TESTOK=0;EX0=1;ET0=1;WHILE(! TESTOK) DISPLAY(DISPRAM); IF (1==TESTOK){TIME=TH0;TIME=(TIME<<8)| TL0;TIME*=172;TIME/=10000;DISPRAM[0]=(UCHAR) (TIME%10);TIME/=10;DISPRAM[1]=(UCHAR) (TIME%10);TIME/=10;DISPRAM[2]=(UCHAR) (TIME%10);DISPRAM[3]=(UCHAR) (TIME/10);IF (0==DISPRAM[3]) DISPRAM[3]=17;} ELSE{DISPRAM [0]=16;DISPRAM [1]=16;DISPRAM [2]=16;DISPRAM [3]=16;}FOR (I=0;I<300;I++) DISPLAY(DISPRAM);}}VOID CS_R(VOID) INTERRUPT 0{TR0=0;ET0=0;EX0=0;TESTOK=1;}VOID OVERTIME(VOID) INTERRUPT 1{EX0=0;TR0=0;ET0=0;TESTOK=2;}NAME CS_T PRCS_TCS_T SEGMENT CODEPUBLIC CS_TRSEG ?PR?CS_T?CS_T CS_T: PUSH ACCMOV TH0, #00HMOV TL0, #00HMOV A, #4DSETB TR0CS_T1: CPL p1.0NOPNOPNOPNOPNOPNOPNOPNOPNOPNOPDJNZ ACC,CS_T1POP ACCRET;ENDNAME DELAYPR_DELAYDELAY SEGMENT CODEPUBLIC _DELAYRSEG ?PR?_DELAY?DELAY_DELAY: PUSH ACCMOV A,R7JZ DELA1INC R6DELA1: MOV R5,#50DDJNZ R5, $DJNZ R7,DELA1DJNZ R6,DELA1POP ACCRETENDNAME DISPLAYPR_DISPLAYDISPLAY SEGMENT CODECO_DISPLAYDISPLAY SEGMENT DA TAEXTRN CODE (_DELAY)PUBLIC _DISPLAYRSEG ?CO?_DISPLAY?DISPLAY _DISPLAYBYTE:DISPBIT: DS 1DISPNUM: DS 1RSEG ?PR?_DISPLAY?DISPLAY_DISPLAY: PUSH ACCPUSH DPHPUSH DPLPUSH PSWINC DISPNUMMOV A,DISPNUMCJNE A,#4D,DISP1DISP1: JC DISP2MOV DISPNUM,#00HMOV DISPBIT,#0FEHDISP2: MOV A,R1ADD A,DISPNUMMOV R0,AMOV A,@R0MOV DPTR,#DISPTABLEMOVC A,@A+DPTRMOV P0,AMOV A,DISPNUMCJNE A,#2D,DISP3CLR P0.7DISP3: MOV P2,DISPBITMOV R5,#00HMOV R7,#0AHLCALL _DELAYMOV P0,#0FFHMOV P2,#0FFHMOV A,DISPBITRL AMOV DISPBIT,APOP PSWPOP DPLPOP DPHPOP ACCRETDISPTABLE: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,83H,0C6H,0A1H,86H,8EH,0BFH,0 FFHEND。