超声波测距课程设计.docx

上传人:b****4 文档编号:4836430 上传时间:2022-12-10 格式:DOCX 页数:20 大小:353.61KB
下载 相关 举报
超声波测距课程设计.docx_第1页
第1页 / 共20页
超声波测距课程设计.docx_第2页
第2页 / 共20页
超声波测距课程设计.docx_第3页
第3页 / 共20页
超声波测距课程设计.docx_第4页
第4页 / 共20页
超声波测距课程设计.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

超声波测距课程设计.docx

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

超声波测距课程设计.docx

超声波测距课程设计

1.前言

超声波测距主要应用于倒车提醒、建筑工地、工业现场等的距离测量,虽然目前的测距量程上能达到百米,但测量的精度往往只能达到厘米数量级。

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

由此可见,超声波测距原理与雷达原理是一样的。

测距的公式表示为:

L=C×T。

本文基于51单片机和HC-SR04超声波传感器设计出了一套测量和现实距离系统,运用超声波测距系统原理,将采集到的距离信息通过1602液晶显示,并设置有声光报警功能,当测量距离小于设定的门限值时,单片机会驱动无源蜂鸣器和LED进行报警,单片机会根据距离改变驱动方式,距离越近,蜂鸣器发声频率会越高,LED也会越亮。

 

2.总体方案设计

2.1电源模块选择

方案一:

采用两节五号的干电池作为主控芯片的供电电源。

此方案简单易行,但是此系统是处于长期工作状态对电量的消耗比较大。

方案二:

采用汽车自带的汽车电瓶12V电源降压后供电。

此方案较好的利用汽车自身能源,避免单独电源给防撞系统供电,可使系统长期安全不掉电工作。

方案三:

采用集成稳压芯片7805,输出稳定的5V对整个系统供电。

确定方案:

综合考虑成本和系统的稳定性,决定选择方案三的供电方法。

2.2显示模块选择

方案一:

LCD1602液晶也叫LCD1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。

它由若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此所以它不能很好地显示图形。

1602LCD是指显示的内容为16X2,即可以显示两行,每行16个字符液晶模块(显示字符和数字)。

方案二:

LCD12864液晶,能显示汉字,字符,数字等,但是体积较为庞大,所占空间较大。

方案三:

诺基亚5110液晶,该模块具有以下特点:

 

84x48 的点阵LCD,可以显示4 行汉字,采用串行接口与主处理器进行通信,接口信号线数量大幅度减少,包括电源和地在内的信号线仅有9 条。

支持多种串行通信协议(如AVR 单片机的SPI、MCU51的串口模式0等),传输速率高达4Mbps,可全速写入显示数据,无等待时间。

方案四:

数码管,显示较为稳定,抗干扰较强,但是显示能力单一,显示内容会受到一定限制。

确定方案:

为了平衡作品体积和显示功能需求之间的矛盾,故选择LCD1602液晶作为显示模块。

2.3报警模块选择

方案一:

ISD4004,功能强大,能自如的录音和放音,且录放音时间持续很长,储存能力较好,还能进行短时间音乐的播放。

但是炒作较为复杂,同时价格也较为昂贵。

方案二:

ISD1760,功能较为强大,能建议的进行录音和放音,能持续一段时间的录放音,但时间不长。

操作复杂性不高,价格适中。

方案三:

采用无源蜂鸣器进行报警,利用单片机发出频率可变的方波,可以驱动蜂鸣器发出频率不同的声音,达到报警的目的,并且声音频率还可以和测量距离相结合,蜂鸣器价格较为便宜,安装也较为方便。

确定方案:

从实际需求的角度出发,摒弃一味追求难度的不良思维,鉴于本设计对放音时长的需求不大,故确定选择无源蜂鸣器进行报警,结合LED进行光信号报警,单片机发出占空比不同的PWM波,可以驱动LED发出不同的亮度,结合测量距离,反馈出不同的光信号报警效果。

2.4测距模块选择

方案一:

光栅传感器模块:

接触型测量,距离近,精度非常高,能进行较为微小的距离测量主要用于高精度切割等;

方案二:

超声波传感器模块:

非接触型测量,距离一般,最多几十米,精度厘米级,操作简单,价格较为低廉,但对被测物体面积有要求。

方案三:

红外测距传感器模块:

非接触型测量,非可见光,距离短,精度不高,同时易受干扰,红外感应器使用较多。

