资源描述
. . .
基于52单片机的超声波测距系统
[课设名称]
基于52单片机的超声波测距系统
[课设目的]
通过设计此系统对大学所学习的单片机系统、Keil软件和电路板焊接测试方法步骤进行综合应用和复习,了解设计一个简单硬件系统的基本步骤,为今后就业打好基础。
[实验器材和工具]
器材:PC机,电路板,示波器,各种连线转接口等,单片机最小系统
工具:Keil软件
[工作原理]
1. 物理学原理
超声波的频率高于声波,这种机械波与声波相比具有很强的指向性,并且由于其波长较短,其绕射能力较差,反射能力较强。在遇到障碍物的情况下,超声波会被反射回来。根据发射波和反射波的时间差,就可以计算出探头与障碍物之间的距离。在实际的电路中,使用单片机控制传感器发射和判断反射波。(原理如图1-1)
图1-1:超声波测距物理原理图
2. 电路原理与数据:
从单片机的P3^7口产生一组40KHz 的超声波,经由发射模块的发射探头发出,紧接着超声波接受模块接收回波,经由CX20106A产生一个负跳变引起单片机得外部中断,通过计算发射到接收所经历的时间就可以很容易计算出超声波与目标之间的距离。其具体原理步骤见图1-2。
相关参数:
1. 测量距离:50~1000mm
2. 载波频率:38KHz
3. 工作电压:DC5V
4. 工作电流 :30mA 典型,50mA 最大
5. 输出信号:5V方波
6. 回波信号 :负跳变产生的下降沿
7. 下一次测量的延时:200 uS
图1-2 系统工作流程图
超声波测距系统是由硬件和软件两部分组成。硬件主要包括STC89C52RC单片机最小系统,超声波发射电路、超声波接收电路、温度检测电路、显示电路;软件部分主要包括系统初始化模块、超声波驱动与信号处理模块、显示模块等,软件采用模块化设计思想,可使程序设计思路消晰,便于调试。
启动超声波测距系统进行测距时,首先由单片机发出38KHz的脉冲串,脉冲通过超声波发射电路驱动超声波发射换能器发出超声波。单片机在发送脉冲的同时开始计时:超声波遇到障碍物后的回波被超声波接收换能器接收,其输出的CX20106A处理后产生中断信号中断单片机的计时,这样就得到了超声波的传输时间,然后在中断服务程序中根据测出的时间计算出距离并将标志位置1。中断返回后再发送下一串脉冲,如此反复。
[系统设计]
1.硬件设计部分
本设计所做的超声液位测量系统以STC89C52RC型单片机为控制核心,其外围硬件电路包括超声波发射电路、超声波接收电路、显示电路、温度补偿电路等。它的各部分说明如下:
(1)STC89C52RC单片机最小系统是超声波液位计的核心部分,其主要任务是:
①发出38KHz的脉冲串用来驱动超声波发射换能器发出超声波;
②通过定时器T0对超声波的传输时间进行计时;
③根据测出的时间从而计算与障碍物的距离。
④控制数据的显示。
(2)超声波发送器包括超声波产生电路和超声波发射控制电路两个部分,超声波探头选用CSB40T,可采用软件发生法和硬件发生法产生超声波。本设计利用单片机直接软件产生38kHz的超声波信号,通过输出引脚输入至比较器,经比较器推动探头产生超声波。
(3)超声波接收电路的核心器件是红外解码芯片CX20106A。它是用来对接收到的回波进行放大和整形,并产生一个负跳变作为单片机的中断信号。
(4)超声波温度补偿电路主要是由温度传感器DS18B20测量当前温度,并将采集到的数字信号直接传送到单片机中;然后单片机将该数值代入公式算法中进行相应的计算,从而输出经过温度补偿的较为准确的数值。
(5)显示电路采用单片机直接驱动LED的方式。单片机将其计算好的数据,通过软件转换为BCD码直接输出到LED上,这样做比较方便,而且可以减少制作成本。
发射电路的设计
发射电路的主要目的是驱动超声波发射探头的压电晶片振动,使之发出超声波,并且发射的超声波具有一定的能量,可传播较远的距离,实现测量的目的。驱动超声发射探头工作的方式很多,只要在探头上施加一串其频率与探头中心频率一致且能量足够大的脉冲即可。发射脉冲可以由单片机或振动器来实现。本设计中采用的是由单片机发出38kHz的方波,单片机P3^7输出的 38kHz方波信号一路经一级反向器后送到超声波换能器的一个电极。另一路经两级反向器后送到超声波换能器的另一个电极。用这种推挽形式将方波信号加到超声波换能器两端,可以提高超声波的发射强度。输出端采用两个反向器并联。用以提高驱动能力。上拉电阻R5、R10一方面可以提高反向器74HC04AN输出高电平的驱动能力。另一方面可以增加超声波换能器的阻尼效果 ,缩短其自由振荡的时间。具体方案见图1-3所示。
图1-3 发射部分电路图
接收电路的设计
图1-4 接收部分电路图
超声波接收器包括超声波接收探头、CX20106A处理两部分。超声波探头必须采用与发射探头对应的型号,关键是频率要一致,否则将因无法产生共振而影响接收效果,甚至无法接收。由于经探头变换后的正弦波电信号非常弱,经过CX20106A处理后产生负跳变,引起单片机的外部中断。
显示电路设计
超声波测距系统的显示要求比较简单,测量结果采用十进制数字显示。只需能显示0-9的数字,且显示稳定无闪烁即可。因此显示部分采用七段半导体数码管即LED。根据各管的极管接线形式,可分为共阴极型和共阳极型。在共阴极接法中,LED数码管的g-a七个发光二极管因加正电压而发亮,因加零电压而不发亮。而在共阳极接法中,刚好与共阴极接法向反。LED数码管具有亮度大,响应速度快等优点。LED显示器有静态显示和动态显示两种。本设计中采用动态显示方式,以实时显示液位变化。
电路结构图如图1-5所示。本设计采用单片机直接驱动LED的方法,通过软件的编译来实现由二进制到BCD码的转化,从而简化了显示电路。但是,在制作超声波测距系统的过程中,我发现由单片机直接驱动LED显示,电流较小,LED虽然有显示但是比较暗,因此我用了三极管来对电流进行放大,解决了这个问题。
图1-5显示电路图
串行通讯接口电路设计
单片机执行信息检测任务,然后把检测结果传送到计算机中去,这就需要在单片机和计算机之间建立一种通信结构。这种通信结构可以在单片机和计算机之间进行有效而正确的信息传输。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, 振铃指示
图1-6 9针D型连接器
数据输出,地线。由于单片机提供的电平是 TTL 的,而计算机提供的是 RS232 电平,要实现单片机与计算机的通信,必须对它们的电平进行转换,可用MAX232 芯片来实现。如上图所示。
2.软件设计部分
软件设计运用模块化程序设计思想,对不同功能的程序进行分别编程,这样不但使得整个软件的层次和结构比较清晰,而且有利于软件的调试和修改。
单片机的设定
超声波测距系统的控制核心是单片机,软件主要完成测量过程控制、精确计时、数据计算与结果处理等功能。单片机具有开发技术成熟、应用广泛等优点,
本设计中选用的STC89C52RC型单片机是一种低功耗、高性能、采用CMOS工艺的8位微处理器,与工业标准型80C51单片机的指令系统和引脚完全兼容。片8K Flash存储器可在线重新编程,或使用通用的非易失性存储器编程器。由于一般的距离测量中,距离的变化速度并不太快,而且单片机的机器周期可达μs级,则其计时精度为μs级,完全可以满足系统测量的要求,并且成本较低,所以本设计中选用STC89C52型号的单片机。
系统采用单片机部自带的定时器/计数器T0中断功能,对发射到接收的时间进行精确计时。而且为了节约硬件成本,系统采用单片机发出38kHz方波信号,由方波输出程序控制单片机管脚P3^7输出方波信号。
外部中断请求有两种信号方式电平方式和脉冲方式。电平方式的中断请低电平有效。只要在INTO或INT1引脚上出现有效低电平时,就激活外部中断标志。脉冲方式的中断请求则是脉冲的负跳变有效。在这种方式下,在两个相邻机器周期,INT0或INT1引脚电平状态发生变化,即在第一个机器周期为高电平,第二个机器周期为低电平,就激活外部中断标志。由此可见,在脉冲方式下,中断请求信号的高电平和低电平状态都应至少维持1个机器周期,以使采样到电平状态的变化。
本设计中用单片机的定时器/计数器0来对发射到接收的时间进行精确计时。因此需在程序中设定定时器/计数器的工作模式。定时器/计数器0、1的工作模式的设定和定时器的控制由工作模式寄存器TMOD和控制寄存器TCON来完成。TMOD用于设置T0和T1的工作方式,低4位用于定时器/计数器0,高4位用于定时器/计数器1,其值由软件设定。
超声波测距系统的软件流程
图1-7软件流程图
按照超声波测距系统的需要,超声波驱动与数据处理模块主要任务是用单片机产生 38kHz 的脉冲,以驱动超声波传感器发射超声波,同时采用计数器计时;当超声波接收器接收到回波信号时停止计时。由此得出超声波的传输时间T,利用公式(2-1)进行温度补偿,即可求出在当前温度下的声速;再利用公式(2-3),就可以计算出当前的液位高度。
[数据处理]
实际的检测数据如下表格:
测量次数
实际距离X(cm)
测量距离Y(cm)
1
5.00
5.02
2
10.00
10.03
3
15.00
15.04
4
20.00
20.03
5
25.00
25.05
6
30.00
30.04
7
35.00
35.03
8
40.00
40.04
9
45.00
45.05
10
50.00
50.04
最远测量距离: 65.03cm , 对应实际最远距离为:65.00cm 。
[课设总结]
通过本次课程设计,我了解了超声波的一些基础知识,同时也熟悉了超声波模块,了解了其工作原理和电路构成。在课程设计的实验过程中,我遇到了不少的困难,主要集中在C52单片机的程序设计上,经过同学和指导教师的帮助我总算是完成了实验,由此可见我在软件设计上确实存在短板,以后需要进一步提高。本次课程设计让我回顾了以前学习到的各种知识,锻炼了动手能力和团队合作能力,是对今后走出学校步入工作岗位的一次对基础的巩固,对于以后找工作是相当有帮助的经历。
附录:
附件1:发射模块软件程序
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 <REG2051.H>
#define k1 P3_4
#define csbout P3_5//超声波发送
#define csbint P3_7//超声波接收
#define wendu P2_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 <sj1)
{
buffer[2]=0x40;
buffer[1]=0x40;
buffer[0]=0x40;
}
else timeToBuffer();
}
else timeToBuffer();//将值转换成LED段码
offmsd();
scanLED();//显示函数
if(s <sj2)
bg=0;
bg=1;
}
}
void delay(unsigned int j)
{
while(j--);
}
Init_DS18B20(void) //初始化函数
{
unsigned char x=0;
DQ=1;//DQ复位
delay(8);//稍作延时
DQ=0;//单片机将DQ拉低
delay(80);//精确延时 大于 480 us
DQ=1;
delay(14);
x=DQ;//稍作延时后 如果x=0则初始化成功 x=1则初始化失败
delay(20);
//P1=0x00;
}
ReadOneChar(void) //读一个字节
{
unsigned char k=0;
unsigned char dat=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;
}
16 / 16
展开阅读全文