超声波测距报警器.docx

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

超声波测距报警器.docx

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

超声波测距报警器.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();//扫描显示

timer++;//变量加

if(timer>=400)//400次就是800ms

{

timer=0;

TX=1;//800MS启动一次模块

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

TX=0;

}

}

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

//主函数

voidmain(void)

{

TMOD=0x11;//设T0为方式1

TH0=0;

TL0=0;

TH1=0xf8;//2MS定时

TL1=0x30;

ET0=1;//允许T0中断

ET1=1;//允许T1中断

TR1=1;//开启定时器

EA=1;//开启总中断

while

(1)

{

while(!

RX);//当上次接收完波后,RX引脚是低电平,取反就是1,此while成立,反复判断RX状态。

当RX没有接收到返回波时是高电平,取反就是0,此while不成立,跳出

TR0=1;//开启计数

while(RX);//当RX没有接收到返回波,此while成立,程序停在这里一直判断RX状态。

当RX接收到返回波,RX引脚变为低电平,此while不成立,跳出

TR0=0;//停止计数

Conut();//计算

}

}

 

下图为零件清单图以及成品图

 

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

当前位置:首页 > 考试认证 > 其它考试

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

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