超声波测距仪实验报告

课题名称:超声波测距仪

班级:应用电子0901

姓名:吴星超

学号:0503090128

指导老师:杨文博

随着人类社会从工业化社会到信息化社会的发展,视觉传达

设计经历了商业美术、工艺美术、印刷美术设计、装潢设计、平面设计等几大阶段的演变,最终成为以视觉媒介为载体,利用视觉符号表现并传达信息的设计。对于每一位“为传达而设计”的设计者来说,如何正确、充分地传达信息是我们始终要面临的中心问题。但是,在当今社会,由于科技的进步,社会环境和社会秩序的更新,各种视觉媒介的充斥,影响着人们的思维、观念和感情,仅仅把传达信息的关键词定位于正确和充分显然是不够的。鉴于时代的要求与设计本质的要求,必须要把视觉传达设计的创新重视起来,以创新为前提充分准确地传达信息。设计界存在着大量的抄袭、模仿之作,使得设计活动成为一种程式。比如一说到大学标志,就等于是篆书外加一个圆托印章;一谈到VIS 设计,便是大量相同的模版拷贝;一说到数码的视觉符号,就是一大堆蚂蚁般的“1”+“0”;一谈到商品的广告,就是戴眼镜的博士或美女的推荐代言等等。人们无时无刻都被这些“东施效颦”的设计所侵犯和骚扰,这些设计给我们带来了视觉污染,人们不禁要问:设计究竟怎么了?面对这些,我们每一个设计师都责无旁贷。现在该是大力宣扬“设计创新”的时候了,因为这个时代比以往任何时期都更需要清晰而独创的视觉传达设计。那么,视觉传达设计的创新究竟体现在哪些方面?

一、超声波测距仪的制作 ........................... 4

1.1 超声波测距的原理 . .......................... 4

1.2 超声测距仪的硬件电路 ....................... 6

1.2.1回流信号放大电路 . ...................... 6

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

#include

//中断函数和子函数声明部分

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) 产生

{

//如果有接收中断产生,则将其臵位,如果没有,则为0,

//禁止所有的中断

//intflag标志是为了判断是否有超声波接收中断

此时数码管上显示"dcdc"

dspbf[0]=0x0d; dspbf[1]=0x0c; dspbf[2]=0x0d; dspbf[3]=0x0c;

}

