传感器与检测技术大作业
报告
项目:基于AT89C51的超声波测距传感器
目录
一系统实现原理及功能... 3
实现功能... 3
二、系统设计方案... 3
硬件设计... 3
主要芯片功能介绍... 5
系统软件设计... 6
二、误差分析... 11
三、实验心得... 11
四、参考文献... 12
一系统实现原理及功能
当单片机控制超声波传感器向某一方向发射波束的同时,单片机内部开始计时。在传播过程中,超声波遇障碍物后反射回波。传感器接收到第一个反射波后,停止计时。由于超声波在空气中的传播速度是340m/s,根据计时时间及公式S=340t/2,即可得到发射点距障碍物的距离S。
实现功能
本系统实现要求测量距离范围为0.1~3米,精度误差在1厘米以内,并用LCD1602显示所测距离。
二、系统设计方案
硬件设计
该系统硬件部分由发送模块、接收模块、显示模块、时间处理模块及电源模块组成。发送模块主要由74LS04和超声波发射器组成;接收模块主要由超声波接收探头和CX20106A组成;显示模块则有液晶显示器LCD1602及其辅助电路组成;时间处理模块是整个系统的中枢神经由AT89C51及其辅助电路组成。
1、发射部分
采用反向器74HC04和超声波换能器T构成震荡器、放大驱动电路。电路简单,噪声小,稳定性高。电路简单稳定,噪声小。
图1 超声波发射模块 图2 接收模块电路
2、接收部分
采用集成电路CX20106A。它是一款红外线检波接收的专用芯片,载波频率38KHZ与测距的超声波40KHZ较为接近,可以利用它制作超声波检测接受电路,且电路简单。可满足项目中关于距离和精度的要求,电路简洁实用,易于调试,且价格低。
3、计时部分
采用单片机芯片STC89C51内部定时器,无需额外器件花销,且计时准确,受干扰小。
图三 主控及几计时模块
4、显示部分
显示部分使用LCD1602液晶显示板来完成显示的功能。它可以显示两行,每行16个字符,采用单+5V电源供电,外围电路配置简单。价格相对数码管高,但是它解决了数码管存在的各种问题,如功耗低、显示内容丰富,影像稳定不闪烁、抗干扰能力强,不但能节省电能,而且能实现普通数码管无法实现的字符串显示功能。
图4 显示模块电路
主要芯片功能介绍
该实验所用主要器件:反向器74HC04、超声波发生器、CX20106A、单片机芯片STC89C51、LCD显示器。
1、反向器74HC04
40KHZ方波信号一路经一级反向器后送到超声波换能器的一个电极,另一路经两级反向器后送到超声波换能器的另一个电极。用这种推挽形式将方波信号加到超声波换能器两端,可以提高超声波的发射强度。输出端采用两个反向器并联,用以提高驱动能力。上拉电阻R10、R11一方面可以提高反向器74HC04输出高电平的驱动能力,另一方面可以增加超声波换能器的阻尼效果,缩短其自由振荡的时间。
2、超声波发生器
超声波发生器可以分为两大类:一类是用电气方式产生超声波,一类是用机械方式产生超声波。电气方式包括压电型、磁致伸缩型和电动型等;机械方式有加尔统笛、液哨和气流旋笛等。
压电式超声波发生器实际上是利用压电晶体的谐振来工作的。超声波发生器内部有两个压电晶片和一个共振板。当它的两极外加脉冲信号,其频率等于压电晶片的固有振荡频率时,压电晶片将会发生共振,并带动共振板振动,便产生超声波。反之,如果两电极间未外加电压,当共振板接收到超声波时,将压迫压电晶片作振动,将机械能转换为电信号,这时它就成为超声波接收器了。 图5 超声波发生器外形及尺寸
3、CX20106A
电路采用集成电路CX20106A。这是一款红外线检波接收的专用芯片,常用于电视机红外遥控接收器。考虑到红外遥控常用的载波频率38kHz 与测距超声波频率40kHz 较为接近,可以利用它作为超声波检测电路。实验证明,其具有很高的灵敏度和较强的抗干扰能力。适当改变C1 的大小,可改变接收电路的灵敏度和抗干扰能力。R1 和C1 控制CX20106A内部的放大增益,R2 控制带通滤波器的中心频率。一般取R1=4.7 Ω,C1=1μF。其余元件按图4 取值。US_R1 为超声波接收头,当收到超声波时产生一个下降沿,接到单片机的外部中断INT0 上。当超声波接收头接收到40kHz 方波信号时,将会将此信号通过CX20106A 驱动放大送入单片机的外部中断0 口。单片机在得到外部中断0 的中断请求后,会转入外部中断0 的中断服务程序进行处理,在移动机器人的避障工作中,可以在中断服务程序设定需要单片机处理的最短距离。
图6 CX20106A内部方框图
3、单片机STC89C51
STC89C51内含4k Bytes Flash片内程序存储器,128bytes的随机存取数据存储器(RAM),4个中断源,2个16位可编程定时计数器,1个全双工串行通信口,看门狗(WDT)电路,片内时钟振荡器。
4、LCD显示器
LCD1602可以显示2行16个字符,有8位数据总线D0~D7和RS,R/W,EN三个控制端口,工作电压为5V,并且具有字符对比度调节和背光功能。
(1)引脚参数如下:
(2)1602型LCD的主要技术参数如下:
(3)基本操作程序:
读状态:输入:RS=L,RW=H,E=H 输出:D0~D7=状态字
读数据:输入:RS=H,RW=H,E=H 输出:无
写指令:输入:RS=L,RW=L,D0~D7=指令码,E=高脉冲 输出:D0~D7=数据
写数据:输入:RS=H,RW=L,D0~D7=数据,E=高脉冲 输出:无
(注;各种芯片的具体说明见手册)
系统软件设计
其程序如下:
//调用库函数
#include <reg52.h>
#include <intrins.h>
#include <math.h>
#include <string.h>
//定义所使用的数据类型
typedef unsigned char uchar ;
typedef unsigned int uint ;
typedef unsigned long ulong ;
//定义变量
uint timer1_count=0;
uint tiemr0_count=0;
ulong distance=0;
uint i,length1,length2;
uchar tab[3];
bit ok=0;
//定义引脚
sbit rs=P0^0;
sbit rw=P0^1;
sbit e=P0^2;
sbit P27=P2^7;
sbit P12=P1^2;
sbit P13=P1^3;
sbit send=P1^0;
//函数声明
void lcdinit(); //lcd初始化程序的声明
void lcdsendc(uchar command);//发送lcd指令的声明
void lcdsendd(uchar dat); //发送lcd数据的声明
void send_wave(uchar k); //发送k个波
void ex0_init(void);
void timer0_init(void); //定时器0初始化
void timer1_init(void); //定时器1初始化
void delay(uchar t);
void lcdbusy();
//主函数
void main()
{
code uchar lineone[25]={"Distance is"};//第一行显示缓存
code uchar linetwo[25]={"cm"};//第二行显示缓存
lcdinit();
lcdsendc(0x80); //送第一行地址
length1=strlen(lineone); //取数组字符数
for(i=0;i<length1;i++) //送第一行数据
三、误差分析
温度与声速的关系图
本实验测量范围为5cm~275cm.。小于5cm测量的值不符合实际值,5~260cm测量值几乎与实际值吻合,总体的误差能保持在1cm以内。5~10cm测量时会有警报响起。产生误差的原因主要来自温度,以及超声波发射器和接收器间小距离间隔,导致信号直接传递或多次反射, 部分器件用其他参数接近的器件代替,电路板布局器件的焊接技术也会影响到测量的稳定度,还有测量较远距离时信号有所减弱,也会导致一定测量误差,由于是简易的测控系统再次就不在对温度进行校正。
四、实验心得
通过本次大作业,我们从中学会了很多东西,包括从对一个课题的立项目到设计再到最终的设计每一个环节应该做些什么,又有了一次实践,使得这些程序清晰的呈现在我的记忆中,也对传感器的知识有了深刻的认识和了解。从参考相关资料到每个模块的调试与仿真,再到电路板的焊接,每一个过程都参与,每一个过程都付出了汗水,当然也的到回报。特别是在编程上,虽然学习了单片机但时个一学期我已经基本上忘记的差不多了,但通过本次的大作业又使我对单片机进行了一个复习,特别是对于定时器和中断这一部分的知识有了一个很好的回顾。当然谈到最有趣的还是要数制作实物,一做就是一个天,可还是没出来,最后还是用示波器一点一点的测出原来是一个电阻的的参数不对。成功的那一刻那种心情无以表达。总之对于这样的课程确实希望有更多的这样平台,要比出几道题考一下强的多。总之一句话收益匪浅。
四、参考文献
1、李光飞,楼然苗 单片机课程设计实例指导 北京航空航天大学出版社
2、秦实红,徐春辉 MCSG—51单片机原理及运用 华中科技大学出版社
3、胡向东,刘京诚 传感器与检测技术 机械工业出版社
第二篇:超声波传感器测量距离
一、超声波测距原理
超声波测距原理是通过超声波发射器向某一方向发射超声波,在发射时刻的同时开始计时,超声波在空气中传播时碰到障碍物就立即返回来,超声波接收器收到反射波就立即停止计时。超声波在空气中的传播速度为v ,而根据计时器记录的测出发射和接收回波的时间差△t ,就可以计算出发射点距障碍物的距离S ,即:
S = v·△t /2 ①
这就是所谓的时间差测距法。
由于超声波也是一种声波, 其声速C与温度有关,表1列出了几种不同温度下的声速。在使用时,如果温度变化不大, 则可认为声速是基本不变的。常温下超声波的传播速度是334 米/秒,但其传播速度V 易受空气中温度、湿度、压强等因素的影响,其中受温度的影响较大,如温度每升高1 ℃, 声速增加约0. 6 米/ 秒。如果测距精度要求很高, 则应通过温度补偿的方法加以校正(本系统正是采用了温度补偿的方法)。已知现场环境温度T 时, 超声波传播速度V 的计算公式为:
V = 331.45 + 0.607T ②
声
速
确
定
后,
只
要测得超声波往返的时间,即可求得距离。这就是超声波测距仪的机理。
二、系统硬件电路设计
图2 超声波测距仪系统框图
基于单片机的超声波测距仪框图如图2所示。该系统由单片机定时器产生40KHZ的频率信号、超声波传感器、接收处理电路和显示电路等构成。单片机是整个系统的核心部件,它协调和控制各部分电路的工作。工作过程:开机,单片机复位,然后控制程序使单片机输出载波为40kHz的10个脉冲信号加到超声波传感器上,使超声波发射器发射超声波。当第一个超声波脉冲群发射结束后,单片机片内计数器开始计数,在检测到第一个回波脉冲的瞬间,计数器停止计数,这样就得到了从发射到接收的时间差△t;根据公式①、②计算出被测距离,由显示装置显示出来。下面分别介绍各部分电路:
1 、超声波发射电路
超声波发射电路如图3所示,89C51通过外部引脚P1.0 输出脉冲宽度为250μs , 40kHz的10个脉冲串通过超声波驱动电路以推挽方式加到超声波传感器而发射出超声波。由于超声波的传播距离与它的振幅成正比,为了使测距范围足够远,可对振荡信号进行功率放大后再加在超声波传感器上。
图3中T为超声波传感器,是超声波测距系统中的重要器件。利用逆压电效应将加在其上的电信号转换为超声机械波向外辐射; 利用压电效应可以将作用在它上面的机械振动转换为相应的电信号, 从而起到能量转换的作用。市售的超声
超声波接收及信号处理电路是此系统设计和调试的一个难点。超声波接收器
接收反射的超声波转换为40KHz毫伏级的电压信号,需要经过放大、处理、用于触
发单片机中断INT0。一方面传感器输出信号微弱,同时根据反射条件不同信号大小变化较大,需要放大倍数大约为100到5000倍,另一方面传感器输出阻抗较大,这就需要高输入阻抗的多级放大电路,这就会引入两个问题:高输入阻抗容易接收干扰信号,同时多级放大电路容易自激振荡。参考各种资料最后选用了SONY公司的专用集成前置放大器CX20106达到了比较好的效果。
CX20106由:前置放大器、限幅放大器、带通滤波器、检波器、积分器、整型电路组成。其中的前置放大器具有自动增益控制功能,可以保证在超声波传感器接收较远反射信号输出微弱电压时放大器有较高的增益,在近距离输入信号强时放大器不会过载。其带通滤波器中心频率可由芯片脚5的外接电阻调节。其主要指标:单电源5V供电,电压增益77 - 79DB , 输入阻抗27 KΩ , 滤波器中心频率30 K- 60 KHz。功能可描述为: 在接收到与滤波器中心频率相符的信号时,其输出脚7脚输出低电平。芯片中的带通滤波器、积分器等使得它抗干扰能力很强。
CX20106采用8脚单列直插式塑料封装,内部结构框图如图4。超声波接收器能将接受到的发射电路所发射的红外光信号转换成数十伏至数百伏的电信号,送到CX20106的①脚,CX20106的总放大增益约为80dB,以确保其⑦脚输出的控制脉冲序列信号幅度在3.5~5V 范内。总增益大小由②脚外接的R1、C1决定,R1越小或C1越大,增益越高。C1取值过大时将造成频率响应变差,通常取为1uf。C2为检波电容,一般取3.3uf。CX20106 采用峰值检波方式,当C2容量较大时将变成平均值检波,瞬态响应灵敏度会变低,C2较小时虽然仍为峰值检波,且瞬态响应灵敏度很高,但检波输出脉冲宽度会发生较大变动,容易造成解调出错而产生误操作。R2为带通滤波器中心频率f0的外部电阻,改变R2阻值,可改变载波信号的接受频率,当f0偏离载波频率时,放大增益会显著下降,C3为积分电容,一般取330pf,取值过大,虽然可使抗干扰能力增强,但也会使输出编码脉冲的低电平持续时间增长,造成遥控距离变短。⑦脚为输出端,CX20106 处理后的脉冲信号由⑦脚输出给单片机处理从而获得显示输出。
图4 CX20106内部结构框图
本系统中应用的接收电路见图5 , 当89C51的P1.7为高电平时三级管V1导通,+5V电源通过继电器线圈和V1的发射结到地,使继电器K1接通,R2和R3并联组成5Ω电阻通过C1组成RC电路,控制红外接收专用集成电路CX20106的增益,使其7脚输出一定幅度的电压信号到89C51的P0.2口以触发中断。另外该芯片价格在三到五元,非常节省系统成本。
图5 超声波接收电路
3、距离显示电路
图6 显示电路
超声波显示电路如图6所示。是利用单片机的串行输出。只用单片机的TXD,RXD端即可显示数字。
三、软件程序设计
本系统采用模块化设计,由主程序、发射子程序、接收子程序、定时子程序、显示子程序等模块组成,图8为程序流程图。该系统的主程序处于键控循环工作方式,当按下测量键时,主程序开始调用发射子程序、查询接收子程序、定时子程序,并把测量结果用显示子程序在数码显示器上显示出来。
图8 软件程序框图
定时器中断子程序
外部中断服务子程序
四、具体程序
#include<reg51.h>
#include<math.h>
/*定义数据类型*/
#define uint unsigned int
#define uchar unsigned char
/*定义系统常数*/
long int time; /* 时间 */
bit CLflag; /* 测量标志 */
char cshu; /* 串数 */
#define T12us (256-12) /*定时器设初值 T=(256-T12us)*12/12MHZ /*定义功能位,串口用于显示 */
sbit VOLCK=P1.0; /* 发射 */
sbit MING=P3.2; /* 外部中断0检测接收信号 */
char idata disp[9]; /* 显示数据 */
char idata number[9]; /* 显示数据 */
char code table[] ={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09}; /* 码表
0,1,2,3,4,5,6,7,8,9 */
*/
void dispfb() /* 显示5位数据 */
{ char i;
for(i=0;i<5;i++) {
disp[i]=table[number[i]]; }
disp[3]=disp[3]+1; /* 置小数点 */
for(i=0;i<6;i++) {
SBUF=disp[i]; while(TI==0); TI=0; }
}
/* 通用延时子程序 */
void delay( int j )
{ int i; for(i=0;i<j;) i++; }
/* 初始化定时器,CTC0、CTC1用于定时 */
void init_CTC(void )
{
TMOD = 0x21; /* 设CTC1工作于模式2 */
ET0 = 0; /* 不允许CTC0中断 */
}
void init_INT( ) /* 外部中断初始化为高优先级,并开中断 */ {
IP=0x01; /* 置外部中断INT0优先级为高 */
TCON=0; /* 设置外部中断0的中断方式为电平触发 */ }
void serve_INT0( ) interrupt 0
{
/* 外部中断0,用于检测接收信号 */
TR0=0; /* 关闭定时器0 */
EX0=0; /* 关中断 */
time=(long)TL0;
time+=(long)TH0*256;
CLflag=1;
}
/* CTC1中断服务程序,12.5us 中断一次,用于发射 */
void CTC1_INT ( ) interrupt 3
{
VOLCK=~VOLCK;
cshu++;
}
void CTC0_INT ( ) interrupt 1
{
TR0=0;
ET0=0;
}
void Timetojuli( ) /* 将测量的时间转换为距离 */ {
long i;
i=(long)time;
i=i*340;
i=i/2;
number[4]=i/10000000; /* 十米 */
i=i-number[4]*10000000;
number[3]=i/1000000; /* 米 */
i=i-number[3]*1000000;
number[2]=i/100000; /* 分米 */
i=i-number[2]*100000;
number[1]=i/10000; /* 厘米 */
i=i-(long)number[1]*10000;
number[0]=i/1000; /* 毫米 */ }
uchar getkey( ); /* 读键盘 */
/*主程序*/
void main()
{
int i, key;
init_CTC( ); /* 初始化定时器 */
init_INT( ); /* 初始化外部中断 */
CLflag=1; /* 测量标志 */
for(i=6;i>4;i--) disp[i]=0xff;
cshu=0; /* 传数 */
delay(200); /*延时*/;
IE=0x80; /* 开中断 */
ET1=0; ET0=0;
TR1=0; TR0=0;
TL1=T12us; TH1=T12us;
while(1)
{
key=getkey( ); /* 读键盘 */
if(key==0x0fe && CLflag==1 ) /* 测量 */ {
key=0; CLflag=0;
cshu=0;
TL1=T12us; TH1=T12us;
TL0 = 0; TH0 = 0; /* 定时器0的初始时间 */ TR0=1; /* 启动定时器0,开始记时 */ TR1=1; /* 启动定时器1,发送信号 */ ET1=1;
while(cshu<12) ;
ET1=0; /* 发十个脉冲串 */
TR1=0;
delay(95);
EX0=1;
while(!CLflag);
if( cshu>=10 && CLflag==1)
{ Timetojuli( );
dispfb();
}
}
}
}
uchar getkey( )
{
char flag;
uchar key, keytemp;
flag=0;
keytemp=P1;
if(keytemp==0xff) return(255);
else {
flag=1;
delay(100);
key=P1;
if(key==keytemp) return(key);
else return(255);
}
}
五、实验结果及分析
表2是利用本文的测距仪进行实际测量的结果。由表中数据可见, 在20~150cm 范围内误差相对较小;小于20cm 范围内误差较大,这是因为超声波距离测量存在一定范围的盲区,盲区的出现是因为发出信号必须有一个上升时间, 当距离太近时计算机系统已不能处理迅速返回的反射波信号, 所以距离小于0.2米测量误差明显增加。
300cm以后的数据误差明显增大, 这是由于发射功率不够大, 接收到的信号很微弱, 引入了一些干扰因素。但电路引入温度补偿电路后总的实验结果误差在厘米级,基本上可以满足测量要求。
表2 测距仪实测结果
结束语
本系统利用超声波传感器实现无接触式空气测距,没有考虑环境温度对超声波传递速度的影响,故本系统在常温下具有测量精度高、抗干扰能力强、反应速度快等特点,可适用于各种水文液位测量、障碍物的识别以及车辆自动导航等领域,因此具有广阔的应用前景。
参考文献
[1] 马忠梅,等. 单片机的C 语言应用程序设计. 北京航天航空大学出版社,20xx年
[2] 刘瑞星,等.单片机原理及应用教程.机械工业出版社,20xx年
[3] 赵珂,等. 高准确度超声波测距仪的研制.传感器技术,20xx年第22卷第2期
[4] 藏日章 基于AT89C51单片机的超声波测距系统.电气时代,20xx年第7期 [5] 牛余朋 基于单片机的高精度超声波测距电路.电子世界,20xx年5期 [6] 姜道连,等.用AT89C2051设计超声波测距仪. 维普资讯,编号:00121 [7] 胡萍 超声波测距仪的研制. 计算机与现代化,20xx年第10期,编号:100622475 (2003) 1020054203
[8] 吴银凤,等.红外线接收电路CX20106的应用. 电气时代,20xx年第9期
[9] 马殷元 基于新型单片机P89C51RD2的倒车雷达设计. 甘肃科技,第20卷 20xx年9月第9期
[10]刘凤然 基于单片机的超声波测距系统. 传感器世界,20xx年5月
[11]李茂山 超声波测距原理及实践技术. 使用测试技术,19xx年3月第1期