超声波测距课程设计报告书
- 格式:doc
- 大小:456.00 KB
- 文档页数:13
河北联合大学2009级本科课程设计
超声波测距仪
姓名:任燕凯
学院:电气工程学院
专业:电气(1)
学号: 10
指导教师:刘丽萍
2011年 12月
电气工程学院课程设计评审表
目录
1 设计任务与要求 (2)
1.1 基本功能 (2)
1.2 扩展功能 (2)
2 超声波测距设计原理 (2)
3 电路设计 (2)
3.1 显示部分设计 (2)
3.2 发射部分设计 (3)
3.3 接收部分设计 (5)
3.4单片机最小系统 (5)
4 程序设计 (6)
参考资料 (7)
超声波测距仪的设计
1 设计任务与要求
1.1 基本功能
完成2米以内的距离测量并通过数码管显示
1.2 扩展功能
接收部分采用CX20106A红外接收芯片,使回波更容易被接收,使实验省去了繁琐的调试。
2 超声波测距仪设计原理
超声波测距仪的总体框图如图1所示,主体电路完成超声波(40KHZ)的发射,接收及距离的显示。
图1 超声波测距仪总体框图
3各部分的电路设计
3.1显示部分
3.1.1 74HC138译码器的工作原理(如真值表所示)
表1 译码器器的真值表
3.1.2 译码电路与显示电路的工作原理
单片机控制段选,译码器控制位选,来完成显示部分
3.2 发射部分
3.2.1 波形的产生
利用单片机的T2定时中断产生40KHZ的脉冲,通过软件产生的脉冲,频率比较准确,易于驱动超生波的发出。
3.2.2发射部分
输出的 40kHz方波信号一路经一级反向器后送到超声波换能器的一个电极。另一路经两级反向器后送到超声波换能器的另一个电极。用这种推挽形式将方波信号加到超声波换能器两端。可以提高超声波的发射强度。输出端采用两个反向器并联。用以提高驱动能力。上拉电阻 R10、R20一方面可以提高反向器74LS04输出高电平的驱动能力。另一方面可以增加超声波换能器的阻尼效果,缩短其自由振荡的时间。
3.3 接收部分
使用CX20106A集成电路对接收探头受到的信号进行放大、滤波。其总放大增益80db。
电路如下图所示
CX20106A的引脚注释。
1管脚:遥控信号输入端,该脚和地之间连接PIN光电二极管,该脚的输入阻抗约为40kΩ。
2管脚:该脚与地之间连接 RC串联网络,它们是负反馈串联网络的一个组成部分,改变它们的数值能改变前置放大器的增益和频率特性。增大电阻R1或减小C1,将使负反馈量增大,放大倍数下降,反之则放大倍数增大。但C1的改变会影响到频率特性,一般在实际使用中不必改动,推荐选用参数为R1=4.7Ω,C1=1μF。
3管脚:该脚与地之间连接检波电容,电容量大为平均值检波,瞬间相应灵敏度低;若容量小,则为峰值检波,瞬间相应灵敏度高,但检波输出的脉冲宽度变动大,易造成误动作,推荐参数为3.3μf。
4管脚:接地端。
5管脚:该脚与电源间接入一个电阻,用以设置带通滤波器的中心频率f0,阻值越大,中心频率越低。例如,取R=200kΩ时,f0≈42kHz,若取R=220kΩ,则中心频率f0≈38kHz。6管脚:该脚与地之间接一个积分电容,标准值为330pF,如果该电容取得太大,会使探测距离变短。
7管脚:遥控命令输出端,它是集电极开路输出方式,因此该引脚必须接上一个上拉电阻到电源端,推荐阻值为22kΩ,没有接受信号是该端输出为高电平,有信号时则产生下降。
8脚:电源正极,4.5~5V。最初,我们直接用7脚输出,但用示波器发现无信号是其输出高电平的同时夹杂这少量的低电平。因此,我们在此处再加一个旁通电容,平均华其电压输出,以去除低电平信。
3.4 单片机最小系统
最小系统由复位部分和晶振部分组成,原理图如下所示。
4 程序设计
本设计采用T0定时器控制20条脉冲的输出,用T2的捕获功能来完成回波信号的接收和时间的计算。
程序流程图如下所示: N Y
Y
N N
程序初始化 按键是
否按下
T0开始计时 开始发超声波 T2开始计时 判断是不是20条波 检测回拨信号
Y
5参考资料
数字电路第五版;
单片机及应用系统设计;
程序如下:
#include
#define uchar unsigned char #define uint unsigned int
uchar code duma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; sbit a=P3^0; sbit b=P3^1; sbit c=P3^2; sbit fa=P1^0; sbit z=P1^4;
uchar sign_failure; uchar sign_success; uchar qian,bai,shi,ge; uint s,t,count;
void delay(uchar x); void init(); void measure(); void display(); void main() {
init(); //程序初始化
while(1)
{
measure(); //测量函数
qian=s/1000; //为显示计算数值
bai=(s/100)%10;
shi=(s/10)%10;
ge=s%10;
display(); //显示函数
}
}
void delay(uchar x) //延时函数{
uchar i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
void init()
{
fa=0;
count=0;
z=1; //指示灯亮
s=0;
t=0;
EA=1;
TMOD=0x02; //T0工作在方式1
T2CON=0x09; //T2工作在捕获模式
ET0=1;
ET2=1;