超声波测距设计方案

  • 格式:docx
  • 大小:506.19 KB
  • 文档页数:13

基于单片机的超声波测距仪设计

1目的

1.1选择超声波测距的原因

近十年来,随着集成电路技术的迅速发展,超声波测距得到了应用。与许多其他测距方法相比,超声波测距具有突出的优势。相对于智能汽车、红外感应太阳能路灯控制系统、液晶显示器,在应用对现代测距有新要求的现代设备时,我觉得我们的优势非常明显。

智能车工作起来太笨重,虽然可用性最高,但是短时间内很难完成这么高质量的任务。

红外感应太阳能路灯控制系统虽然可以完成,但未来发展空间不大,现在几乎普及。

液晶显示器虽然前卫,但发展空间不大。

2本设计的主要研究能力

2.1超声波测距原理

超声波测距是通过不断检测超声波发射后障碍物反射的回波,来测量发射和接收回波的时间差T,进而计算出距离。

2ctS (1-1)

公式(1-1)中的c是超声波在空气中的传播速度。

2.2设计的主要能力

单片机控制超声波模块的发射和检测,其系统原理框图如图1所示。

图1超声波测距系统框图

通过P1.0发送40KHz方波脉冲信号,回波经被测物体反射后由超声波接收换能器接收。相关处理后,输入单片机的INT0(P3.2)引脚产生中断,计算经过的时间,然后根据公式(1-1)计算距离。

3超声波测距的硬件电路设计

3.1超声波测距系统总体电路设计方案

单片机STC89s52编程产生40KHz的方波脉冲,通过端口P1.0输出,所以你可以在接收端口P3.2(Echo引脚)等待高电平输出。一旦有高电平源,就会通过模块中的放大电路驱动超声波发射探头发射超声波。发射的超声波被障碍物反射回来后,信号被超声波接收头接收。接收电路经过检波放大、积分整形等一系列处理后,接收端口的端口P3.2变为低电平,读取单片机中定时器的值。利用声波的速度和发射脉冲到接收反射脉冲的时间间隔计算障碍物的距离,并通过液晶显示。

该测距装置由超声波模块、单片机和液晶显示电路组成。传感器的输入和发射接收电路组成超声波测距模块,模块的输出和输入与单片机连接,单片机的输出与显示电路的输入连接。时序图如图3-1所示。

图2时序图

超声波测距模块的发射端在T0时刻发射方波,并启动定时器开始计时。当收到回声时,对单片机中断端口产生负跳,单片机响应中断程序,定时器停止计数。通过计算时间差,可以得到超声波在介质中的传播时间t,由此可以计算出距离。

4超声波测距系统电路各模块的设计

4.1超声波发射和接收电路的设计

超声波发射部分

超声波发射部分是使超声波发射换能器TCT40-16T向外界发出40 kHz左右的方波脉冲信号。40 kHz方波脉冲信号由单片机的端口P1.0编程。由于单片机端口输出功率不足,将40 kHz方波脉冲信号分为两路,送入74HC04组成的推挽电路进行功率放大,使发射距离足够远,满足测距要求。最后送到超声波发射换能器TCT40-16T,以声波的形式发射到空气中。发射部分的电路如图2所示。图中输出端的上拉电阻R31和R32一方面可以提高反相器74HC04输出高电平的驱动能力,另一方面可以增加超声换能器的阻尼作用,缩短其自由振荡时间。

4.1.2超声波接收部分

上述TCT40-16T在空中发射,遇到障碍物会返回。超声波接收部分是将反射波(回波)成功接收到超声波接收换能器TCT40-16R,并将其转换为电信号。在电信号被放大、滤波、整形等之后。,这里用的是索尼公司生产的集成芯片CX20106,得到一个负脉冲,送到单片机的P3.2(INT0)引脚,产生一个负脉冲。接收部分的电路如图3所示。

液晶显示部分

本设计的显示部分采用字符型TC1602液晶显示测量的距离值。TC1602显示容量为2行16字。液晶显示器具有功耗低、体积小、显示容量丰富、超薄、重量轻、使用方便等诸多优点。相比数码管,更专业,更美观。使用时,P0可以连接到液晶显示器的数据线上,P2端口与液晶显示器的控制线同相。如图5所示,LCD模拟

图5 LCD PROTRUS模拟

