超声波测距报警器.docx

上传人:b****2 文档编号:1676190 上传时间:2022-10-23 格式:DOCX 页数:21 大小:18.09KB
下载 相关 举报
超声波测距报警器.docx_第1页
第1页 / 共21页
超声波测距报警器.docx_第2页
第2页 / 共21页
超声波测距报警器.docx_第3页
第3页 / 共21页
超声波测距报警器.docx_第4页
第4页 / 共21页
超声波测距报警器.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

超声波测距报警器.docx

《超声波测距报警器.docx》由会员分享,可在线阅读,更多相关《超声波测距报警器.docx(21页珍藏版)》请在冰豆网上搜索。

超声波测距报警器.docx

超声波测距报警器

 

超声波测距报警器

 

功能介绍:

 

本设计可用于测距,并附带报警功能,利用超声波检测往往比较迅速、方便、计算简单、易于做到实时控制,并且在测量精度方面能达到工业实用的要求,测量围为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

 

//传感器接口

 

sbitRX=P3^2;

 

sbitTX=P3^3;

 

//按键声明

 

sbitS1=P1^4;

 

sbitS2=P1^5;

 

sbitS3=P1^6;

 

//蜂鸣器

 

sbitFeng=P2^0;

 

//变量声明

 

unsignedinttime=0;

 

unsignedinttimer=0;

 

unsignedcharposit=0;

 

unsignedlongS=0;

 

unsignedlongBJS=50;//报警距离80CM

 

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

 

charMode=0;

 

bitflag=0;

 

unsignedcharconstdiscode[]

={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0xff/*-*/};//数码管显示码

0123456789-和不显示

 

unsignedcharconstpositon[4]={0xfd,0xfb,0xf7,0xfe};//位选

 

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

 

unsignedchardisbuff_BJ[4]={0,0,0,0};//报警信息

 

//延时100ms(不精确)

 

voiddelay(void)

 

{

 

unsignedchara,b,c;

 

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

 

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

 

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

 

}

 

//按键扫描

 

voidKey_()

 

{

 

//+

 

if(S1==0)

 

{

 

delay();

 

delay();//延时去抖

 

while(S1==0)

 

{

 

P1=P1|0x0f;

 

}

 

BJS++;//报警值加

 

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

 

{

 

BJS=0;

 

}

 

}

 

//-

 

elseif(S2==0)

 

{

 

delay();

 

delay();

 

while(S2==0)

 

{

 

P1=P1|0x0f;

 

}

 

BJS--;//报警值减

 

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

 

{

 

BJS=150;

 

}

 

}

 

//功能

 

elseif(S3==0)//设置键

 

{

 

delay();

 

delay();

 

while(S3==0)

 

{

 

P1=P1|0x0f;

 

}

 

Mode++;//模式加

 

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

 

{

 

Mode=0;

 

}

 

}

 

}

 

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

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

 

//扫描数码管

 

voidDisplay(void)

 

{

 

//正常显示

 

if(Mode==0)

 

{

 

P0=0x00;//关闭显示

 

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

 

{

 

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

 

}

 

else

 

{

 

P0=discode[disbuff[posit]];

 

}

 

P1=positon[posit];

 

if(++posit>=3)//每进一次显示函数,变量加1

 

posit=0;//加到3时清零

 

}

 

//报警显示

 

else

 

{

 

P0=0x00;

 

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

 

{

 

P0=(discode[disbuff_BJ[posit]])|0x80;

 

}

 

elseif(posit==3)

 

{

 

P0=0x76;//显示字母

 

}

 

else

 

{

 

P0=discode[disbuff_BJ[posit]];

 

}

 

P1=positon[posit];

 

if(++posit>=4)

 

posit=0;

 

}

 

}

 

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

 

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

 

//计算

 

voidConut(void)

 

{

 

time=TH0*256+TL0;//读出T0的计时数值

 

TH0=0;

 

TL0=0;//清空计时器

 

S=(time*1.7)/100;//算出来是CM

 

//声音的速度是340m/s,时间的单位是us,计算到秒需要将时间数据/1000000,

 

//长度=速度*时间,340*time/1000000,长度数据单位是m转换成cm需要乘以100得到340*time/10000,

 

//小数点都向左移两位得到3.4*time/100,因为超声波是往返了,所以再除以2,得到距

离数据(time*1.7)/100

 

if(Mode==0)//非设置状态时

 

{

 

if((S>=700)||flag==1)//超出测量围显示“-”

 

{

 

Feng=0;//蜂鸣器报警

 

flag=0;

 

disbuff[0]=10;//“-”

 

disbuff[1]=10;//“-”

 

disbuff[2]=10;//“-”

 

}

 

else

 

{

 

//距离小于报警距

 

if(S<=BJS)

 

{

 

Feng=0;//报警

 

}

 

else//大于

 

{

 

Feng=1;//关闭报警

 

}

 

disbuff[0]=S%1000/100;//将距离数据拆成单个位赋值

 

disbuff[1]=S%1000%100/10;

 

disbuff[2]=S%1000%10%10;

 

}

 

}

 

else

 

{

 

Feng=1;

 

disbuff_BJ[0]=BJS%1000/100;

 

disbuff_BJ[1]=BJS%1000%100/10;

 

disbuff_BJ[2]=BJS%1000%10%10;

 

}

 

}

 

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

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

 

//定时器0

 

voidzd0()interrupt1//T0中断用来计数器溢出,超过测距围

 

{

 

flag=1;//中断溢出标志

 

}

 

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

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

 

//定时器1

 

voidzd3()interrupt3//T1中断用来扫描数码管和计800MS启动模块

 

{

 

TH1=0xf8;

 

TL1=0x30;//定时2ms

 

Key_();//扫描按键

 

Display();//扫描显示

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 人力资源管理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1