您的位置 首页 软件

单片机超声波传感器丈量间隔

一、设计要求设计一个超声波测距器,可以应用于汽车倒车、建筑施工工地以及一些工业现场的位置监控,也可用于如液位、井深、管道长度的测量…

一、规划要求

规划一个超声波测距器,能够应用于轿车倒车、修建施工工地以及一些工业现场的方位监控,也可用于如液位、井深、管道长度的丈量等场合。要求丈量规模在0.10-3.00m,丈量精度1cm,丈量时与被测物体无直接触摸,能够明晰安稳地显现丈量成果。

二、规划思路

超声波传感器及其测距原理

超声波是指频率高于20KHz的机械波。为了以超声波作为检测手法,有必要产生超生波和接纳超声波。完结这种功用的设备便是超声波传感器,习惯上称为超声波换能器或超声波探头。超声波传感器有发送器和接纳器,但一个超声波传感器也可具有发送和接纳声波的两层效果。超声波传感器是运用压电效应的原理将电能和超声波彼此转化,即在发射超声波的时分,将电能转化,发射超声波;而在收到回波的时分,则将超声振荡转化成电信号。

超声波测距的原理一般选用渡越时刻法TOF(timeofflight)。首要测出超声波从发射到遇到障碍物回来所阅历的时刻,再乘以超声波的速度就得到二倍的声源与障碍物之间的间隔

丈量间隔的办法有很多种,短间隔的能够用尺,远间隔的有激光测距等,超声波测距适用于高精度的中长间隔丈量。因为超声波在规范空气中的传达速度为331.45米/秒,由单片机担任计时,单片机运用12.0M晶振,所以此体系的丈量精度理论上能够到达毫米级。

因为超声波指向性强,能量消耗缓慢,在介质中传达间隔远,因此超声波能够用于间隔的丈量。运用超声波检测间隔,规划比较便利,核算处理也较简略,并且在丈量精度方面也能到达要求。

超声波产生器能够分为两类:一类是用电气办法产生超声波,一类是用机械办法产生超声波。本课题归于近间隔丈量,能够选用常用的压电式超声波换能器来完结。

依据规划要求并归纳各方面要素,能够选用AT89S51单片机作为主操控器,用动态扫描法完结LED数字显现,超声波驱动信号用单片机的守时器完结,超声波测距器的体系框图如下图所示:

超声波测距器体系规划框图

三、体系组成

硬件部分

主要由单片机体系及显现电路、超声波发射电路和超声波检测接纳电路三部分组成。选用AT89S51来完结对CX20106A红外接纳芯片和TCT40-10系列超声波转化模块的操控。单片机经过P1.0引脚经反相器来操控超声波的发送,然后单片机不断的检测INT0引脚,当INT0引脚的电平由高电平变为低电平时就以为超声波现已回来。计数器所计的数据便是超声波所阅历的时刻,经过换算就能够得到传感器与障碍物之间的间隔。

软件部分

主要由主程序、超声波产生子程序、超声波接纳中止程序及显现子程序等部分。

四、体系硬件电路规划

1.单片机体系及显现电路

单片机选用89S51或其兼容系列。选用12MHz高精度的晶振,以取得较安稳的时钟频率,减小丈量差错。单片机用P1.0端口输出超声波转化器所需的40KHz方波信号,运用外中止0口检测超声波承受电路输出的回来信号。显现电路选用简略有用的4位共阳LED数码管,段码用74LS244驱动,位码用PNP三极管驱动。单片机体系及显现电路如下图所示

单片机及显现电路原理

2.超声波发射电路原理图参阅期刊如图所示:

超声波发射电路原理图

压电超声波转化器的功用:运用压电晶体谐振作业。内部结构上图所示,它有两个压电晶片和一个共振板。当它的南北极外加脉冲信号,其频率等于压电晶片的固有振荡频率时,压电晶片将会产生共振,并带动共振板振荡产生超声波,这时它便是一超声波产生器;如没加电压,当共振板承受到超声波时,将压榨压电振荡器作振荡,将机械能转化为电信号,这时它就成为超声波承受转化器。超声波发射转化器与承受转化器其结构稍有不同。

3.超声波检测承受电路