方案四:

激光测距传感器模块:

非接触型测量,可见光,距离全能,有远也有近,精度有MM级、也有厘米级等,但造价比较昂贵,应用多为高精度高性能领域。

确定方案:

从价格和实际的实用性方面和应用领域等各个方面综合考虑,决定选择超声波传感器模块。

2.5主控芯片选择

方案一:

STC89C52系列单片机,此系列单片机比较常用、价格便宜、操作简单、独立的I/O口数量较多,方便购买。

但计算能力一般。

方案二:

ARM系列单片机,ARM(Advanced RISC Machines)是微处理器行业的一家知名企业,设计了大量高性能、廉价、耗能低的RISC处理器、相关技术及软 件。

ARM架构是面向低预算市场设计的第一款RISC微处理器,基本是32位单片机的行业标准,它提供一系列内核、体系扩展、微处理器和系统芯片方案,四 个功能模块可供生产厂商根据不同用户的要求来配置生产。

方案三:

FPGA系列芯片,FPGA采用了逻辑单元阵列LCA(Logic Cell Array)这样一个 新概念,内部包括可配置逻辑模块CLB(Configurable Logic Block)、输出输入模块IOB (Input Output Block)和内部连线(Interconnect)三个部分。

用户可对FPGA内部的逻辑模块和I/O模块重新配置,以实现用户的逻辑

综合考虑,51单片机虽然计算能力较弱,但是已经完全能够满足温度测量显示的要求,ARM系列单片机价格较贵,FPGA系列芯片价格也比较昂贵,并且不能进行浮点预算,综合考虑决定选择方案一。

2.6系统总方框图

超声波测距系统设计系统框图如图1所示:

图1

3.各模块电路设计

3.1HC-SR04超声波模块设计

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

气接线简单,只需要和单片机连接发射和接收管脚就能进行使用,模块电路如图2.

图2

3.2单片机最小系统模块设计

本设计采用了51单片机作为主控芯片,该单片机最小系统包含几个单元:

复位单元,晶振单元,上拉电阻单元等,具体电路如图3。

图3

3.3电源模块设计

本系统使用的是7805线性稳压芯片作为电源模块,该模块输出电压稳定,结构简单可靠,具体电路如图4所示。

图4

3.4声光报警模块设计

本设计采用无源蜂鸣器和LED进行声光报警。

无源蜂鸣器是蜂鸣器的一种,区别于有源蜂鸣器,无源蜂鸣器是内部不带振荡源的蜂鸣器,是一体化结构的电子讯响器,在电路中的图形符号位H或者HA。

无源蜂鸣器是靠压电效应的原理来发声的,压电材料,一般常见的是各种压电陶瓷.这种材料的特别之处在于,当电压作用于压电材料时,就会随电压和频率的变化产生机械变形.另一方面,当振动压电陶瓷时,则会产生电荷.就是说这种材料能把机械变形和电荷相互转化,压电式蜂鸣器里面的起振片,就是一种压电陶瓷.如上所述,要让它振动,除了压电陶瓷本身,还需要适当大小和频率变化的电压作用于压电陶瓷.压电式(有源)蜂鸣器内部带有多谐振荡器,可以产生1.5—2.5kHZ的电压信号.由此压电式蜂鸣器才能发声。

因此,只要单片机产生不同频率的方波来驱动无源蜂鸣器,就能实现不同频率的发声效果,而如果单片机产生不同占空比的PWM波驱动LED,LED就会发出不同强度的光,结合超声波测量的距离,距离越近时蜂鸣器发生频率越高,LED也越亮,实现不同的声光报警效果。

蜂鸣器驱动电路如图5,LED驱动电路如图6。

图5

图6

3.5液晶显示模块设计

本设计采用的是LCD1602液晶显示,该模块接线方便,可以直接连接单片机进行驱动,模块电路如图7。

图7

4.系统软件设计

4.1keiluvision4介绍

KeilC51是美国KeilSoftware公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。

Keil提供了包括C编译器、宏汇编、链接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(μVision)将这些部分组合在一起。

运行Keil软件需要WIN98、NT、WIN2000、WINXP等操作系统。

Keil公司是一家业界领先的微控制器(MCU)软件开发工具的独立供应商。

Keil公司由两家私人公司联合运营,分别是德国慕尼黑的KeilElektronikGmbH和美国德克萨斯的KeilSoftwareInc。

