超声波测距课程设计.docx
- 文档编号:4836430
- 上传时间:2022-12-10
- 格式:DOCX
- 页数:20
- 大小:353.61KB
超声波测距课程设计.docx
《超声波测距课程设计.docx》由会员分享,可在线阅读,更多相关《超声波测距课程设计.docx(20页珍藏版)》请在冰豆网上搜索。
超声波测距课程设计
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
}
}
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 超声波 测距 课程设计