参阅红外转化接纳期刊的电路选用%&&&&&%CX20106A,这是一款红外线检波接纳的专用芯片,常用于电视机红外遥控接纳器。考虑到红外遥控常用的载波频率38KHz与测距超声波频率40KHz较为挨近,能够运用它作为超声波检测电路。试验证明其具有很高的灵敏度和较强的抗干扰才干。恰当改动C4的巨细,可改动承受电路的灵敏度和抗干扰才干。

超声波接纳电路图

五、体系程序规划

超声波测距软件规划主要由主程序,超声波发射子程序,超声波承受中止程序及显现子程序组成。下面临超声波测距器的算法,主程序,超声波发射子程序和超声波承受中止程序逐个介绍。

1.超声波测距器的算法规划

下图暗示了超声波测距的原理,即超声波产生器T在某一时刻宣布的一个超声波信号,当超声波遇到被测物体后反射回来,就被超声波接纳器R所承受。这样只需核算出产生信号到承受回来信号所用的时刻,就可算出超声波产生器与反射物体的间隔。

间隔核算公式:d=s/2=(c*t)/2

*d为被测物与测距器的间隔,s为声波的来回旅程,c为声速,t为声波来回所用的时刻

声速c与温度有关,如温度改变不大,则能够为声速是根本不变的。假如测距精度要求很高,则应经过温度补偿的办法加以校对。声速确认后,只需测得超声波往复时刻,即可求得间隔。在体系参加温度传感器来监测环境温度,可进行温度被偿。这儿能够用DS18B20丈量环境温度,依据不同的环境温度确认一声速进步测距的安稳性。为了增强体系的可靠性,应在软硬件上选用抗干扰办法。

不同温度下的超声波声速表

温度/

-30

-20

-10

0

10

20

30

100

声速c(m/s)

313

319

325

323

338

344

349

386

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.0端口发送2个左右的超声波信号频率约40KHz的方波,脉冲宽度为12us左右,一起把计数器T0翻开进行计时。超声波测距器主程序运用外中止0检测回来超声波信号,一旦接纳到回来超声波信号(INT0引脚呈现低电平),当即进入中止程序。进入该中止后就当即封闭计时器T0中止计时,并将测距成功标志字赋值1。假如当计时器溢出时还未检测到超声波回来信号,则守时器T0溢出中止将外中止0封闭,并将测距成功标志字赋值2以表明此次测距不成功。

六.软硬件调试及功能

超声波测距仪的制造和调试,其间超声波发射和接纳选用Φ15的超声波换能器TCT40-10F1(T发射)和TCT40-10S1(R接纳),中心频率为40kHz,装置时应坚持两换能器中心轴线平行并相距4~8cm,其他元件无特殊要求。若能将超声波接纳电路用金属壳屏蔽起来,则可进步抗干扰才干。依据丈量规模要求不同,可恰当调整与接纳换能器并接的滤波%&&&&&%C4的巨细,以取得适宜的接纳灵敏度和抗干扰才干。

硬件电路制造完结并调试好后,便可将程序编译好下载到单片机试运行。依据实际情况能够修正超声波产生子程序每次发送的脉冲宽度和两次丈量的间隔时刻,以习惯不同间隔的丈量需求。依据所规划的电路参数和程序,测距仪能测的规模为0.07~5.5m,测距仪最大差错不超越1cm。体系调试完后应对丈量差错和重复一致性进行屡次试验剖析,不断优化体系使其到达实际运用的丈量要求。

后续作业需试验后才干验证

依据参阅电路和集成的电路器材测距规模有限10m以内为好。

程序清单

以下是用汇编语言编写的超声波测距操控源程序:

选用AT89S51 12MHz晶振

显现缓冲单元在40H~43H,运用内存44H、45H、46H用于核算间隔

20H用于标志

VOUT EQU P1.0 ;脉冲输出端口

*中止进口程序*

ORG 0000H

LJMP START

ORG 0003H

LJMP PINT0

ORG 000BH

LJMP INTT0

ORG 0013H

RETI

ORG 001BH

LJMP INTT1

ORG 0023H

RETI

ORG 002BH

RETI

*主程序*

START: MOV SP, #4FH

MOV R0, #40H ;40~43H为显现数据寄存单元(40为最高位)

MOV R7,#0BH