Keil公司制造和销售种类广泛的开发工具,包括ANSIC编译器、宏汇编程序、调试器、连接器、库管理器、固件和实时操作系统核心(real-timekernel)。

有超过10万名微控制器开发人员在使用这种得到业界认可的解决方案。

其KeilC51编译器自1988年引入市场以来成为事实上的行业标准,并支持超过500种8051变种。

4.2程序流程图

5.设计总结

本设计基于51单片机和超声波测距模块,将测量的距离通过LCD1602进行显示,并设置了门限值5CM,当测量距离大于5厘米时,液晶正常显示,当距离小于5厘米时,液晶显示报警信号,与此同时,蜂鸣器和LED进行声光报警,距离越近,蜂鸣器报警频率就会越高,LED也会越亮,当测量距离大于5里米时才会退出报警模式。

本设计综合了测量显示和报警模块,形成了一个完整的测量系统,并巧妙运用了无源蜂鸣器和LED的特点,使用单片机发出不同频率和占空比的脉冲,充分利用了51单片机的内部资源,科学地形成了一个整体,具有较强的可行性和实用性。

6.参考文献

[1]杨天怡主编,微型计算机控制技术,重庆:

重庆大学出版社;

[2]涂时亮编,单片微机控制技术,上海:

复旦大学出版社;

[3]黄胜军编,微机控制应用实验与实例,北京:

清华大学出版社;

[4]陈理壁.步进电机及其应用[M],上海:

上海科学技术出版社;

[5]刘国荣.单片微型计算机技术,北京:

机械工业出版社;

[6]王福瑞编,单片微机测控系统设计大全,北京:

北京航空航天大学出版社;

[7]潘新民编,单片微型计算机实用系统设计,北京:

人民邮电出版社;

[8]李伯成编,IBM-PC微机应用系统设计,西安:

西安电子科技大学;

[9]微机控制技术及其应用方面的教材、期刊、杂志。

 

附录一:

系统总图

附录二:

相关程序

/*============================================

//HC-SRO4超声波测距模块DEMO程序

============================================*/

#include//器件配置文件

#include

#defineRXP2_7

#defineTXP2_6

#defineLCM_RWP3_4//定义LCD引脚

#defineLCM_RSP3_3

#defineLCM_EP3_5

#defineLCM_DataP1

#defineKey_DataP2_0//定义Keyboard引脚

#defineKey_CLKP3_2

#defineBusy0x80//用于检测LCM状态字中的Busy标识

voidLCMInit(void);

voidDisplayOneChar(unsignedcharX,unsignedcharY,unsignedcharDData);

voidDisplayListChar(unsignedcharX,unsignedcharY,unsignedcharcode*DData);

voidDelay5Ms(void);

voidDelay400Ms(void);

voidDecode(unsignedcharScanCode);

voidWriteDataLCM(unsignedcharWDLCM);

voidWriteCommandLCM(unsignedcharWCLCM,BuysC);

unsignedcharReadDataLCM(void);

unsignedcharReadStatusLCM(void);

unsignedcharcodemcustudio[]={""};

unsignedcharcodeemail[]={"fhwxaoo@"};

unsignedcharcodeCls[]={""};

unsignedcharcodeASCII[15]={'0','1','2','3','4','5','6','7','8','9','.','-','M'};

staticunsignedcharDisNum=0;//显示用指针

unsignedinttime=0;

unsignedlongS=0;

bitflag=0;

unsignedchardisbuff[4]={0,0,0,0,};

//写数据

voidWriteDataLCM(unsignedcharWDLCM)

{

ReadStatusLCM();//检测忙

LCM_Data=WDLCM;

LCM_RS=1;

LCM_RW=0;

LCM_E=0;//若晶振速度太高可以在这后加小的延时

LCM_E=0;//延时

LCM_E=1;

}

//写指令

voidWriteCommandLCM(unsignedcharWCLCM,BuysC)//BuysC为0时忽略忙检测

{

if(BuysC)ReadStatusLCM();//根据需要检测忙

LCM_Data=WCLCM;

LCM_RS=0;

LCM_RW=0;

LCM_E=0;

LCM_E=0;

LCM_E=1;

}

//读数据

unsignedcharReadDataLCM(void)

{

LCM_RS=1;

LCM_RW=1;

LCM_E=0;

LCM_E=0;

LCM_E=1;

return(LCM_Data);

}

//读状态

