资源描述
自动化专业课程设计
便携式测距仪系统设计
学生学号: 2009041227
学生姓名: 李玉成
班 级: 09412
指导教师: 王辉
起止日期:
哈尔滨工程大学自动化学院
一、 设计要求
用单片机设计一套超声波测距检测系统,实现对测距的显示和提示以及临界报警
二、 设计方案
设计思路
由于超声波指向性强,能量消耗缓慢,在介质中传播的距离较远,因而超声波经常用于距离的测量。利用超声波检测距离,设计比较方便,计算处理也较简单,并且在测量精度方面也能达到工业生产等自动化的使用要求。
超声波发生器可以分为两大类:一类是用电气方式产生超声波,一类是用机械方式产生超声波。电气方式包括压电型、电动型等;机械方式有加尔统笛、液哨和气流旋笛等。它们所产生的超声波的频率、功率、和声波特性各不相同,因而用途也各不相同.目前在近距离测量方面常用的是压电式超声波换能器.根据设计要求并综合各方面因素,本文采用STC89C52单片机作为控制器,用1602液晶进行温度及距离的显示,超声波驱动信号用单片机的定时器。
在北方季节温差较大,对声速的影响也就比较大,如果对测量精度要求较高时,传统的那种将声速固定用 340m/s 来计算距离的方式就无法满足需求.所以为了提高测量队精确性,在本设计中加入了以DS18B20为核心的温度补偿装置。测量时先通过温度传感器DS18B20测出当前环境温度,然后用STC89S52单片机计算出此时的声速,再测量超声波发射和返回的时间差,以此算出最终距离。本系统的超声波测距可测出回波和发射脉冲之间的时间间隔,再利用公式S=Ct/2就可以算出距离,通过温度传感器测出当前温度[6],以此计算出当前声速,测出更加准确的距离值,最终在1602液晶上显示出来。当测量距离过近货过远时,系统会发出警告.正常距离予以显示.
为了实现以上功能,系统大致设计了如下几个模块:
(1)单片机最小系统
(2)液晶显示模块
(3)超声波接收、发射模块
(4)报警模块
(5)温度补偿模块
(6)电源模块
设计方案的论证
超声波测距的原理是利用超声波的发射和接受,根据超声波传播的时间来计算出传播距离.实用的测距方法有两种,一种是在被测距离的两端,一端发射,另一端接收的直接波方式,适用于身高计;一种是发射波被物体反射回来后接收的反射波方式,适用于测距仪。此次设计采用反射波方式。
测距仪的分辨率取决于对超声波传感器的选择.超声波传感器是一种采用压电效应的传感器,常用的材料是压电陶瓷。由于超声波在空气中传播时会有相当的衰减,衰减的程度与频率的高低成正比;而频率高分辨率也高,故短距离测量时应选择频率高的传感器,而长距离的测量时应用低频率的传感器。
三、 设计内容
超声波测距的原理
超声波的产生与接受通常由两只结构完全相同的超声压电换能器分别完成。超声波的产生是利用压电陶瓷的逆压电效应[7],在交变电压作用下,压电陶瓷纵向长度周期性地伸缩,产生机械振动而在空气中激发出超声波;超声波的接受则是利用压电陶瓷的正压电效应是声压变化为电压的变化.
超声测距的原理大多采用渡越时间法,本设计采用的是超声波测距最常用的方法渡越时间探测法。即在声速已知的情况下,通过测量超声波回声所经历的时间来获得距离。其原理图如图2.1所示。
图2.1 超声波测距原理图
即:
(2。1)
式中:为换能器与障碍物之间的距离;c为声波传播速度,
(2.2)
为气体定压比热与定容比热之比,R为普实气体常数;T为绝对温度;m为气体的分子量;t为超声波发射到返回的时间间隔。
在本设计中,超声波传播的介质默认为是空气,因为北方温差较大,为了提高精确度加入了温度补偿装置,但为了使设计简便,忽略了湿度对声速的影响。随意声速c的最终计算公式为
(2.3)
超声波测距仪的工作原理通常为:在单片机的控制下,超声波发射电路产生40 kHz脉冲,经过放大后驱动发射端发射。同时单片机内部计数器开始计数,超声波被反射后再接收端转换为电信号,经过滤波放大后送给检波器,一旦检波器收到了回波,计数器就停止工作,得到计数值。然后单片机根据计数频率和温度补偿电路测得声速,计算并得到待测距离。
超声波测距仪的模块电路
本设计的超声波测距仪分为7个模块[8]。超声波发射模块、超声波接收模块,温度测量模块,单片机控制模块,显示模块,报警模块,电源模块组成。7个模块协同工作共同完成检测任务。
障
碍
物
单
片
机
超声波接收
滤波放大
倍整压流
比较电路
超声波发射
整形及功放
发射震荡
温度补偿
显示
报警
电源
图2.2 系统硬件结构图
超声波测距系统的硬件设计
本文设计的硬件电路主要包括单片机系统、超声波发射电路、超声波接收电路、液晶显示电路部分、温度补偿部分、报警电路和电源电路。电源部分可以通过电池或是电源来为整个系统供电;单片机系统用来产生控制脉冲,控制超声波的发射,并且对接收回来的信号进行处理计算;超声波发射电路部分主要用来产生40KHz的超声波,并且有驱动电路发射换能器发射出去;超声波接收电路部分用来检测超声波回波信号,超声波回波经超声接收换能器,放大滤波,检波电路后进入比较器,比较器输出端的信号进入单片机产生中断,用于计时;温度补偿部分将测得的温度输入单片机中,方便单片机计算出当前温度下的声速;最终单片机将计算的距离值在液晶1602上面显示出来。
(1)STC89C52RC单片机最小系统
STC89C52是一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash 存储器.在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案. 具有以下标准功能: 8k字节Flash,512字节RAM, 32 位I/O 口线,看门狗定时器,内置4KB EEPROM,MAX810复位电路,2个16 位 定时器/计数器,一个6向量2级中断结构,全双工串行口。另外 STC89X52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。最高运作频率35MHz,6T/12T可选。
复位电路
时钟电路
单片机最小系统电路
单片机与PC机接口部分
(2)超声波发射电路
1、发射电路主要由六反向器芯片74HC04和超声波换能器构成,P3.7端口输出的40khz方波信号一路经反向器送到超声波换能器的一个电极,另一路经两级反向器后送到超声波换能器的另一个电极,用这种方式可以提高超声波的发射强度。电路图如图2。7所示。
每次启动超声发射换能器所使用的脉冲数目不宜过多也不宜过少,过少则容易衰减,过多则发射波与反射波会产生叠加干扰,一般以8~16个脉冲为宜.系统通过单片机输出相应的有效电平与40KHz方波逻辑与实现激励脉冲数目的控制。
测量盲区:超声波在发射的时候,是一个高压脉冲,并且脉冲结束后,换能器会有一个比较长时间的余震,会有一部分声波未经反射直接到达接收换能器,产生虚假反射波,然后接受换能器才能收到真正的反射波,这段时间从几百个us到几个ms都有可能, 因此在这个时间段内,声波的回波信号是没有办法跟发射信号区分的。因此,被测物体在这个范围内,回波和发射波区分不开,也就没有办法测距,也就形成了测量的盲区。
图2。7 超声波发射电路
2、74HC04概述
74HC04是一款高速CMOS器件[15],74HC04引脚兼容低功耗肖特基TTL(LSTTL)系列。74HC04遵循JEDEC标准NO.7A。
(1)74HC04提供了6路反相缓冲器.其逻辑图如图2。8所示。
其中Y代表数据输出,A代表数据输入。实际就是6个反相器集成在一个芯片中,在电路中可以单独使用一个或同时使用几个反相器。
(2)74HC04特性
兼容JEDEC标准NO。8—1A
ESD保护
HBM EIA/JESD22-A114-A超过2000V
MM EIA/JESD22—A115-A超过200V
温度范围
-40~+85℃
-40~+125℃
(3)74HC04 基本参数
电压:2。0~6。0V
驱动电流:+/-5。2mA
传输延迟:7ns@5V
(4)74HC04其他特性
逻辑电平CMOS
功耗考量:低功耗或电池供电应用
图2。8 74HC04逻辑图
(3)超声波接收电路
集成电路CX20106A 是一款红外线检波接受的专用芯片, 常用于电视机红外遥控接收器。考虑到红外遥控常用的载波频率38kHz与测距的超声波40kHz较为接近,可以利用它制作超声波检测接收电路,适当更改电容C4 的大小可以改变接收电路的灵敏度和抗干扰能力。CX20106Aa的内部结构图如图2.9所示。
前置电路将接收到的信号,转换成CX20106A可以接收的标准数字信号,送到CX20106A的1脚,CX20106A的总放大增益约为80dB,其7脚输出的控制脉冲序列信号幅度在3.5~5V范围内.总增益大小由2脚外接的R2、C2决定,R2越小或C2越大,增益越高。但取值过大时将造成频率响应变差,C2为3。3uF.采用峰值检波方式检波电容C3为3.3uF。R3为带通滤波器中心频率f0的外部电阻。积分电容C4取330pF。
通过CX20106a芯片的信号,在输出端会产生一个下降沿,并将此接到AT89S52单片机的外部中断上。在本电路的调试过程中,如果一直发射超声波,在7脚将会有周期的低电平产生。因此在此基础上只要通过AT89S52单片机来计算发射信号到接收到信号时产生下降沿这段时间的长度,再通过数学计算,转化为距离,然后在LCD上面显示出来。
CX20106A内部结构图
超声波接收芯片的外围电路
(4)显示部分
显示部分采用字符型LCD1602液晶显示所测距离值,将P0与LCD的数据线相连,P1口与LCD的控制线相连,3脚电位器控制液晶背光亮度。电路如图3.3所示:
显示电路
(5)电源电路
为了实现超声波测距仪的便携性,本设计中加入了由电池供电的电源电路。电源电路采用两节3V锂电池供电,回路中加入了一个自锁开关以便于控制电路的通断.因为电池随着使用电压会发生变化,所以还加入了一个1K的滑动变阻器和一个稳压二极管,随时可以调节电压的大小,使电路供电稳定.最后为了便于观察电路的通断,回路中加入了一个绿色LED.电源部分电路如图2。14所示。除了电池供电外,本设计预留了电源接头,也可以通过稳压电源直接进行5V供电。此外,还可以通过USBASP下载器直接用电脑通过USB接口供电。
电源电路
(6)报警电路
报警电路作为超声波测距仪的一个拓展功能也被加入了设计中,其由一个有源蜂鸣器,一个S8050的NPN三极管,一个1K电阻和一个红色LED组成,在这种设计中,三极管起到开关的作用。当测距失败或者距离过近时,蜂鸣器会发出短暂的警告音,同时红灯闪烁,引起使用者的注意.
报警电路
(7)温度补偿电路
本系统温度传感器DS18B20及其周边工作电路设计如图2.18所示。因为AT89S52单片机的P1口的驱动能力较强,所以在设计时直接将18B20温度传感器的接在了单片机的P10口.然后将其余两脚分别接地和电源。
DS18B20温度传感器外形类似一个三极管,是美国Dallas半导体公司继DS1820之后最新推出的一种改进型智能温度传感器。与传统的热敏电阻相比,他能够直接读出被测温度并且可根据实际要求通过简单的编程实现9—12位的数字值读数方式。可以分别在93.75ms和750ms内完成9位和12位的数字量。它具有独特的单总线接口方式,即允许在一条信号线上挂接数十甚至上百个数字式传感器,从而使测温装置与各传感器的接口变得十分简单,克服了模拟式传感器与微机接口时需要的A/D转换器及其它复杂外围电路的缺点,而且,可以通过总线供电,温度变换功率来源于数据总线,总线本身也可以向所挂接的DS18B20供电,而无需额外电源,由它组成的温度测控系统非常方便,而且成本低、体积小、可靠性高.DS18B20的测温范围-55—+125℃,最高分辨率可达0。0625℃,由于每一个DS18B20出厂时都刻有唯一的一个序列号并存入其ROM中,因此CPU可用简单的通信协议就可以识别,从而节省了大量的引线和逻辑电路。
Dallas公司的单总线技术具有较高的性能价格比,有以下特点:
①适用于低速测控场合,测控对象越多越显出其优越性;
②性价比高,硬件施工、维修方便,抗干扰性能好;
③具有CRC校验功能,可靠性高;
④软件设计规范,系统简明直观,易于掌握。
18B20温度传感器电路
超声波测距系统的软件设计及流程图
1、软件流程图
本设计软件主程序流程图如图10所示, (a)为主程序流程图,(b)
为外部中断子程序流程图。
(a) 主程序流程图 (b) 外部中断流程图
2. 主程序
#include〈reg52。h>
#include〈intrins.h〉
#include 〈math.h>
typedef unsigned char U8; /* defined for unsigned 8-bits integer variable无符号8位整型*/
typedef signed char S8; /* defined for signed 8-bits integer variable有符号8位整型*/
typedef unsigned int U16; /* defined for unsigned 16—bits integer variable无符号16位整型*/
typedef signed int S16; /* defined for signed 16—bits integer variable有符号16位整型*/
typedef unsigned long U32; /* defined for unsigned 32-bits integer variable无符号32位整型*/
typedef signed long S32; /* defined for signed 32-bits integer variable 有符号32位整型*/
typedef float F32; /* single precision floating point variable (32bits)单精度浮点数32位长度*/
typedef double F64; /* double precision floating point variable (64bits)双精度浮点数64位*/
#define SYSTEMCLK 921600 //11059200/12
#define T0CLK 921600 //11059200/12
#define T1CLK 921600 //11059200/12
#define T1PERIOD 1000000/921600 //T1周期时间,以微秒为单位,约为1。085uS
#define TIMER0H 0xFC //64614/256=252
#define TIMER0L 0x66 //54447%256=102
//管脚定义
sbit fs=P3^7;
sbit js=P3^2;
sbit alarm=P2^0;
sbit BUSY=P1^7 ;
sbit RS = P2^5 ;
sbit RW = P2^6 ;
sbit EN = P3^5 ;
sbit DQ=P2^7;
//定义标志
volatile bit FlagSucceed = 0; //测量成功标志
volatile bit FlagDisplay = 0; //显示标志
//定义全局变量
U16 DisplayCount=0;
U16 time=0;
U32 distance=0;
uchar fushu;
uchar T;
uchar data display_T[]={0,0,0,0,0,0};
//函数声明
void delay_20us();
void Start_Module();
void INT0_Init(void);
void Data_Init();
void Timer0_Init();
void Timer1_Init();
void wait(void)
{
P1 = 0xFF;
do
{
RS = 0;
RW = 1;
EN = 0;
EN = 1;
}while (BUSY == 1);
EN = 0;
}
void delay(uchar i)
{
while(i)i——;
}
void init_DS18B20()
{
while(reset());
delay(100);
DQ=1;
}
bit write_bit(uchar temp)
{
DQ=0;
if(temp) DQ=1;
delay(5);
DQ=1;
}
void write_byte(uchar word)
{
uchar temp,i;
for(i=0;i<8;i++)
{
temp=word>>i;
write_bit(temp&0x01);
}
}
bit read_bit()
{
DQ=0;
_nop_();
_nop_();
DQ=1;
delay(2);
return DQ;
}
uchar read_byte()
{ uchar b;
uchar i,temp=0;
for(i=0;i〈8;i++)
{ b=0;
if(read_bit())b=1;
temp|=(b〈<i);
delay(4);
}
return temp;
}
void read_T()
{ //guangzhongduan fang chu cuo
init_DS18B20();
write_byte(0xcc);
write_byte(0x44);
delay(500);
init_DS18B20();
write_byte(0xcc);
write_byte(0xbe);
temp_data_l=read_byte();
temp_data_h=read_byte();
fushu=0;
if(temp_data_h〉127) //温度为负值
{
temp_data_l=(~temp_data_l)+1; //取反加一,将补码变成原码
if((~temp_data_l)〉=0xff)
temp_data_h=(~temp_data_h)+1;
else temp_data_h=~temp_data_h;
fushu=1;
}
display_T[4]=(temp_data_l&0x0f)*10/16+0x30; //10/16
T=((temp_data_l&0xf0)〉>4)|((temp_data_h&0x0f)<〈4);//zheng shu
display_T[0]=(T/100+48);
display_T[1]=((T%100)/10+48);
display_T[2]=(T%10+48);
display_T[3]=’.';
display_T[5]=’\0’;
//kai zhong duan
}
//20us延时程序,不一定很准
void delay_20us()
{
U16 bt ;
for(bt=0;bt<100;bt++); //8M晶振是100
}
//数据初始化
void Data_Init()
{
fs = 0;
distance = 0;
DisplayCount = 0;
}
//外部中断初始化函数
void INT0_Init(void)
{
IT0 = 0; //负边沿触发中断
EX0=0; //关闭外部中断
}
//外部中断处理用做判断回波电平
void INT0_ISR (void) interrupt 0
{
time =TH1*256+TL1; //取出定时器的值
FlagSucceed = 1; //置成功测量的标志
EX0=0; //关闭外部中断
}
//定时器0初始化,16位定时模式,初始化为1ms中断一次。
void Timer0_Init()
{
TMOD = 0x11; //定时器0和1工作在16位方式
TH0 = TIMER0H;
TL0 = TIMER0L;
TR0 = 1; //启动定时器
ET0 = 1; //允许定时器0中断
}
//定时器0中断,用做显示计时
void Timer0_ISR(void) interrupt 1 // 定时器0中断是1号
{
TH0 = TIMER0H;
TL0 = TIMER0L;
DisplayCount ++;
if (DisplayCount >= 1000) //1秒钟显示一次
{
FlagDisplay = 1;
DisplayCount = 0;
}
}
//定时器1初始化,16位计数模式,时钟为11059200/12=921600Hz
//60ms计数为55296,即0xD800
void Timer1_Init()
{
TMOD = 0x11; //定时器0和1工作在16位方式
TH1 =0;
TL1= 0;
ET1 = 1;
}
//启动模块,Trig管脚20us正脉冲
void Start_Module() //启动模块
{
fs=1; //启动一次模块
delay_20us();
fs=0;
}
void delay()
{
S16 i,j;
for(i=0; i<=10; i++)
for(j=0; j<=2; j++)
;
}
/********************************************************************
* 名称 : enable(uchar del)
* 功能 : 1602命令函数
* 输入 : 输入的命令值
* 输出 : 无
***********************************************************************/
void enable(U8 cmd)
{
wait();
EN = 0;
P1 = cmd;
RS = 0;
RW = 0;
EN = 1;
EN = 0;
}
/********************************************************************
* 名称 : write(uchar del)
* 功能 : 1602写数据函数
* 输入 : 需要写入1602的数据
* 输出 : 无
***********************************************************************/
void write(U8 dat)
{
wait();
EN = 0;
P1= dat;
RS = 1;
RW = 0;
EN = 1;
EN = 0;
}
/********************************************************************
* 名称 : L1602_init()
* 功能 : 1602初始化,请参考1602的资料
* 输入 : 无
* 输出 : 无
***********************************************************************/
void L1602_init(void)
{
enable(0x38);
enable(0x0c);
enable(0x06);
enable(0x01);
}
void L1602_char(U8 hang,U8 lie,S8 sign)
{
U8 a;
if(hang == 1) a = 0x80;
if(hang == 2) a = 0xc0;
a = a + lie - 1;
enable(a);
write(sign);
}
void L1602_string(U8 hang,U8 lie,U8 *p)
{
U8 a;
if(hang == 1) a = 0x80;
if(hang == 2) a = 0xc0;
a = a + lie — 1;
enable(a);
while(1)
{
if(*p == ’\0’) break;
write(*p);
p++;
}
}
void L1602_int(U8 hang, U8 lie, S16 num)
{
U16 temp;
U16 gewei,shiwei,baiwei,sign;
if (num >= 0)
{
sign = 0;
}
else
{
sign = 1;
}
temp = abs(num);
baiwei = temp / 100;
temp = temp — baiwei*100;
shiwei = temp / 10;
gewei = temp - shiwei*10;
num = abs(num);
if (num>=100)
{
if (sign == 1) //负数
{
L1602_char(hang, lie, ’—');
}
L1602_char(hang, lie+1, baiwei+48);
L1602_char(hang, lie+2, shiwei+48);
L1602_char(hang, lie+3, gewei+48);
}
else if (num>=10)
{
if (sign == 1)
{
L1602_char(hang, lie+1, '—’);
}
L1602_char(hang, lie+2, shiwei+48);
L1602_char(hang, lie+3, gewei+48);
}
else
{
if (sign == 1)
{
L1602_char(hang, lie+2, '-’);
}
L1602_char(hang, lie+3, gewei+48);
}
}
/********************************************************************
* 名称 : Main()
* 功能 : 主函数
***********************************************************************/
void main()
{
U16 i, j;
EA = 0; //计时器停止工作
INT0_Init();
Timer0_Init(); //定时器0初始化
Timer1_Init(); //定时器1初始化
Data_Init();
EA = 1; //计时器开始工作
alarm=0;
L1602_init();
read_T();
L1602_string(1,1,”TEM:");
if(fushu)write('—');
display(display_T);
for (i=0;i<1000;i++)
for (j=0;j<1000;j++);
while(1)
{
EA= 0;
//以下为一次检测过程:先发出fs电平,打开外部中断,清零T1,
//最后在外部中断下降沿触发时取出T1当前值,计算出Trig脉冲宽度。
Start_Module();
while(js==0); //等待Echo回波引脚变高电平
FlagSucceed = 0;
EX0=1;
TH1= 0;
TL1= 0;
TF1= 0;
TR1=1; //启动定时器1开始计数
EA = 1;
while (TH1<80) ; //盲区
TR1 = 0; //关闭定时器1
EX0 = 0; //关闭外部中断
if(FlagSucceed==1) //一次测试成功,则计算距离,单位为厘米
{
distance = time * 1。085 ;
distance /=58;
if ((FlagSucceed == 1) && (distance < 20))
{
alarm = 0;
}
else
{
alarm = 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,"Distance Result:");
L1602_string(2,1,” cm ”);
L1602_int(2, 5, distance );
}
FlagDisplay = 0;
}
}
}
四、 调试结果分析及结论
测距系统的最终效果
该电路板可以显示温度和距离,当距离小于20cm时蜂鸣器会发出警告,当距离大于4m时将显示“out of 0~4m”,可以用电源供电,也可以用电池供电.非常便携.
测距系统的调试及出现的问题
调试时的注意事项
测距系统在硬件调试过程中需要注意以下几点
(1)将所有地线和电源线接好,注意不要短路。因为测距仪的电路分块较多,每一部分都有自己的电源线和地线,多且杂,一不小心就会漏焊,所以将所有的电源线和地线都分别连接在一起,方便供电和检查。
(2)超声波接收和发射传感器要平行放置[21],并且焊接在与电路板水平的边缘,方便测距。因为声波是传送特点,所以将两个传感器平行放置才能获得更准确的数值。若将两个端子像普通直插元器件一样垂直焊在电路板上,在测距和观察时会很不方便.
(3)超声波传感器连接外壳的引脚要接地[22],这样可以避免一部分干扰。
调试过程中出现的问题
(1) 在焊接完电路之后发现部分电路短路,但仔细检查发现电路的焊接并未出现问题,问题出现在了电路板上了,该电路板最外围的两圈是短接在一起的,导致出现短路现象.最后我们用刀划开短路部分,使其断开。
(2) 电路焊接完成之后发现程序下载不进电路,经仔细检查电路,发现晶振电路出现虚焊现象,导致最小系统不能正常工作,经重新焊接之后,问题得以解决。
(3) 1602无法正常显示需要显示的内容,经过检查发现时电路出现了问题,应该用变阻器代替定值电阻接在1602的3脚上,调整液晶显示偏压信号.问题得以解决。
(4) 超声波接收装置不能正常工作,经过检查发现时接收电路模块电路出现了问题,最后经过查阅资料重新焊接了电路,解决了问题。
测距效果
在室温下使用超声波测距系统测距后数据如下:
实际距离
测得距离
误差
cm
课题需要改进的地方
从测量
展开阅读全文