基于单片机的超声波测距系统设计.docx
- 文档编号:12072242
- 上传时间:2023-04-16
- 格式:DOCX
- 页数:23
- 大小:1.23MB
基于单片机的超声波测距系统设计.docx
《基于单片机的超声波测距系统设计.docx》由会员分享,可在线阅读,更多相关《基于单片机的超声波测距系统设计.docx(23页珍藏版)》请在冰豆网上搜索。
基于单片机的超声波测距系统设计
一、摘要………………………………………………………………3
二、正文………………………………………………………………3
1、引言……………………………………………………………3
2、系统设计方案…………………………………………………4
2.1超声波测距的原理………………………………………4
2.2设计框图…………………………………………………4
2.3US-100超声波收发模块…………………………………4
2.4单片机电路………………………………………………6
2.5蜂鸣器报警电路…………………………………………8
2.6显示电路…………………………………………………9
2.7供电及程序下载电路……………………………………10
3软件编程………………………………………………………10
3.1软件流程图………………………………………………10
3.2主程序……………………………………………………11
4、下载调试………………………………………………………19
5、实物图…………………………………………………………19
6元件选择………………………………………………………20
三、总结………………………………………………………………20
四、参考文献…………………………………………………………20
一、摘要
超声波具有指向性强,能量消耗缓慢,传播距离较远等优点,所以,在利用传感器技术和自动控制技术相结合的测距方案中,超声波测距是目前应用最普遍的一种,它广泛应用于防盗、倒车雷达、水位测量、建筑施工工地以及一些工业现场。
本设计详细介绍了超声波传感器的原理和特性,分析了超声波测距的原理的基础上,指出了设计测距系统的思路和所需考虑的问题,给出了以STC89c52单片机为核心的低成本、高精度、微型化数字显示超声波测距仪的硬件电路和软件设计方法。
该系统电路设计合理、工作稳定、性能良好、检测速度快、计算简单、易于做到实时控制,并且在测量精度方面能达到工业实用的要求。
关键词:
超声波单片机测距STC89c52
Abstract
Ultrasonicwavehasstrongpointingtonature,slowlyenergyconsumption,propagatingdistancefarther,so,inutilizingtheschemeofdistancefindingthatsensortechnologyandautomaticcontroltechnologycombinetogether,ultrasonicwavefindsrangetousethemostgeneraloneatpresent,itappliestoguardagainsttheft,movebackwardtheradar,waterlevelmeasuring,buildingconstructionsiteandsomeindustrialscenesextensively。
Thissubjecthasintroducedprincipleandcharacteristicoftheultrasonicsensorindetail,onthebasisofanalyzingprinciplethatultrasonicwavefindsrange,thesystematicthinkingandquestionsneededtoconsiderthathavepointedoutthatdesignsandfindsrange,providelowcost,thehardwarecircuitofhighaccuracy,ultrasonicrangefinderofminiaturedigitaldisplayandsoftwaredesignmethodtakingSTC89c52asthecore,thiscircuitofsystemisreasonableindesign,workingstability,performancegoodmeasuringspeedingsoon,calculatingsimple,apttoaccomplishreal-timecontrol,andcanreachindustry'spracticaldemandinmeasuringtheprecision。
KeyWords:
Ultrasonicwave;One-chipcomputer;Rangefinding;STC89c52
二、正文
1、引言:
测量距离的方法有很多种,短距离的可以用米尺,远距离的有激光测距等,超声波测距适用于高精度的中长距离测量。
因为超声波在标准空气中的传播速度为331.45米/秒,由单片机负责计时,系统的测量精度理论上可以达到毫米级。
2、系统设计方案
2.1超声波测距的原理
超声波测距的原理一般采用渡越时间法TOF(timeofflight),也可以称为回波探测法,如图所示。
超声波发射器向某一方向发射超声波,在发射时刻的同时开始计时,超声波在介质中传播,途中碰到障碍物就立即返回
来,超声波接收器收到反射波就立即停止计时。
根据传声介质的不同,可分为液介式、气介式和固介式三种。
根据所用探头的工作方式,又可分为自发自收单探头方式和一发一收双探头方式。
而倒车雷达一般是装在车尾,超声波在空气中传播,超声波在空气中(20℃)的传播速度为340m/s(实际速度为344m/s这里取整数),根据计时器记录的时间就可以计算出发射点距障碍物的距离,公式S340*t/2。
图1超声波测距原理
由于超声波也是一种声波,其声速c与温度有关,表1列出了几种不同温度下的声速。
在使用时,如果温度变化不大,则可认为声速是基本不变的。
如果测距精度要求很高,则应通过温度补偿的方法加以校正。
表1声速与温度的关系
2.2设计框图
本研究设计的超声波测距仪框图如图所示。
超声波测距仪方框图
2.3US-100超声波收发模块
该超声波收发模块可自己产生40kHz的方波,并经放大电路驱动超声波发射探头发射超声波,发射出去的超声波经障碍物反射后由超声波接收探头接收。
经接收电路的检波放大,积分整形,在ECHO引脚上产生方波脉冲,该脉冲宽度与被测距离成线性关系。
具体过程如图3所示。
US-100超声波收发模块工作时序图
上图表明:
只需要在Trig/TX管脚输入一个10us以上的高电平,系统便可发出8个40KHZ的超声波脉冲,然后检测回波信号,当检测到回波信号后,模块还要进行温度值的测量,然后根据当前温度对测距结果进行校正,将校正后的结果通过Echo/RX管脚输出。
在此模式下,模块将距离值转化为340m/s时的时间值的2倍,通过Echo端输出一个高电平,可根据此高电平的持续时间来计算距离值。
即距离值为:
(高电平时间*340m/s)/2
注:
因为距离值已经经过温度校正,此时无需再根据环境温度对超声波声速进行校正,也就是不管温度多少,声速选择340m/s即可。
使用US-100超声波收发模块进行距离测量测量时,单片机只需要输出触发信号,并监视回响引脚,通过定时器计算回响信号宽度,并换算成距离即可。
该模块简化了发送和接收的模拟电路,工作稳定可靠,其参数指标如表2所示。
表2US-100模块电气参数
应注意测量周期必须在60毫秒以上,防止发射信号对回响信号的影响。
US-100超声波模块外形图
2.4单片机电路
本设计选用单片机STC89C52,其管脚如图所示。
STC89C52单片机管脚图
该芯片为52内核8位单片机,兼容Intel等52内核单片机,支持ISP下载,适用于常用检测控制电路。
由STC89C52组成的单片机系统原理图如图6所示。
图中TRIG引脚为单片机发送触发信号的引脚,ECHO引脚为US-100模块送回回响信号的引脚,接至单片机外部中断P3.2脚上,可以利用外部中断测量回响信号宽度。
当测量距离小于阈值20cm时,单片机通过管脚P3.6发出灯光报警信号,触发LED报警灯亮,同时通过管脚P3.7发出声音报警信号beep,该信号用以触发蜂鸣器鸣响报警。
图6单片机系统及超声波模块接口原理图
2.5蜂鸣器报警电路
图7所示为蜂鸣器报警电路。
由于单片机管脚的灌电流比拉电流容量大,因此电路设计为低电平输出时蜂鸣器响,高电平关闭。
当P3.7脚输出低电平时,PNP型三极管8550导通,有集电极电流通过,蜂鸣器鸣响。
当P3.7脚输出高电平时,三极管截止,蜂鸣器关闭。
图7蜂鸣器报警电路
2.6显示电路
显示部分采用SMC1602液晶屏进行数据显示,其主要技术参数为:
表3液晶屏技术指标
接口信号说明如表4所示。
表4液晶屏接口信号说明与单片机接口
电路如图8所示。
图8LCD与单片机接口电路
2.7供电及程序下载电路
本设计采用USB接口供电,电源电压5V。
同时,USB接口通过内含PL2303芯片的转换电路对单片机进行程序编写。
其电路原理如图9所示。
图9供电及程序下载电路
3软件编程
3.1软件流程图
本设计软件主程序流程图如图10所示,(a)为主程序流程图,(b)为定时中断子程序流程图,(c)为外部中断子程序流程图。
(a)主程序流程图
(b)外部中断流程图
图10程序流程图
3.2主程序
(1)头文件和一些宏定义
/*******************************************************************//*******************超声波测距仪************************************//*******************(液晶屏显示)************************************/
/*******************晶振11.0592MHz********************************/
#include
#include"1602.h"
typedefunsignedcharU8;/*definedforunsigned8-bitsintegervariable无符号8位整型*/typedefsignedcharS8;/*definedforsigned8-bitsintegervariable有符号8位整型*/
typedefunsignedintU16;/*definedforunsigned16-bitsintegervariable无符号16位整型*/
typedefsignedintS16;/*definedforsigned16-bitsintegervariable有符号16位整型*/typedefunsignedlongU32;/*definedforunsigned32-bitsintegervariable无符号32位整型*/typedefsignedlongS32;/*definedforsigned32-bitsintegervariable有符号32位整型*/typedeffloatF32;/*singleprecisionfloatingpointvariable(32bits)单精度浮点数32位长度*/typedefdoubleF64;/*doubleprecisionfloatingpointvariable(64bits)双精度浮点数64位*/
//定时器0的定时值为1mS,即11059/12=922个时钟脉冲,其补为65536-922=64614#defineSYSTEMCLK921600//11059200/12
#defineT0CLK921600//11059200/12
#defineT1CLK921600//11059200/12
#defineT1PERIOD1000000/921600//T1周期时间,以微秒为单位,约为1.085uS#defineTIMER0H0xFC//64614/256=252
#defineTIMER0L0x66//54447%256=102
(2)管脚、常量、变量定义和函数声明
//管脚定义
sbitTrig=P1^3;
sbitEcho=P3^2;//回波必须接在外部中断引脚上
sbitLedAlarm=P3^6;//报警灯,低电平亮
sbitBeep=P3^7;//报警蜂鸣器
//定义标志
volatilebitFlagSucceed=0;//测量成功标志
volatilebitFlagDisplay=0;//显示标志
//定义全局变量
U16DisplayCount=0;
U16time=0;
U32distance=0;
//函数声明
voiddelay_20us();
voidStart_Module();
voidINT0_Init(void);
voidData_Init();
voidTimer0_Init();
voidTimer1_Init();
(3)各子程序
//20us延时程序,不一定很准
voiddelay_20us()
{
U16bt;
for(bt=0;bt<100;bt++);//8M晶振是100
}
//数据初始化
voidData_Init()
{
}
//外部中断初始化函数
voidINT0_Init(void)
{
IT0=0;//负边沿触发中断
EX0=0;//关闭外部中断
}
//外部中断处理用做判断回波电平
voidINT0_ISR(void)interrupt0
{
time=TH1*256+TL1;//取出定时器的值
FlagSucceed=1;//置成功测量的标志
EX0=0;//关闭外部中断
}
//定时器0初始化,16位定时模式,初始化为1ms中断一次。
voidTimer0_Init()
{
TMOD=0x11;//定时器0和1工作在16位方式
TH0=TIMER0H;TL0=TIMER0L;TR0=1;//启动定时器ET0=1;//允许定时器0中断Trig=0;distance=0;DisplayCount=0;
}
//定时器0中断,用做显示计时
voidTimer0_ISR(void)interrupt1//定时器0中断是1号{
TH0=TIMER0H;TL0=TIMER0L;DisplayCount++;if(DisplayCount>=1000)//1秒钟显示一次{
FlagDisplay=1;
DisplayCount=0;
}
}
//定时器1初始化,16位计数模式,时钟为11059200/12=921600Hz
//60ms计数为55296,即0xD800
voidTimer1_Init()
{
TMOD=0x11;//定时器0和1工作在16位方式
}TH1=0;TL1=0;ET1=1;
//启动模块,Trig管脚20us正脉冲
voidStart_Module()
{
Trig=1;
Trig=0;
}
/*********************************************************************名称:
Main()
*功能:
主函数
***********************************************************************/voidmain()
{
U16i,j;
EA=0;
INT0_Init();
Timer0_Init();//定时器0初始化
Timer1_Init();//定时器1初始化
Data_Init();
EA=1;L1602_init();L1602_string(1,1,"Welcometomy");L1602_string(2,1,"distancemeter!
");//延时for(i=0;i<1000;i++)//启动模块//启动一次模块delay_20us();
for(j=0;j<1000;j++){;}while
(1){EA=0;//以下为一次检测过程:
先发出Trig电平,打开外部中断,清零T1,//最后在外部中断下降沿触发时取出T1当前值,计算出Trig脉冲宽度。
Start_Module();
while(Echo==0);//等待Echo回波引脚变高电平
FlagSucceed=0;EX0=1;TH1=0;TL1=0;
TF1=0;
TR1=1;//启动定时器1开始计数
EA=1;while(TH1<80);//盲区TR1=0;//关闭定时器1EX0=0;//关闭外部中断
if(FlagSucceed==1)//一次测试成功,则计算距离,单位为厘米{
distance=time*1.085;//计算得到脉冲时间(以微秒为单位)//将微秒时间转变成厘米距离的算法:
Y米=(X秒*344)/2//X秒=(2*Y米)/344==》X秒=0.0058*Y米==》厘米=微秒/58distance/=58;
//如果距离小于20cm,则声光报警
if((FlagSucceed==1)&&(distance<20)){LedAlarm=0;Beep=0;}else{LedAlarm=1;Beep=1;
}
}
if(FlagDisplay==1)//1秒显示时间到{if(FlagSucceed==0){
//LCD提示无回波
L1602_string(1,1,"OutOfRange(0-4m)");
L1602_string(2,1,"------");
}
else
{
//LCD显示数据
L1602_string(1,1,"DistanceResult:
");
L1602_string(2,1,"cm");
}}L1602_int(2,5,distance);}FlagDisplay=0;}
3.3显示程序
/*********************************************************************文件名:
液晶1602显示.c
*描述:
该程序实现了对液晶1602的控制。
***********************************************************************/#include"1602.h"
#include"math.h"
/*********************************************************************名称:
delay()
*功能:
延时,延时时间大概为140US。
*输入:
无
*输出:
无
***********************************************************************/
voiddelay()
{
;inti,j;for(i=0;i<=10;i++)for(j=0;j<=2;j++)
}
/*********************************************************************名称:
Convert(ucharIn_Date)
*功能:
因为电路设计时,P0.0--P0.7接法刚好与资料中的相反,所以设计该函数。
*输入:
1602资料上的值
*输出:
送到1602的值
***********************************************************************/ucharConvert(ucharIn_Date)
{
/*
uchari,Out_Date=0,temp=0;
for(i=0;i<8;i++)
{
temp=(In_Date>>i)&0x01;
Out_Date|=(temp<<(7-i));
}
returnOut_Date;
*/
returnIn_Date;
}
/*********************************************************************名称:
enable(uchardel)
*功能:
1602命令函数
*输入:
输入的命令值
*输出:
无
***********************************************************************/
voidenable(uchardel)
{
}
/*********************************************************************名称:
write(uchardel)
*功能:
1602写数据函数
*输入:
需要写入1602的数据
*输出:
无
***********************************************************************/
voidwrite(uchardel)
{
P0=Convert(del);P0=Convert(del);RS=0;RW=0;E=0;delay();E=1;delay();
}
RS=1;RW=0;E=0;delay();E=1;delay();
/*********************************************************************名称:
L1602_init()*功能:
1602初始化*输入:
无
*输出:
无
************************************
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 单片机 超声波 测距 系统 设计