其中,TC1602的第4脚RS是寄存器选择,第5脚RW是读写信号线,第6脚E是使能端。脚7 ~ 14: D0 ~ D7为8位双向数据线。这里需要注意的是,为了布线方便,单片机上的D0 ~ D7是D1 ~ D0接LCD/602,正好相反。所以写软件的时候需要做一些处理,使读数正确。

报警部分

使用蜂鸣器,P1.2输出一定频率的信号,经过三极管9 012放大后再连接到蜂鸣器。报警部分的接线如图6所示。

图6蜂鸣器PROTEUS仿真图

5系统软件设计

软件方面:

软件分为两部分,主程序和中断服务程序,如图4-1所示。主程序完成初始化、超声波发射和接收、距离计算和结果输出。外部中断服务子程序主要完成时间值的读表。图表开始单片机初始化定时器及中断初始化发射超声波开外部中断收到回波?外部中断子程序计算距离输出结果蜂鸣器报警图表 1主程序流程图

5.1程序代码:

#include

#include

#定义uchar无符号字符

#定义uint无符号整数

#定义ulong无符号长整型

sbit触发=p1^0;//发射40KHZ波

sbit回声=p3^2;//中断条目

sbit beep=p1^2;//蜂鸣器端口

sbit RS = p2^4;

sbit rw = p2^5; sbit EP = p2^6;

位succeed _ flag

uint标志,timeH,timeL,时间,距离;

无符号字符代码dis 1[]= { " juli为:" };

无符号字符代码dis 2[]= { " 0123456789 " };

无符号字符代码dis 3[]= { " mm " };

无效延迟(无符号字符毫秒)//LCD延迟子程序

{

无符号字符I;

当(毫秒)

{

for(I = 0;i < 250i++)

{

_ nop _();

_ nop _();

_ nop _();

_ nop _();

}

}

}

Void delay_20us() //延迟为20us

{ uchar bt

for(Bt = 0;bt < 100bt++);

}

Bit lcd_bz() //测试lcd的繁忙状态

{

位结果;

RS = 0;

rw = 1;

EP = 1;

_ nop _();

_ nop _();

_ nop _();

_ nop _();

结果=(位)(P0 & 0x 80);

EP = 0;

返回结果;

}

void lcd _ WCMD(unsigned char cmd)//将指令数据写入LCD子程序

{

while(LCD _ BZ());//确定LCD是否繁忙

RS = 0;

rw = 0;

EP = 0;

_ nop _();

_ nop _();

P0 = cmd

_ nop _();

_ nop _();

_ nop _();

_ nop _();

EP = 1;

_ nop _();

_ nop _();

_ nop _();

_ nop _();

EP = 0;

}

Void lcd_pos(unsigned char pos) //设置显示位置子程序

{

LCD _ wcmd(pos | 0x 80);

}

void lcd _ wdat(unsigned chardat)//将显示数据写入LCD子程序

{

while(LCD _ BZ());//确定LCD是否繁忙

RS = 1;

rw = 0;

EP = 0;

P0 = dat

_ nop _();

_ nop _();

_ nop _();

_ nop _();

EP = 1;

_ nop _();

_ nop _();

_ nop _();

_ nop _();

EP = 0; }

Void lcd_init() //LCD初始化子程序

{

LCD _ wcmd(0x 38);

延迟(1);

LCD _ wcmd(0x0c);

延迟(1);

LCD _ wcmd(0x 06);

延迟(1);

LCD _ wcmd(0x 01);

延迟(1);

}

void main()

{

无符号字符I;

LCD _ init();//初始化LCD

延迟(10);

LCD _ pos(0x 01);//设置显示位置

I = 0;

while(dis1[i]!= '\0')

{

LCD _ wdat(dis 1[I]);//显示字符

i++;

}

哔声= 1;

trig = 0;//首先拉低脉冲输入引脚。

EA = 1;//打开总中断0

TMOD = 0x 10;//定时器1,16位工作模式

while(1)

{

EA = 0;//关闭总中断

trig = 1;//超声波输入端

delay _ 20us();//延迟20us

trig = 0;//产生一个20us的脉冲

while(Echo = = 0);//等待Echo echo引脚变为高电平

succeed _ flag = 0;//清除测量成功标志。

EA = 1;

EX0 = 1;//打开外部中断0

TH1 = 0;//定时器1清零

TL1 = 0;//定时器1清零

TF1 = 0;//计数溢出标志