CLEARDISP:MOV @R0, #00H

INC R0

DJNZ R7, CLEARDISP

MOV 20H, #00H

MOV TMOD, #21H ;T1为8位主动重装形式,T0为16位守时器

MOV TH0, #00H ;65ms初值

MOV TL0, #00H ;40KHz初值

MOV TH1, #0F2H

MOV TL1, #0F2H

MOV P0, #0FFH

MOV P1, #0FFH

MOV P2, #0FFH

MOV P3, #0FFH

MOV R4, #04H ;超声波脉冲个数操控(为赋值的一半)

SETB PX0

SETB ET0

STEB EA

CLR 00H

SETB TR0 ;敞开测距守时器

START1: LCALL DISPLAY

JNB 00H, START1 ;收到反射信号时标志位为1

CLR EA

LCALL WORK ;核算间隔子程序

SETB EA

CLR 00H

SETB TR0 ;从头敞开测距守时器

MOV R2, #64H ; 丈量间隔操控(约4*100=400ms)

LOOP: LCALL DISPLAY

DJNZ R2, LOOP

SJMP START 1

*中止程序*

;T0中止,65ms中止一次

INTT0: CLR EA

CLR TR0

MOV TH0, #00H

MOV TL0, #00H

SETB ET1

SETB EA

SETB TR0 ;发动计时器T0,用以核算超声波来回时刻

SETB TR1 ;敞开发超声波用守时器T1

OUT: RETI

;T1中止,发超声波用

INTT1: CPL VOUT

DJNZ R4,RETIOUT

CLR TR1 ;超声波发送结束,关T1

CLR ET1

MOV R4,#04H

SETB EX0 ;敞开接纳回波中止

RETIOUT: RETI

;外中止0,收到回波时进入

PINT0: CLR TR0 ;关计数器

CLR TR1

CLR ET1

CLR EA

CLR EX0

MOV 44H, TL0 ;将计数值移入处理单元

MOV 45H, TH0

SETB 00H ;接纳成功标志

RETI

*延时程序*

DL1MS: MOV R6, #14H

DL1: MOV R7, #19H

DL2: DJNZ R6, DL2

DJNZ R6, DL1

RET

*显现程序*

;40H为最高位,43H为最低位,先扫描高位

DISPLAY: MOV R1, #40H;G

MOV R5,#0F7H;G

PLAY: MOV A, R5

MOV P0, #0FFH

MOV P2, A

MOV A, @R1

MOV DPTR, #TAB

MOVC A, @A+DPTR

MOV P0, A

LCALL DLIMS

INC R1

MOV A, R5

JNB ACC.0, ENDOUT;G

RR A

MOV R5, A

AJMP PLAY

ENDOUT; MOV P2, #0FFH

MOV P0, #0FFH

RET

TAB; 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/1000cm) 近似

WORK: PUSH ACC

PUSH PSW

PUSH B

MOV PSW, #18H

MOV R3, 45H

MOV R2, 44H

MOV R1, #00D

MOV R0, #17D

LCALL MUL2BY2

MOV R3, #03H

MOV R2, #0E8H

LCALL DIV4BY2

LCALL DIV4BY2

MOV 40H, R4

MOV A, 40H

JNZ JJ0

MOV 40H, #0AH ;最高位为0,不点亮

JJ0: MOV A R0

MOV R4, A

MOV A R1

MOV R5 A

MOV R3, #00D

MOV R2, #100D

LCALL DIV4BY2

MOV 41H, R4

MOV A, 41H

JNZ JJ1

MOV A, 40H ;此高位为0,先看最高位是否为不亮

SUBB A, #0AH

JNZ JJ1

MOV 41H, #0AH ; 最高位不亮,次高位也不亮

JJ1: MOV A, R0

MOV R4, A

MOV A, R1

MOV R5, A

MOV R3, #00D

MOV R2, #10D

LCALL DIV4BY2

MOV 42H, R4

MOV A 42H

JNZ JJ2

MOV A, 41H ;次高位为0,先看次高位是否为不亮

SUBB A, #0AH

JNZ JJ2

MOV 42H, #0AH ;次高位不亮,次高位也不亮

JJ2: MOV 43H, R0

POP B

POP PSW

POP ACC

RET

*两字节无符号数乘法程序

