超声波测距报警器之欧阳术创编Word文档格式.docx

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

超声波测距报警器之欧阳术创编Word文档格式.docx

《超声波测距报警器之欧阳术创编Word文档格式.docx》由会员分享,可在线阅读,更多相关《超声波测距报警器之欧阳术创编Word文档格式.docx(10页珍藏版)》请在冰豆网上搜索。

超声波测距报警器之欧阳术创编Word文档格式.docx

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<

reg52.H>

//器件配置文件

intrins.h>

//传感器接口

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>

b--)

for(a=130;

a>

a--);

}

//按键扫描

voidKey_()

//+

if(S1==0)

delay();

//延时去抖

while(S1==0)

P1=P1|0x0f;

BJS++;

//报警值加

if(BJS>

=151)//最大151

BJS=0;

//-

elseif(S2==0)

while(S2==0)

BJS--;

//报警值减

if(BJS<

=1)//最小1

BJS=150;

//功能

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

while(S3==0)

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时清零

//报警显示

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

elseif(posit==3)

P0=0x76;

//显示字母

P0=discode[disbuff_BJ[posit]];

=4)

//计算

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;

//距离小于报警距

if(S<

=BJS)

//报警

else//大于

Feng=1;

//关闭报警

disbuff[0]=S%1000/100;

//将距离数据拆成单个位赋值

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

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

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_();

TX=0;

}

//主函数

voidmain(void)

{

TMOD=0x11;

//设T0为方式1

//2MS定时

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