基于52单片机的超声波测距系统方案.docx

上传人:b****1 文档编号:14079089 上传时间:2023-06-20 格式:DOCX 页数:23 大小:168.96KB
下载 相关 举报
基于52单片机的超声波测距系统方案.docx_第1页
第1页 / 共23页
基于52单片机的超声波测距系统方案.docx_第2页
第2页 / 共23页
基于52单片机的超声波测距系统方案.docx_第3页
第3页 / 共23页
基于52单片机的超声波测距系统方案.docx_第4页
第4页 / 共23页
基于52单片机的超声波测距系统方案.docx_第5页
第5页 / 共23页
基于52单片机的超声波测距系统方案.docx_第6页
第6页 / 共23页
基于52单片机的超声波测距系统方案.docx_第7页
第7页 / 共23页
基于52单片机的超声波测距系统方案.docx_第8页
第8页 / 共23页
基于52单片机的超声波测距系统方案.docx_第9页
第9页 / 共23页
基于52单片机的超声波测距系统方案.docx_第10页
第10页 / 共23页
基于52单片机的超声波测距系统方案.docx_第11页
第11页 / 共23页
基于52单片机的超声波测距系统方案.docx_第12页
第12页 / 共23页
基于52单片机的超声波测距系统方案.docx_第13页
第13页 / 共23页
基于52单片机的超声波测距系统方案.docx_第14页
第14页 / 共23页
基于52单片机的超声波测距系统方案.docx_第15页
第15页 / 共23页
基于52单片机的超声波测距系统方案.docx_第16页
第16页 / 共23页
基于52单片机的超声波测距系统方案.docx_第17页
第17页 / 共23页
基于52单片机的超声波测距系统方案.docx_第18页
第18页 / 共23页
基于52单片机的超声波测距系统方案.docx_第19页
第19页 / 共23页
基于52单片机的超声波测距系统方案.docx_第20页
第20页 / 共23页
亲,该文档总共23页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

基于52单片机的超声波测距系统方案.docx

《基于52单片机的超声波测距系统方案.docx》由会员分享,可在线阅读,更多相关《基于52单片机的超声波测距系统方案.docx(23页珍藏版)》请在冰点文库上搜索。

基于52单片机的超声波测距系统方案.docx

基于52单片机的超声波测距系统方案

基于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.下一次测量的延时:

200uS

图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-69针D型连接器

数据输出,地线。

由于单片机提供的电平是TTL的,而计算机提供的是RS232电平,要实现单片机与计算机的通信,必须对它们的电平进行转换,可用MAX232芯片来实现。

如上图所示。

 

2.软件设计部分

软件设计运用模块化程序设计思想,对不同功能的程序进行分别编程,这样不但使得整个软件的层次和结构比较清晰,而且有利于软件的调试和修改。

 

单片机的设定

超声波测距系统的控制核心是单片机,软件主要完成测量过程控制、精确计时、数据计算及结果处理等功能。

单片机具有开发技术成熟、应用广泛等优点,

本设计中选用的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,其值由软件设定。

 

超声波测距系统的软件流程

图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     

#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;

}

#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)//初始化函

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

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2