超声波测距报警器

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

超声波测距报警器

功能介绍:

本设计可用于测距,并附带报警功能,利用超声波检测往往比较迅速、方便、计算简单、易于做到实时控制,并且在测量精度方面能达到工业实用的要求,测量范围为0.02m~5.5m,可应用于汽车倒车报警雷达。

工作原理:

超声波发射器向某一方向发射超声波,在发射时刻的同时开始计时,超声波在空气中传播,途中碰到障碍物就立即返回来,超声波接收器收到反射波就立即停止计时。超声波在空气中的传播速度为340m/s,根据计时器记录的时间t,就可以计算出发射点距障碍物的距离(s),即:s=340t/2

超声波测距的原理是利用超声波在空气中的传播速度为已知,测量声波在发射后遇到障碍物反射回来的时间,根据发射和接收的时间差计算出发射点到障碍物的实际距离。

总体系统分析:

本系统采用单片机STC89C52+最小系统+数码管显示模块+数码管驱动模块+HC-SR04超声波传感器+蜂鸣器模块+按键模块。

(1)本设计采用数码管显示测量的距离,74HC573和三极管驱动数码管,使显示更亮。

(2)HC-SR04超声波模块测距,测量范围为0.02m~5.5m。

(3)本设计附带报警装着,报警距离可以采用按键设定

(4)按键说明:三个按键从左往右依次为+键,-键,设置键。(5)本设计采用usb接口供电

硬件设计

HC-SR04 超声波测距模块可提供2cm-400cm 的非接触式距离感测功能,测距精度可达高到3mm;模块包括超声波发射器、接收器与控制电路。

基本工作原理:

(1)采用IO 口TRIG 触发测距,给最少10us 的高电平信呈。(2)模块自动发送8 个40khz 的方波,自动检测是否有信号返回;

(3)有信号返回,通过IO 口ECHO 输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。测试距离=(高电平时间*声速(340M/S))/2

超声波时序图:

以上时序图表明只需要提供一个10uS 以上脉冲触发信号,该模块内部将发出8 个40kHz 周期电平并检测回波。一旦检测到有回波信号则输出回响信号。回响信号的脉冲宽度与所测的距离成正比。由此通过发射信号到收到的回响信号时间间隔可以计算得到距离。公式:uS/58=厘米或者uS/148=英寸;或是:距离=高电平时间*声速(340M/S)/2;建议测量周期为60ms 以上,以防止发射

如右图接线,VCC 供5V电源,GND 为地线,TRIG 触发控制信号

输入,ECHO 回响信号输出等四个接口端。软件分析

电路图如图所示

单片机程序代码:

#include //器件配置文件

#include

//传感器接口

sbit RX = P3^2;

sbit TX = P3^3;

//按键声明

sbit S1 = P1^4;

sbit S2 = P1^5;

sbit S3 = P1^6;

//蜂鸣器

sbit Feng= P2^0;

//变量声明

unsigned int time=0;

unsigned int timer=0;

unsigned char posit=0;

unsigned long S=0;

unsigned long BJS=50;//报警距离80CM

//模式0正常模式1调整

char Mode=0;

bit flag=0;

unsigned char const discode[] ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0xff/*-*/}; //数码管显示码0123456789-和不显示

unsigned char const positon[4]={0xfd,0xfb,0xf7,0xfe}; //位选

unsigned char disbuff[4] ={0,0,0,0}; //数组用于存放距离信息

unsigned char disbuff_BJ[4] ={0,0,0,0};//报警信息

//延时100ms(不精确)

void delay(void)

{

unsigned char a,b,c;

for(c=10;c>0;c--)

for(b=38;b>0;b--)

for(a=130;a>0;a--);

}

//按键扫描

void Key_()

{

//+

if(S1==0)

{

delay();

delay(); //延时去抖

while(S1==0)

{

P1=P1|0x0f;

}

BJS++; //报警值加

if(BJS>=151) //最大151

{

BJS=0;

}

}

//-

else if(S2==0)

{

delay();

delay();

while(S2==0)

{

P1=P1|0x0f;

}

BJS--; //报警值减

if(BJS<=1) //最小1

{

BJS=150;

}

}

//功能

else if(S3==0) //设置键

{

delay();

delay();

while(S3==0)

{

P1=P1|0x0f;

}

Mode++; //模式加

if(Mode>=2) //加到2时清零

{

Mode=0;

}

}

}

/****************************************************************************** ****************************/

//扫描数码管

void Display(void)

{

//正常显示

if(Mode==0)

{

P0=0x00; //关闭显示

if(posit==0)//数码管的小数点

{

P0=(discode[disbuff[posit]])|0x80;//按位或,最高位变为1,显示小数点}

else

{

相关文档
最新文档