unsignedcharReadStatusLCM(void)

{

LCM_Data=0xFF;

LCM_RS=0;

LCM_RW=1;

LCM_E=0;

LCM_E=0;

LCM_E=1;

while(LCM_Data&Busy);//检测忙信号

return(LCM_Data);

}

voidLCMInit(void)//LCM初始化

{

LCM_Data=0;

WriteCommandLCM(0x38,0);//三次显示模式设置,不检测忙信号

Delay5Ms();

WriteCommandLCM(0x38,0);

Delay5Ms();

WriteCommandLCM(0x38,0);

Delay5Ms();

WriteCommandLCM(0x38,1);//显示模式设置,开始要求每次检测忙信号

WriteCommandLCM(0x08,1);//关闭显示

WriteCommandLCM(0x01,1);//显示清屏

WriteCommandLCM(0x06,1);//显示光标移动设置

WriteCommandLCM(0x0F,1);//显示开及光标设置

}

//按指定位置显示一个字符

voidDisplayOneChar(unsignedcharX,unsignedcharY,unsignedcharDData)

{

Y&=0x1;

X&=0xF;//限制X不能大于15,Y不能大于1

if(Y)X|=0x40;//当要显示第二行时地址码+0x40;

X|=0x80;//算出指令码

WriteCommandLCM(X,1);//发命令字

WriteDataLCM(DData);//发数据

}

//按指定位置显示一串字符

voidDisplayListChar(unsignedcharX,unsignedcharY,unsignedcharcode*DData)

{

unsignedcharListLength;

ListLength=0;

Y&=0x1;

X&=0xF;//限制X不能大于15,Y不能大于1

while(DData[ListLength]>0x19)//若到达字串尾则退出

{

if(X<=0xF)//X坐标应小于0xF

{

DisplayOneChar(X,Y,DData[ListLength]);//显示单个字符

ListLength++;

X++;

}

}

}

//5ms延时

voidDelay5Ms(void)

{

unsignedintTempCyc=5552;

while(TempCyc--);

}

//400ms延时

voidDelay400Ms(void)

{

unsignedcharTempCycA=5;

unsignedintTempCycB;

while(TempCycA--)

{

TempCycB=7269;

while(TempCycB--);

};

}

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

voidConut(void)

{

time=TH0*256+TL0;

TH0=0;

TL0=0;

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

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

{

flag=0;

DisplayOneChar(0,1,ASCII[11]);

DisplayOneChar(1,1,ASCII[10]);//显示点

DisplayOneChar(2,1,ASCII[11]);

DisplayOneChar(3,1,ASCII[11]);

DisplayOneChar(4,1,ASCII[12]);//显示M

}

else

{

disbuff[0]=S%1000/100;

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

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

DisplayOneChar(0,1,ASCII[disbuff[0]]);

DisplayOneChar(1,1,ASCII[10]);//显示点

DisplayOneChar(2,1,ASCII[disbuff[1]]);

DisplayOneChar(3,1,ASCII[disbuff[2]]);

DisplayOneChar(4,1,ASCII[12]);//显示M

}

}

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

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

{

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

}

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

voidStartModule()//启动模块

{

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

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

TX=0;

}

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

voiddelayms(unsignedintms)

{

unsignedchari=100,j;

for(;ms;ms--)

{

while(--i)

{

j=10;

while(--j);

}

}

}

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

voidmain(void)

{

unsignedcharTempCyc;

Delay400Ms();//启动等待,等LCM讲入工作状态

LCMInit();//LCM初始化

Delay5Ms();//延时片刻(可不要)

DisplayListChar(0,0,mcustudio);

DisplayListChar(0,1,email);

ReadDataLCM();//测试用句无意义

for(TempCyc=0;TempCyc<10;TempCyc++)

Delay400Ms();//延时

DisplayListChar(0,1,Cls);

while

(1)

{

TMOD=0x01;//设T0为方式1,GATE=1;

TH0=0;

TL0=0;

ET0=1;//允许T0中断

EA=1;//开启总中断

while

(1)

{

StartModule();

//DisplayOneChar(0,1,ASCII[0]);

while(!

RX);//当RX为零时等待

TR0=1;//开启计数

while(RX);//当RX为1计数并等待

TR0=0;//关闭计数

Conut();//计算

delayms(80);//80MS

}

}

}

 

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

当前位置:首页 > 求职职场 > 简历

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

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