for(i=0;i

for(i=0;i

intflag2=0; intflag=0;

TSC_TOIE=0;

//禁止计数中断

backtime=0; TSC_TOIE=1;

//发射一个短脉冲

40KHz

for(i=0;i

PTA^=0x12;

^为按位异或

_asm(nop);

//PTA1 和PTA4共同驱动超声波发射探头

}

for(i=0;i

_asm(nop); //C语言中嵌入的空操作指令

}

EnableInterrupts; //开启所有的中断 intflag2=1; 接收后清0

//显示并等待较长的时间 等待接收回流中

//超声波的发射标志,在超声波发射后臵位,在

for(j=0;j

断并处理距离值

{

for(i=0;i

for(i=0;i

for(i=0;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; // 开总中断 }

/***************************************************************************/ /**/ /**/ /**/ /**/

:

pled

:

n

,

:

display

dspchar

:dspchar,n

/* dspchar:段选信号,输入用户要显示的数据 */ /* */ /*

:

n:

,

/***************************************************************************/

void display(unsigned char dspchar,unsigned char n) {

unsigned char i,j,k=1;

for(j=0;j

pled(sgcode[dspchar]) ; //发送编码到LED PTB=0x00;

PTB+=k; //位选 for(i=0;i

{ //延时 _asm(nop); } PTB=0x00; }

/***************************************************************************/ /**/

/*程序描述:8位并行输出串行移位编程,PTB1为时钟信号,将PTB0的输出并行输出 */ /*

pled

k

/**/

/***************************************************************************/

void pled(unsigned char k) {unsigned char i; PTB=0x00;

//PTB口全部变成低电平

for(i=0;i

PTB_PTB1=0; //将PTB1变低,即时钟信号变低

if(k

PTB_PTB1=1; //给出一个下降沿信号,移位信号 PTB=0x00;//准备处理下一位 k

/***************************************************************************/

/***************************************************************************/

//以下为中断函数,需要用到时,在相应的函数内编写即可 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 语言版) 》; 电子工业出版社

课题名称:超声波测距仪

班级:应用电子0901

姓名:吴星超

学号:0503090128

指导老师:杨文博

随着人类社会从工业化社会到信息化社会的发展,视觉传达

设计经历了商业美术、工艺美术、印刷美术设计、装潢设计、平面设计等几大阶段的演变,最终成为以视觉媒介为载体,利用视觉符号表现并传达信息的设计。对于每一位“为传达而设计”的设计者来说,如何正确、充分地传达信息是我们始终要面临的中心问题。但是,在当今社会,由于科技的进步,社会环境和社会秩序的更新,各种视觉媒介的充斥,影响着人们的思维、观念和感情,仅仅把传达信息的关键词定位于正确和充分显然是不够的。鉴于时代的要求与设计本质的要求,必须要把视觉传达设计的创新重视起来,以创新为前提充分准确地传达信息。设计界存在着大量的抄袭、模仿之作,使得设计活动成为一种程式。比如一说到大学标志,就等于是篆书外加一个圆托印章;一谈到VIS 设计,便是大量相同的模版拷贝;一说到数码的视觉符号,就是一大堆蚂蚁般的“1”+“0”;一谈到商品的广告,就是戴眼镜的博士或美女的推荐代言等等。人们无时无刻都被这些“东施效颦”的设计所侵犯和骚扰,这些设计给我们带来了视觉污染,人们不禁要问:设计究竟怎么了?面对这些,我们每一个设计师都责无旁贷。现在该是大力宣扬“设计创新”的时候了,因为这个时代比以往任何时期都更需要清晰而独创的视觉传达设计。那么,视觉传达设计的创新究竟体现在哪些方面?

一、超声波测距仪的制作 ........................... 4

1.1 超声波测距的原理 . .......................... 4

1.2 超声测距仪的硬件电路 ....................... 6

1.2.1回流信号放大电路 . ...................... 6

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

#include

//中断函数和子函数声明部分

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) 产生

{

//如果有接收中断产生,则将其臵位,如果没有,则为0,

//禁止所有的中断

//intflag标志是为了判断是否有超声波接收中断

此时数码管上显示"dcdc"

dspbf[0]=0x0d; dspbf[1]=0x0c; dspbf[2]=0x0d; dspbf[3]=0x0c;

}

for(i=0;i

for(i=0;i

intflag2=0; intflag=0;

TSC_TOIE=0;

//禁止计数中断

backtime=0; TSC_TOIE=1;

//发射一个短脉冲

40KHz

for(i=0;i

PTA^=0x12;

^为按位异或

_asm(nop);

//PTA1 和PTA4共同驱动超声波发射探头

}

for(i=0;i

_asm(nop); //C语言中嵌入的空操作指令

}

EnableInterrupts; //开启所有的中断 intflag2=1; 接收后清0

//显示并等待较长的时间 等待接收回流中

//超声波的发射标志,在超声波发射后臵位,在

for(j=0;j

断并处理距离值

{

for(i=0;i

for(i=0;i

for(i=0;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; // 开总中断 }

/***************************************************************************/ /**/ /**/ /**/ /**/

:

pled

:

n

,

:

display

dspchar

:dspchar,n

/* dspchar:段选信号,输入用户要显示的数据 */ /* */ /*

:

n:

,

/***************************************************************************/

void display(unsigned char dspchar,unsigned char n) {

unsigned char i,j,k=1;

for(j=0;j

pled(sgcode[dspchar]) ; //发送编码到LED PTB=0x00;

PTB+=k; //位选 for(i=0;i

{ //延时 _asm(nop); } PTB=0x00; }

/***************************************************************************/ /**/

/*程序描述:8位并行输出串行移位编程,PTB1为时钟信号,将PTB0的输出并行输出 */ /*

pled

k

/**/

/***************************************************************************/

void pled(unsigned char k) {unsigned char i; PTB=0x00;

//PTB口全部变成低电平

for(i=0;i

PTB_PTB1=0; //将PTB1变低,即时钟信号变低

if(k

PTB_PTB1=1; //给出一个下降沿信号,移位信号 PTB=0x00;//准备处理下一位 k

/***************************************************************************/

/***************************************************************************/

//以下为中断函数,需要用到时,在相应的函数内编写即可 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 语言版) 》; 电子工业出版社


相关内容

  • 超声波测距仪设计实验报告2
  • 超声波测距仪设计实验报告 一.实验目的 1)了解超声波发生器原理以及超声波测距原理: 2)根据超声波测距原理,设计超声波测距仪硬件电路: 3)熟悉PCB板的设计与制作: 4)熟悉基于单片机或嵌入式系统的开发编程: 5)熟悉电路的综合调试. 二.实验内容 1)认真研究有关理论知识并大量查阅相关资料,确 ...

  • 2014单片机课设报告超声波测距
  • 目录 第一章 超声波测距的概述 1.1几种测距方法及比较 1.2单片机应用系统概述 1.3超声波及测距系统概述 1.4本设计任务主要内容 第二章 系统主要硬件设计 2.1方案论证与比较 2.2单片机主机系统电路 2.2.1单片机电路 2.2.2复位电路 2.2.3时钟电路 2.3超声波发送电路 2. ...

  • 小车实验报告
  • 课程设计报告 (嵌入式技术实践(一)) 学 院:电气工程与自动化学院 题 目:基于P89V51RB2单片机寻迹小车 专业班级:自动化122班 学 号:33号 学生姓名:常雲 指导老师:张振利,罗龙 2013年06月20日 目 录 第1章 绪论............................. ...

  • 51单片机超声波测距仪的设计与实现毕业论文
  • 仅供参考和学习! 超声波测距仪的设计 The design of a Silent Wave Measure Distance 摘 要 随着科技的发展,人们生活水平的提高,城市发展建设加快,城市给排水系统也有较大发展,其状况不断改善.但是,由于历史原因合成时间住的许多不可预见因素,城市给排水系统,特 ...

  • 超声波测速
  • 摘 要 随着科技的发展,人们生活水平的提高,城市发展建设加快,城市给排水系统也有较大发展,其状况不断改善.但是,由于历史原因合成时间住的许多不可预见因素,城市给排水系统,特别是排水系统往往落后于城市建设.因此,经常出现开挖已经建设好的建筑设施来改造排水系统的现象.城市污水给人们带来了困扰,因此箱涵的 ...

  • 混凝土无损检测实验报告
  • 混 凝 土 无 损 检 测 技 术 实 验 报 告 班级: 09土木1班 组号: 5 姓名: xxx xxxx大学土木建筑学院 二0一一年 实验一.混凝土试件制作 一.根据砼设计要求,计算砼初步配合比 1.砼设计要求: C35 2.已知材料参数:水泥:42.5R 砂:赣江二区中砂 石:卵石 水: 自 ...

  • 超声波测距仪开题报告
  • 德州职业技术学院毕业设计 开题报告 (2015届) 题目指导教师 系班 学 姓部级号名二〇一四年十一月四日 课题研究的目的.意义: 课题的目的:随着社会的发展,由于超声波指向性强,能量消耗缓慢,在介质中传播的距离较远,因而超声波经常用于距离的测量.超声波测距由于其能进行非接触测量和相对较高的精度,越 ...

  • 设计性实验报告
  • 相位差法测超声波方案 相位差法测超声波 要求: n≤1% 序 言 声波是在弹性介质中传播的一种机械波.振动频率在20 --20000Hz的声波为可闻声波,频率超过20000Hz的声波称为超声波.对于声波特性(如频率.波长.波速.相位等)的测量是声学技术的重要内容.声速的测量在声波定位.探伤.测距中有 ...

  • 单片机毕业设计题目
  • 1. 智能压力传感器系统设计 2. 智能定时器 3. 液位控制系统设计 4. 液晶控制模块的制作 5. 嵌入式激光打标机运动控制卡软件系统设计 6. 嵌入式激光打标机运动控制卡硬件系统设计 7. 基于单片机控制的数字气压计的设计与实现 8. 基于MSC1211的温度智能温度传感器 9. 机器视觉系统 ...