MUL2BY2: CLR A

MOV R7, A

MOV R6, A

MOV R5, A

MOV R4, A

MOV 46H, #10H

MULLOOP1: CLR C

MOV A, R4

RLC A

MOV R4, A

MOV A, R5

RLC A

MOV R5, A

MOV A, R6

RLC A

MOV R6, A

MOV A, R7

RLC A

MOV R7, A

MOV A, R0

RLC A

MOV R0, A

MOV A, R1

RLC A

MOV R1, A

JNC MULLOOP2

MOV A, R4

ADD A, R2

MOV R4, A

MOV A, R5

ADDC A, R3

MOV R5, A

MOV A, R6

ADDC A, #00H

MOV R6, A

MOV A, R7

ADDC A, #00H

MOV R7, A

MULLOOP2: DJNZ 46H, MULLOOP1

RET

*四字节/两字节无符号数除法程序*

DIV4BY2: MOV 46H, #20H

MOV R0, #00H

MOV R1, #00H

DIVLOOP1: MOV A, R4

RLC A

MOV R4, A

MOV A, R5

RLC A

MOV R5, A

MOV A, R6

RLC A

MOV R6, A

MOV A, R7

RLC A

MOV R7, A

MOV A, R0

RLC A

MOV R0, A

MOV A, R1

RLC A

MOV R1, A

CLR C

MOV A, R0

SUBB A, R2

MOV B, A

MOV A, R1

SUBB A, R3

JC DIVLOOP2

MOV R0, B

MOV R1, A

DIVLOOP2: CPL C

DJNZ 46H, DIVLOOP1

MOV A, R4

RLC A

MOV R4, A

MOV A, R5

RLC A

MOV R5, A

MOV A, R6

RLC A

MOV R6, A

MOV A, R7

RLC A

MOV R7, A

RET

;

END

附C51程序

#include

#define uchar unsigned char

#define uint unsigned int

#define ulong unsigned long

extern void cs_t(void);

extern void delay(uint);

extern void display(uchar*);

//data uchar display(uchar*);

data uchar testok;

void main (void)

{

data uchar dispram[5];

data uint i;

data 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

?PR?CS_T?CS_T SEGMENT CODE

PUBLIC CS_T

RSEG ?PR?CS_T?CS_T

CS_T: PUSH ACC

MOV TH0, #00H

MOV TL0, #00H

MOV A, #4D

SETB TR0

CS_T1: CPL p1.0

NOP

NOP

NOP

NOP

NOP

NOP

NOP

NOP

NOP

NOP

DJNZ ACC,CS_T1

POP ACC

RET

;

END

name delay

?pr?_delay?delay segment code

public _delay

rseg ?pr?_delay?delay

_delay: push acc

mov a,r7

jz dela1

inc r6

dela1: mov r5,#50d

djnz r5, $

djnz r7,dela1

djnz r6,dela1

pop acc

ret

end

NAME DISPLAY

?PR?_DISPLAY?display segment code

?co?_DISPLAY?display segment data

EXTRN CODE (_DELAY)

PUBL%&&&&&% _DISPLAY

RSEG ?CO?_DISPLAY?DISPLAY

?_display?byte:

dispbit: ds 1

dispnum: ds 1

rseg ?pr?_display?display

_display: push acc

push dph

push dpl

push psw

inc dispnum

mov a,dispnum

cjne a,#4d,disp1

DISP1: JC DISP2

MOV DISPNUM,#00H

MOV DISPBIT,#0FEH

DISP2: MOV A,R1

ADD A,DISPNUM

MOV R0,A

MOV A,@R0

MOV DPTR,#DISPTABLE

MOVC A,@A+DPTR

MOV P0,A

MOV A,DISPNUM

CJNE A,#2D,DISP3

CLR P0.7

DISP3: MOV P2,DISPBIT

MOV R5,#00H

MOV R7,#0AH

LCALL _DELAY

MOV P0,#0FFH

MOV P2,#0FFH

MOV A,DISPBIT

RL A

MOV DISPBIT,A

POP PSW

POP DPL

POP DPH

POP ACC

RET

DISPTABLE: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,83H,0C6H,0A1H,86H,8EH,0BFH,0FFH

END

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qianrushi/ruanjian/266360.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部