课题名称:超声波测距仪
班级:应用电子0901
姓名:吴星超
学号:0503090128
指导老师:杨文博
前言
随着人类社会从工业化社会到信息化社会的发展,视觉传达设计经历了商业美术、工艺美术、印刷美术设计、装潢设计、平面设计等几大阶段的演变,最终成为以视觉媒介为载体,利用视觉符号表现并传达信息的设计。对于每一位“为传达而设计”的设计者来说,如何正确、充分地传达信息是我们始终要面临的中心问题。但是,在当今社会,由于科技的进步,社会环境和社会秩序的更新,各种视觉媒介的充斥,影响着人们的思维、观念和感情,仅仅把传达信息的关键词定位于正确和充分显然是不够的。鉴于时代的要求与设计本质的要求,必须要把视觉传达设计的创新重视起来,以创新为前提充分准确地传达信息。设计界存在着大量的抄袭、模仿之作,使得设计活动成为一种程式。比如一说到大学标志,就等于是篆书外加一个圆托印章;一谈到VIS设计,便是大量相同的模版拷贝;一说到数码的视觉符号,就是一大堆蚂蚁般的“1”+“0”;一谈到商品的广告,就是戴眼镜的博士或美女的推荐代言等等。人们无时无刻都被这些“东施效颦”的设计所侵犯和骚扰,这些设计给我们带来了视觉污染,人们不禁要问:设计究竟怎么了?面对这些,我们每一个设计师都责无旁贷。现在该是大力宣扬“设计创新”的时候了,因为这个时代比以往任何时期都更需要清晰而独创的视觉传达设计。那么,视觉传达设计的创新究竟体现在哪些方面?
目录
一、超声波测距仪的制作. 3
1.1 超声波测距的原理. 3
1.2 超声测距仪的硬件电路. 5
1.2.1回流信号放大电路. 5
1.2.2 信号检波电路. 6
1.3超声波测距程序设计. 7
二、总结:. 20
三、参考文献. 20
一、超声波测距仪的制作
1.1 超声波测距的原理
根据相关的物理学知识,声音在介质中如空气和石头中传播时,其衰减特性与其频率相关,频率越高越不容易衰减,相应地其传播距离越远。当声音的频率在20KHz以上的范围时,超出了人耳的听觉范围,变成了超声波,可以传播较远的距离而不衰减,且其本身的信号频率特性不容易受环境噪音的干扰。我们可以利用超声波的这一特性进行测距。我们可利用并列安装的一对超声波探头来发射和接收超声波。
发射头标识为T(Transmit),接收头标识为R(Reiceive),它们里面采用谐振频率为40KHz的压电晶体来发射和接收超声波。当发射头外接40KHz的振荡源,如单片机端口时,它能发出最大功率的超声波。接收头只有在接收到中心频率为40KHz的超声波时才能产生谐振,由于压电效应将物理振荡转化为电信号输出,输出电压信号的幅值在uV量级。
在测距时,用这对探头对准要测距的物体如车辆、墙壁等,由单片机端口输出40KHz的PWM(脉宽调制信号)驱动超声波发射头(T头)发射出40KHz的一个短促脉冲(0.2—0.5ms),然后单片机开始计时,直到通过接收头和接收放大电路检测到回波信号,然后停止计时,得到超声波传播总时间Ts,再乘以当地温度下声速Vs得到超声波走的总路程,再除以2就得到了超声波探头与物体的实际距离。
注意:超声波脉冲以5-10个频率周期为宜,太长则测距误差太大,太短则能量不足导致接收不到。声音的速度与温度和当地的空气密度有关,最好以实测值为宜,否则可能导致较大的误差。
T/R40 超声波探头(40KHz本征频率)
超声波发射和接收的硬件电路
1.2 超声测距仪的硬件电路
1.2.1回流信号放大电路
采用电路来实现测距仪功能的主要困难在于,回波小信号的检测。由于在接收探头的压电晶体两端产生的回波电信号极其微弱,在uV量级,因此要进行高增益的放大,然后才能进行有效的检测。在这里,我们采用了三个NPN型8050三极管的共射极交流耦合组态进行三级放大。在两级的级连处采用了0.1uF的电容进行交流耦合,集电极接至5V电源以提供集电结的反偏电压,基极接在两个串联50K电阻上,以获得直流工作点(2.5V)。放大之后的信号由上图中的SIGNAL端输出。
单极直流电流增益:
单级直流电压增益:
交流电压增益要低于直流增益,经过实测,此电路的三级交流电压增益在30000左右,可将uV级的电压信号放大至十至百mV的量级。
1.2.2信号检波电路
经过回波信号放大电路,已经进入了数字芯片可以检测的范围,但此时的信号仍为频率信号,并不能直接为单片机所识别。因此还需要一个检波译码芯片,能够识别出40KHz的频率波并将其转化为数字电平信号。
LM567为一种典型的音频信号译码芯片,音频信号由其3脚引入。当此音频信号的频率与LM567的设置频率相同时,则其第8脚的输出电平由高变低。LM567的设置频率由5、6脚之间接上的可调电阻器的阻值进行调节。
可变电阻调节方法:将一个40KHz的频率源连接到LM567的3脚,将LM567的OUT端连接至电压表,然后调节5、6脚之间的电位器直到OUT端的电平变低。
至此,微弱的回波电信号在此已转化为LM567的OUT端输出的可被单片机识别的数字电平信号。
1.3超声波测距程序设计
程序流程
源代码:
/*****************************************************************/
/* 文件名; clock_c */
/* 程序描述:显示时钟 */
/*****************************************************************/
//系统包含的头文件
#include <hidef.h>
#include <MC68HC908QY4.h>
//中断函数和子函数声明部分
void _ADC_Interrupt(void); //ADC中断子程序
void _KBD_Interrupt(void); //键盘中断子程序
void _TOF_Interrupt(void); //定时器溢出中断子程序
void _TCH1_Interrupt(void);//定时器通道1中断子程序
void _TCH0_Interrupt(void);//定时器通道0中断子程序
void _IRQ_Interrupt(void); //外部中断中断子程序
void _Startup(void); //复位中断子程序
//用户子程序定义
void SYS_Init(void); //系统初始化子程序
void pled(unsigned char k);//串行数据输出子程序
void display(unsigned char dispchar,unsigned char n);//数码管显示子程序
//宏定义
#define CONFIG1_VAL 0x3D //用户配置config1寄存器的值
#define CONFIG1_ADR 0xFDEA //CONFIG1_VAL存放的地址
#define JMP_TAB_ADR 0xFDEB //用户中断向量起始地址
#define JMP_Code 0xCC //跳转指令直接寻址方式的指令码
typedef void (*tIntFunc)(void); //声明一个指向函数的数据类型
typedef struct jumpEntry { //声明一个结构体jumpEntry类型
unsigned char jmpIstr;
tIntFunc intFunc; //定义一个tIntFunc类型的变量
} JumpEntry;
//CONFIG1_VAL存放到CONFIG1_ADR定义的地址中
const unsigned char CONFIGX @CONFIG1_ADR = CONFIG1_VAL;
//定义各中断向量的中断入口
const JumpEntry IntJmpTable[] @JMP_TAB_ADR = { //定义数组IntJmpTable,元素为JumpEntry类型
JMP_Code, _ADC_Interrupt, //AD转换中断矢量地址:$FDEB
JMP_Code, _KBD_Interrupt, //键盘唤醒中断矢量地址:$FDEE
JMP_Code, _TOF_Interrupt, //定时计数器溢出中断矢量地址:$FDF1
JMP_Code, _TCH1_Interrupt, //定时器通道1溢出中断矢量地址:$FDF4
JMP_Code, _TCH0_Interrupt, //定时器通道0溢出中断矢量地址: $FDF7
JMP_Code, _IRQ_Interrupt, //IRQ矢量地址: $FDFA
JMP_Code, _Startup //复位矢量地址:$FDFD
};
//数码管显示编码 内容为:{0,1,2,3,4,5,6,7,8,9,A,b,C,d,E,F,-,三}
const unsigned char sgcode[20]={0x3f,6,0x5b,0x4f,0x66,0x6d,0x7d,7,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,
0,0x40,0x49,0x66} ;
unsigned char dspbf[4]={0x0d,0x0c,0x0d,0x0c}; //存放待显示的数据
//unsigned char mscnt; //定时器溢出计数位
int backtime; //定义一个全局变量,存储超声波传播时间
Bool intflag=0; //定义一个全局变量,存储超声接收中断标志
Bool intflag2=0; //定义一个全局变量,存储超声发射标志
int temp;
int temp1;
//主程序开始
void main(void)
{ unsigned char i;
unsigned char j;
SYS_Init();
TSC_TSTOP=0;//允许开始计数
for(;;)
{
DisableInterrupts; //禁止所有的中断
if(intflag=0) //intflag标志是为了判断是否有超声波接收中断产生
{ //如果有接收中断产生,则将其置位,如果没有,则为0,此时数码管上显示"dcdc"
dspbf[0]=0x0d;
dspbf[1]=0x0c;
dspbf[2]=0x0d;
dspbf[3]=0x0c;
}
for(i=0;i<4;i++){ display(dspbf[i],i); } //分别送去显示
for(i=0;i<4;i++){ display(dspbf[i],i); } //分别送去显示
intflag2=0;
intflag=0;
TSC_TOIE=0; //禁止计数中断
backtime=0;
TSC_TOIE=1;
for(i=0;i<5;i++) //发射一个短脉冲 40KHz
{
PTA^=0x12; //PTA1 和PTA4共同驱动超声波发射探头 ^为按位异或
_asm(nop);
}
for(i=0;i<10;i++) //发射完超声后,延时一小段时间禁止所有的接收中断,防止造成误接收
{
_asm(nop); //C语言中嵌入的空操作指令
}
EnableInterrupts; //开启所有的中断
intflag2=1; //超声波的发射标志,在超声波发射后置位,在接收后清0
for(j=0;j<20;j++) //显示并等待较长的时间 等待接收回流中断并处理距离值
{
for(i=0;i<4;i++){ display(dspbf[i],i); } //分别送去显示
for(i=0;i<4;i++){ display(dspbf[i],i); } //分别送去显示
for(i=0;i<4;i++){ display(dspbf[i],i); } //分别送去显示
}
}
}
/*************************************************************************/
/* 文件名: 系统初始化子程序 */
/* 程序描述:包括config寄存器的设置、端口寄存器的设置、定时器寄存器的设置*/
/* 输入参数:无 */
/* 返回: 无 */
/*************************************************************************/
void SYS_Init(void)
{
CONFIG2=0x00; //使用内部晶振,关闭复位引脚
CONFIG1=0x3d; //禁止看门狗,禁止LVI模块 禁止LVI复位
//INTSCR=0x00;
////////////////A B口的初始化
DDRB=0xff; //PTB7,PTB6为输入,其余为输出
PTBPUE=0xc0; //PTB7,PTB6 设置上拉电阻
PTB=0xff; //置B口全为1
DDRA=0x12; //A口为输入方式 PTA1 PTA4为输出方式
PTA=0x02; //A口全为0
/////////////////定时计数器的初始化
TSC=0x63; //设置允许定时器溢出中断,设置分频因子为32 n=t*f/p p为分频因子
TMOD=1;//设置预置寄存器值 定时器的内部晶振频率为3.2Mhz //TMOD=0.00001*3.2M/32=1
/////////////////键盘控制状态寄存器的初始化
KBSCR=0x00; //键盘状态和控制寄存器 允许键盘中断 下降沿触发
KBIER=0x04; //键盘中断控制寄存器 禁止键盘中断自动唤醒 设定PTA2为中断输入口
EnableInterrupts; // 开总中断
}
/***************************************************************************/
/*文件名:display函数 */
/*程序描述:在位置n上,显示数值dspchar */
/*调用子程序:传送数值的pled函数 */
/*输入参数:dspchar,n */
/* dspchar:段选信号,输入用户要显示的数据 */
/* n:位选信号, */
/*返回参数:无 */
/***************************************************************************/
void display(unsigned char dspchar,unsigned char n)
{
unsigned char i,j,k=1;
for(j=0;j<(n+2);j++){
k*=2;
}
pled(sgcode[dspchar]) ; //发送编码到LED
PTB=0x00;
PTB+=k; //位选
for(i=0;i<25;i++)
{ //延时
_asm(nop);
}
PTB=0x00;
}
/***************************************************************************/
/*文件名:pled函数 */
/*程序描述:8位并行输出串行移位编程,PTB1为时钟信号,将PTB0的输出并行输出 */
/*输入参数:需显示数值的编码k */
/*返回: 无 */
/***************************************************************************/
void pled(unsigned char k)
{unsigned char i;
PTB=0x00; //PTB口全部变成低电平
for(i=0;i<8;i++){
PTB_PTB1=0; //将PTB1变低,即时钟信号变低
if(k<0x80) PTB_PTB0=1; //从高位开始发送,检查最高位是否为1,为0则PTB0=1,高位为1则默认为0
PTB_PTB1=1; //给出一个下降沿信号,移位信号
PTB=0x00;//准备处理下一位
k<<=1;//左移
}
}
/***************************************************************************/
/***************************************************************************/
//以下为中断函数,需要用到时,在相应的函数内编写即可
interrupt void _ADC_Interrupt(void) {
}
interrupt void _KBD_Interrupt(void)
{
if(intflag2==1) //如果超声波已发射
{
if(intflag==0) //如果在超声波发射后第一次接收到回波,为了防止杂散回波的干扰
{
intflag2=0;
DisableInterrupts; // 接收到回波后 禁止所有中断
TSC_TOIE=0; //禁止定时溢出中断
temp=(float)(backtime)*1.89;
backtime=0; //对backtime重新写值时必须禁止定时溢出中断的产生
TSC_TOIE=1;
intflag2=0;
intflag=1; //处理距离值并显示
temp1=temp/10; //距离值除以10之后赋给一个中间变量
dspbf[0]=temp/1000; //把千位存入第0个数码管显存中
dspbf[2]=temp1%10; //把十位存入第2个数码管显存中
temp1=temp/100;
dspbf[1]=temp1%10; //把百位存入第1个数码管显存中
dspbf[3]=temp%10; //把个位存入第一个
}
}
}
/*********************************************************************/
/* 文件名: 定时器溢出中断子程序 */
/* 程序描述:定时器每溢出1次,backtime自动加1,溢出周期为TMOD*32/3.2MHz=10us */
/* 输入参数:无 */
/* 返回: 无 */
/*********************************************************************/
interrupt void _TOF_Interrupt(void)
{
backtime++;
TSC_TOF=0; //清除定时计数器溢出中断标志位,以允许下次计时溢出
}
interrupt void _TCH1_Interrupt(void){
}
interrupt void _TCH0_Interrupt(void){
}
interrupt void _IRQ_Interrupt(void){
}
二、总结:
做这个项目使我们受益匪浅。
其实一开始,我们的计划很宏伟,不但想实现简单的计步器功能,超声波测距等功能。可当我们着手开始干的时候,才发现事实远不像想象的那么简单。我们发现做很多事情时往往受到很多限制,这时候需要想办法在有限的条件下做出尽量出色的事情。把实际问题转化为逻辑问题的过程让我们感触良多。误也能纠结我们好几天。在程序调试的过程中,我们发现数学对我们的帮助很大,它帮我们分析,帮我们确定最优化的解决方案。但我们也依然记得当程序调试成功的那一刻,大家的心情是多么激动。我们成功了,虽然离我们的预期还很远,但我们至少做出了一个比较完整的东西。
最重要的,遇到困难不要总想着放弃,要主动和阻力其他成员交流,大家一起想解决方案,团队的力量是伟大的。
三、参考文献
王静霞 《单片机应用技术 (C语言版) 》; 电子工业出版社