基于52单片机的短距离超声波测距系统.docx
- 文档编号:7290758
- 上传时间:2023-01-22
- 格式:DOCX
- 页数:14
- 大小:173.72KB
基于52单片机的短距离超声波测距系统.docx
《基于52单片机的短距离超声波测距系统.docx》由会员分享,可在线阅读,更多相关《基于52单片机的短距离超声波测距系统.docx(14页珍藏版)》请在冰豆网上搜索。
基于52单片机的短距离超声波测距系统
基于52单片机的短距离超声波测距系统
一、工作原理
超声波的频率高于声波,这种机械波与声波相比具有很强的指向性,并且由于其波长较短,其绕射能力较差,反射能力较强。
在遇到障碍物的情况下,超声波会被反射回来。
根据发射波和反射波的时间差,就可以计算出探头与障碍物之间的距离。
在实际的电路中,使用单片机控制传感器发射和判断反射波。
从单片机的P3^7口产生一组40KHz的超声波,经由发射模块的发射探头发出,紧接着超声波接受模块接收回波,经由CX20106A产生一个负跳变引起单片机得外部中断,通过计算发射到接收所经历的时间就可以很容易计算出超声波与目标之间的距离。
1.测量距离:
50~1000mm
2.载波频率:
38KHz
3.工作电压:
DC5V
4.工作电流:
30mA典型,50mA最大
5.输出信号:
5V方波
6.回波信号:
负跳变产生的下降沿
7.下一次测量的延时:
200uS
图3.1系统工作流程图
超声波测距系统是由硬件和软件两部分组成。
硬件主要包括STC89C52RC单片机最小系统,超声波发射电路、超声波接收电路、温度检测电路、显示电路;软件部分主要包括系统初始化模块、超声波驱动及信号处理模块、显示模块等,软件采用模块化设计思想,可使程序设计思路消晰,便于调试。
启动超声波测距系统进行测距时,首先由单片机发出38KHz的脉冲串,脉冲通过超声波发射电路驱动超声波发射换能器发出超声波。
单片机在发送脉冲的同时开始计时:
超声波遇到障碍物后的回波被超声波接收换能器接收,其输出的CX20106A处理后产生中断信号中断单片机的计时,这样就得到了超声波的传输时间,然后在中断服务程序中根据测出的时间计算出距离并将标志位置1。
中断返回后再发送下一串脉冲,如此反复。
二、超声波测距系统的硬件设计
本设计所做的超声液位测量系统以STC89C52RC型单片机为控制核心,其外围硬件电路包括超声波发射电路、超声波接收电路、显示电路、温度补偿电路等。
它的各部分说明如下:
(1)STC89C52RC单片机最小系统是超声波液位计的核心部分,其主要任务是:
①发出38KHz的脉冲串用来驱动超声波发射换能器发出超声波;
②通过定时器T0对超声波的传输时间进行计时;
③根据测出的时间从而计算与障碍物的距离。
④控制数据的显示。
(2)超声波发送器包括超声波产生电路和超声波发射控制电路两个部分,超声波探头选用CSB40T,可采用软件发生法和硬件发生法产生超声波。
本设计利用单片机直接软件产生38kHz的超声波信号,通过输出引脚输入至比较器,经比较器推动探头产生超声波。
(3)超声波接收电路的核心器件是红外解码芯片CX20106A。
它是用来对接收到的回波进行放大和整形,并产生一个负跳变作为单片机的中断信号。
(4)超声波温度补偿电路主要是由温度传感器DS18B20测量当前温度,并将采集到的数字信号直接传送到单片机中;然后单片机将该数值代入公式算法中进行相应的计算,从而输出经过温度补偿的较为准确的数值。
(5)显示电路采用单片机直接驱动LED的方式。
单片机将其计算好的数据,通过软件转换为BCD码直接输出到LED上,这样做比较方便,而且可以减少制作成本。
2.1发射电路的设计
发射电路的主要目的是驱动超声波发射探头内的压电晶片振动,使之发出超声波,并且发射的超声波具有一定的能量,可传播较远的距离,实现测量的目的。
驱动超声发射探头工作的方式很多,只要在探头上施加一串其频率与探头中心频率一致且能量足够大的脉冲即可。
发射脉冲可以由单片机或振动器来实现。
本设计中采用的是由单片机发出38kHz的方波,单片机P3^7输出的38kHz方波信号一路经一级反向器后送到超声波换能器的一个电极。
另一路经两级反向器后送到超声波换能器的另一个电极。
用这种推挽形式将方波信号加到超声波换能器两端,可以提高超声波的发射强度。
输出端采用两个反向器并联。
用以提高驱动能力。
上拉电阻R5、R10一方面可以提高反向器74HC04AN输出高电平的驱动能力。
另一方面可以增加超声波换能器的阻尼效果,缩短其自由振荡的时间。
图3.2发射电路图
2.2接收电路的设计
图3.3接收电路图
超声波接收器包括超声波接收探头、CX20106A处理两部分。
超声波探头必须采用与发射探头对应的型号,关键是频率要一致,否则将因无法产生共振而影响接收效果,甚至无法接收。
由于经探头变换后的正弦波电信号非常弱,经过CX20106A处理后产生负跳变,引起单片机的外部中断。
2.3显示电路设计
超声波测距系统的显示要求比较简单,测量结果采用十进制数字显示。
只需能显示0-9的数字,且显示稳定无闪烁即可。
因此显示部分采用七段半导体数码管即LED。
根据各管的极管接线形式,可分为共阴极型和共阳极型。
在共阴极接法中,LED数码管的g-a七个发光二极管因加正电压而发亮,因加零电压而不发亮。
而在共阳极接法中,刚好与共阴极接法向反。
LED数码管具有亮度大,响应速度快等优点。
LED显示器有静态显示和动态显示两种。
本设计中采用动态显示方式,以实时显示液位变化。
本设计采用单片机直接驱动LED的方法,通过软件的编译来实现由二进制到BCD码的转化,从
图3.4显示电路图(本设计中的数码管外形不代表实际产品)
而简化了显示电路。
但是,在制作超声波测距系统的过程中,我发现由单片机直接驱动LED显示,电流较小,LED虽然有显示但是比较暗,因此我用了三极管来对电流进行放大,解决了这个问题。
2.4串行通讯接口电路设计
单片机执行信息检测任务,然后把检测结果传送到计算机中去,这就需要在单片机和计算机之间建立一种通信结构。
这种通信结构可以在单片机和计算机之间进行有效而正确的信息传输。
RS-232是目前最常用的串行接口标准,用来实现计算机和计算机之间、计算机和外设之间的数据传输。
RS-232串行接口总线适用于设备之间通信距离在15米以内而且速度不高于20Kbps的场合中。
完整的RS-232接口需要22根线,采用标准的25芯插头。
现在计算机最常用的是9芯的D型RS-232连接器。
在本设计中选用了9针的D型连接器,实际使用中仅使用2、3、5三个引脚如图3.5所示,并给出了9个引脚的功能说明:
引脚1:
DCD,方向I,载波检
引脚2:
RXD,方向I,数据输入
引脚3:
TXD,方向O,数据输出
引脚4:
DTR,方向O,数据终端就绪
引脚5:
GND,地
引脚6:
DSR,方向I,数据设备就绪
引脚7:
KTS,方向O,请求发送
引脚8:
CTS,方向I,清除发送
引脚9:
RI,方向I,振铃指示
图3.59针D型连接器
数据输出,地线。
由于单片机提供的电平是TTL的,而计算机提供的是RS232电平,要实现单片机与计算机的通信,必须对它们的电平进行转换,可用MAX232芯片来实现。
如上图所示。
三、系统的软件设计
软件设计运用模块化程序设计思想,对不同功能的程序进行分别编程,这样不但使得整个软件的层次和结构比较清晰,而且有利于软件的调试和修改。
3.1单片机的设定
超声波测距系统的控制核心是单片机,软件主要完成测量过程控制、精确计时、数据计算及结果处理等功能。
单片机具有开发技术成熟、应用广泛等优点,
本设计中选用的STC89C52RC型单片机是一种低功耗、高性能、采用CMOS工艺的8位微处理器,与工业标准型80C51单片机的指令系统和引脚完全兼容。
片内8KFlash存储器可在线重新编程,或使用通用的非易失性存储器编程器。
由于一般的距离测量中,距离的变化速度并不太快,而且单片机的机器周期可达μs级,则其计时精度为μs级,完全可以满足系统测量的要求,并且成本较低,所以本设计中选用STC89C52型号的单片机。
系统采用单片机内部自带的定时器/计数器T0中断功能,对发射到接收的时间进行精确计时。
而且为了节约硬件成本,系统采用单片机发出38kHz方波信号,由方波输出程序控制单片机管脚P3^7输出方波信号。
外部中断请求有两种信号方式电平方式和脉冲方式。
电平方式的中断请求是低电平有效。
只要在INTO或INT1引脚上出现有效低电平时,就激活外部中断标志。
脉冲方式的中断请求则是脉冲的负跳变有效。
在这种方式下,在两个相邻机器周期内,INT0或INT1引脚电平状态发生变化,即在第一个机器周期内为高电平,第二个机器周期内为低电平,就激活外部中断标志。
由此可见,在脉冲方式下,中断请求信号的高电平和低电平状态都应至少维持1个机器周期,以使采样到电平状态的变化。
本设计中用单片机的定时器/计数器0来对发射到接收的时间进行精确计时。
因此需在程序中设定定时器/计数器的工作模式。
定时器/计数器0、1的工作模式的设定和定时器的控制由工作模式寄存器TMOD和控制寄存器TCON来完成。
TMOD用于设置T0和T1的工作方式,低4位用于定时器/计数器0,高4位用于定时器/计数器1,其值由软件设定。
3.2超声波测距系统的软件流程
图3.6软件流程图
按照超声波测距系统的需要,超声波驱动与数据处理模块主要任务是用单片机产生38kHz的脉冲,以驱动超声波传感器发射超声波,同时采用计数器计时;当超声波接收器接收到回波信号时停止计时。
由此得出超声波的传输时间T,利用公式(2-1)进行温度补偿,即可求出在当前温度下的声速;再利用公式(2-3),就可以计算出当前的液位高度。
发射模块软件程序如下:
TMOD=0x12;//T0、模式1;T1、模式2
EA=1;
ET0=1;
TH0=0XF4;
TL0=0XF4;
for(i=1;i<60000;i++)//主循环
{TL0=0XF4;
TR0=1;//开始发射脉冲
TH1=0;TL1=0;
TR1=1;//启动定时器开始计时
可以看出,本设计的定时器和计数器分别工作在模式1和模式2下,通过定义定时器的初值来发射脉冲波,同时启动计时器开始计时。
接收模块程序如下:
while(INPUT){;}//循环等待直到监测到回波
TR1=0;//计时结束
TIME=TH1*256+TL1;
TR0=0;
TIME=0.1856*TIME-25;
display(TIME);
显示部分由单片机直接将二进制数据转化为BCD码,程序如下:
a[0]=0x82;a[1]=0xfa;
a[2]=0xa4;a[3]=0xb0;
a[4]=0xd8;a[5]=0x91;
a[6]=0x81;a[7]=0xba;
a[8]=0x80;a[9]=0x90;
附录:
附件2:
#include
#define k1 P3_4
#define csbout P3_5//超声波发送
#define csbint P3_7//超声波接收
#definewenduP2_5;//温度控制通信端口
#define csbc=0.034
#define bg P3_3
unsigned char csbds,opto,digit,buffer[3],xm1,xm2,xm0,key,jpjs;//显示标识
unsigned char convert[10]={0x3F,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0~9段码
unsigned int s,t,i, xx,j,sj1,sj2,sj3,mqs,sx1;
bit cl;
void csbcj();
void delay(j);//延时函数
void scanLED();//显示函数
void timeToBuffer();//显示转换函数
void keyscan();
void k1cl();
void k2cl();
void k3cl();
void k4cl();
void offmsd();
void main()//主函数
{
EA=1; //开中断
TMOD=0x11;//设定时器0为计数,设定时器1定时
ET0=1;//定时器0中断允许
ET1=1;//定时器1中断允许
TH0=0x00;
TL0=0x00;
TH1=0x9E;
TL1=0x57;
csbds=0;
csbint=1;
csbout=1;
cl=0;
opto=0xff;
jpjs=0;
sj1=45;
sj2=200;
sj3=400;
k4cl();
TR1=1;
while
(1)
{
keyscan();
if(jpjs <1)
{
csbcj();
if(s> sj3)
{
buffer[2]=0x76;
buffer[1]=0x76;
buffer[0]=0x76;
}
else if(s { buffer[2]=0x40; buffer[1]=0x40; buffer[0]=0x40; } else timeToBuffer(); } else timeToBuffer();//将值转换成LED段码 offmsd(); scanLED();//显示函数 if(s bg=0; bg=1; } } voiddelay(unsignedintj) { while(j--); } Init_DS18B20(void)//初始化函数 { unsignedcharx=0; DQ=1;//DQ复位 delay(8);//稍作延时 DQ=0;//单片机将DQ拉低 delay(80);//精确延时大于480us DQ=1; delay(14); x=DQ;//稍作延时后如果x=0则初始化成功x=1则初始化失败 delay(20); //P1=0x00; } ReadOneChar(void)//读一个字节 { unsignedchark=0; unsignedchardat=0; for(k=8;k>0;k--) { DQ=0;//给脉冲信号 dat>>=1; DQ=1;//给脉冲信号 if(DQ) dat|=0x80; delay(4); } return(dat); } void scanLED() //显示功能模块 { digit=0x04; for( i=0; i <3; i++) //3位数显示 { P3=~digit&opto; //依次显示各位数 P1=~buffer; //显示数据送P1口 delay(20); //延时处理 P1=0xff; //P1口置高电平(关闭) if((P3&0x10)==0)//判断3位是否显示完 key=0; digit> > =1; //循环右移1位 } } void timeToBuffer() //转换段码功能模块 { xm0=s/100; xm1=(s-100*xm0)/10; xm2=s-100*xm0-10*xm1; buffer[2]=convert[xm2]; buffer[1]=convert[xm1]; buffer[0]=convert[xm0]; } void delay(i) { while(--i); } void timer1int (void) interrupt 3 using 2 { TH1=0x9E; TL1=0x57; csbds++; if(csbds> =40) { csbds=0; cl=1; } } void csbcj() { if(cl==1) { TR1=0; TH0=0x00; TL0=0x00; i=10; while(i--) { csbout=! csbout; } TR0=1; i=mqs;//盲区 while(i--) { } i=0; while(csbint) { i++; if(i> =2450)//上限值 csbint=0; } TR0=0; TH1=0x9E; TL1=0x57; t=TH0; t=t*256+TL0; s=t*csbc/2; TR1=1; cl=0; } } void k1cl() { sj1=sj1+5; if(sj1> 100) sj1=30; s=sj1; } void k2cl() { sj2=sj2+5; if(sj2> 500) sj2=40; s=sj2; } void k3cl() { sj3=sj3+10; if(sj3> 500) sj3=100; s=sj3; } void k4cl() { sx1=sj1-1; sx1=sx1/csbc; mqs=sx1/4.5; } void offmsd() { if (buffer[0] == 0x3f) buffer[0] = 0x00; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 52 单片机 短距离 超声波 测距 系统