课程设计实验报告-超声波测距仪的设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
西安邮电大学
单片机课程设计报告书
题目:超声波测距仪的设计
院系名称自动化学院
朱敏(06)李蕊蕊(12)朱奇峰(18)学生姓名
周腾(19)但莉(22)
专业名称测控技术与仪器
班级测控0901班
时间2012年 5 月 21 日至 6 月3 日
超声波测距仪的设计
一、设计目的
本设计利用超声波传输中距离与时间的关系,采用STC51单片机进行控制和数据处理,设计出能够精确测量两点间距离的超声波测距仪。
同时了解单片机各脚的功能,工作方式,计数/定时,I/O口的相关原理,并巩固学习单片机的相关内容知识。
二、设计要求
1.设计一个超声波测距仪,能够用四段数码管准确显示所测距离
2.精度小于1CM,测量距离大于200CM
三、设计器材
元器件数量
STC51单片机 1个
超声波测距模块URF-04 1个
电阻(1K 200 4.7K) 3 个
晶振(12MHz) 1 个
共阳极四位数码管 1 个
极性电容(33pF) 2 个
非极性电容(22uF) 1 个
四、超声波测距系统原理
在超声探测电路中,发射端得到输出脉冲为一系列方波,其宽度为发射超声的时间间隔,被测物距离越大,脉冲宽度越大,输出脉冲个数与被测距离成正比。
超声测距大致有以下方法:①取输出脉冲的平均值电压,该电压(其幅值基本固定)与距离成正比,测量电压即可测得距离;②测量输出脉冲的宽度,即发射超声波与接收超声波的时间间隔t,故被测距离为S=1/2vt。
本测量电路采用第二种方案。
由于超声波的声速与温度有关,如果温度变化不大,则可认为声速基本不变。
如果测距精度要求很高,则应通过温度补偿的方法加以校正。
超声波测距适用于高精度的中长距离测量。
因为超声波在标准空气中的传播速度为331.45米/秒,由单片机负责计时,单片机使用12.0M晶振,所以此系
统的测量精度理论上可以达到毫米级。
超声波测距的算法设计: 超声波在空气中传播速度为每秒钟340米(15℃时)。
X2是声波返回的时刻,X1是声波发声的时刻,X2-X1得出的是一个时间差的绝对值,假定X2-X1=0.03S,则有340m×0.03S=10.2m。
由于在这10.2m的时间里,超声波发出到遇到返射物返回的距离如下:
图1 测距原理
超声波测距器的系统框图如下图所示:
图2 系统框图
五、设计方案及分析(包含设计电路图)
4.1硬件电路设计
4.1.1 单片机最小系统控制模块设计与比较
方案一:采用MSP430系列的16位单片机,它是16位控制器,具有体积小、驱动能力强、可靠性高、功耗低、结构简单、具有语音处理、运算速度快等优点,但考虑到我们小组对这个方案采用的微处理器并不熟悉,使用起来并不是很方便。
因此我们决定不再使用此方案,考虑其他方案。
方案二:采用STC51单片机控制。
STC51单片机是一种低功耗、高性能CMOS8位微控制器,具有 8KB的系统可编程Flash 存储器。
AT89S52具有以
下标准功能: 8k字节Flash,256字节RAM, 32 位I/O 口线,看门狗定时器,2 个数据指针,三个16 位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路,能够满足题目设计的所有要求,而且我们对STC51单片机也比较熟悉,因此我们选择方案二。
最小系统电路图如图3所示
图3 单片机最小系统
4.1.2 显示模块设计
采用四位共阳极数码管显示,连接电路简单,显示电路连接图如图4所示
图4 数码管显示电路
4.1.3超声波测距模块
a.本系统采用超声波模块URF04进行测距,该模块使用直流5V供电,理想条件下测距可达500cm,广泛应用于超声波测距领域,模块性能稳定,测度距离精确,
盲区(2cm)超近。
URF-04工作原理简述
超声波测距原理:单片机给超声波传感器模块一个触发电平,超声波传感器的发射管自动发送8个40KHZ的方波,当超声波检测到障碍物时就会信号返回,接收管接收到信号返回之后,单片机处理从单片机发送信号到接收到返回信号这段时间里超声波传感器模块输出高电平。
这段高电平持续时间即为超声波从发射到返回的传播时间。
测量距离=(高电平持续时间*波速)/2。
4.1.4 其他电路设计
a.复位电路
单片机在RESET端加一
个大于20ms正脉冲即可实现复
位,上电复位和按钮组合的复位
电路如下:
在系统上电的瞬间,RST与
电源电压同电位,随着电容的电
压逐渐上升,RST电位下降,于
是在RST形成一个正脉冲。
只要
该脉冲足够宽就可以实现复位,
τms。
一般取
即20
=RC
≥
R≥1Ω
K,C≥22uF。
当人按下按钮S1时,使电容C1通过R1迅速放电,待S1弹起后,C再次充电,实现手动复位。
R1一般取200Ω。
图5 复位电路
b.时钟电路
当使用单片机的内部时钟电路时,单片机的XATL1和XATL2用来接石英晶体和微调电容,如图所示,晶体一般可以选择3M~24M,电容选择30pF
左右。
我们选择晶振为12MHz,电容33pF。
图6 时钟电路
c. 按键电路
我们通过P1.0来启动测量,程序中通过查询P1.0的电平来检测是否按键被按下,电路原理如下:
当按下按键时P1.0为低电平,单片机通过查询到低电平
开始测量距离,当松开按键,P1.0即为高电平。
在软件中通过软
件延时来消除按键的机械抖动。
图7按键电路
4.2软件程序设计
软件分为两部分,主程序和中断服务程序。
分别如图4.4和图4.5所示。
主程序完成初始化工作、超声波发射和接收顺序的控制。
外部中断服务子程序主要完成时间值的读取、距离计算、结果的输出、数码管显示等工作。
主程序首先是对超声波模块初始化,通过延时函数产生10us的高电平,再将计数器初始化,判断超声波接收端是否收到回波,进而执行外部中断程序。
中断程序首先关闭外部中断,关闭计数器,然后读出计数值,根据公式计算距离,然后将结果送往数码管显示。
图8主程序流程图图9 外部中断服务子程序
为了避免超声波从发射器直接传送到接收器引起的直射波触发,需要延时约
0.1 ms(这也就是超声波测距仪会有一个最小可测距离的原因)后,才打开外中
断0接收返回的超声波信号。
由于采用的是12 MHz的晶振,计数器每计一个数
就是1μs,当主程序检测到接收成功的标志位后,将计数器T0中的数(即超声
波来回所用的时间)按公式计算,即可得被测物体与测距仪之间的距离,设计时
取30℃时的声速为340 m/s则有:d=(c×t)/2=170T0/10000cm 其中,T0为计数器T0的计算值。
六、问题分析与解决方法
1.在拿到设计要求之后,我们确定采用超声波测距模块,根据超声波模块的工作原理:给超声波传感器模块一个触发电平,超声波传感器的发射管自动发送8个40KHZ的方波,当超声波检测到障碍物时就会信号返回,接收管接收到信号返回之后,单片机处理从单片机发送信号到接收到返回信号这段时间里超声波传感器模块输出高电平。
这段高电平持续时间即为超声波从发射到返回的传播时间。
测量距离=(高电平持续时间*波速)/2。
我们的设计方案是利用计数器0进行计数,通过捕获上升沿和下降沿用计数器来计算高电平的持序时间,实现数据的测量。
然而我们却不能够确定高电平持续时间和计数器的计数值之间的换算关系,为此我们讨论了很久,最终找到了答案,高电平持续时间=计数值×单片机的机器周期(1us)。
虽然学习了单片机这么久,但是对于一些基础概念没有清晰的认识,导致了这种错误。
2.在设计数码管显示电路时,我们本来打算利用74HC573锁存器,但是发现这样硬件电路会复杂很多,另外由于此设计功能要求并不复杂,所以我们舍弃了这一部分。
另外在刚开始连接电路时,发现连好之后,数码管不亮,最后我们分析电路,单片机IO口输出电流太小,不足以驱动数码管,于是我们加了一个与门的驱动器,使之前的3A电流变为5A,由此数码管就足以驱动。
七、设计结果
a.测试环境及工具
测试距离:在实验室的特定环境中测量了0.02~3.15m。
测试仪器:数字万用表,直尺。
b.测试方法
超声波测距测距仪的硬件电路制作完成并调试好后,便可将程序编译好下载到单片机试运行。
用直尺确定障碍物的距离,数码管显示测量的距离。
c.测试结果分析。
测距仪能测的范围为0.02~3.15m,测距仪最大误差不超过1cm。
系统调试完后应对测量误差和重复一致性进行多次实验分析,不断优化系统使其达到实际使用的测量要求。
由于条件有限,我们忽略温度的影响,不进行温度补偿,声速选取340m/s.
调试测量的部分测距数据如表6-2所示:
表1 调试测量的部分数据
八、设计体会与收获
朱敏:
虽然这次课程设计只有短短两周,但让我对大二所学的模电知识及刚刚学习的单片机知识有了更深的理解,同时这也是难得的一次理论与实践相结合的机会,以前只是在书本上学单片机可实现的很多功能,还有各种中断,但却没有机会实践,一直只有理论的学习,通过这次课程设计我才真正了解其中的原理。
我的任务是硬件的总体设计以及相关焊接工作,刚开始我拿到题目的时候很不知道应该怎么做,再讯查完资料后,自己大概知道了电路需要哪些模块,下来就是针对每个模块进行具体设计,同时我还要进行一些仿真,其中应用哪些电阻,电容,这都要通过仿真来确定,期间遇到很多困难,都是团体同伴帮助我的,这也让我认识到团体的合作精神。
通过本次课程设计我不光复习了模电知识及单片机知识,锻炼了动手能力,同时也熟悉掌握了proteus仿真软件和Protel电路设计软件的使用,对于我们测控专业的学生来说,Proteus和Protel是必须掌握的电路仿真软件,这次课程设计给我提供了一个很好的机会锻炼自己的实践能力,我想对于我们工科学生来说动手能力是很重要的,以前每天只是在教室里面学习理论知识,而没有机会将理论与实践结合起来。
李蕊蕊:
我这次的课程设计的主要任务是对于超声波测距模块的设计和一些其他设计仿真工作,经过我们的多次的样机制作发现,超声波的发射和接收头比较脆弱,不要随意的拨动它们。
而且超声波元件的价格比较昂贵,所以制作时候需要特别小心。
刚开始设计的电路显示部分使用了两个锁存器,但是在实际焊接时发现连线很乱、很麻烦,然后就想可不可以去掉锁存器。
在仿真图上一试果然可以显示。
这样简化了硬件电路,实际连接很方便。
要学会设计,必须熟悉了解其中的原理,对此,我觉得我做的很好,对一起的每个管脚等等我都必须要熟悉,所以课下我特别的去了解了各个硬件的原理,这有助于我之后实际。
最后我觉得我们组这次课设成功的关键在与我们组员之间的团结和不放弃的精神,从电路设计到仿真,再到焊接电路,我们遇到了很多困难,但是我们没有放弃,也没有互相抱怨,而是一直呆在一起,讨论不断改进,最终我们取得了成功。
还有就是今后做设计时要多想、多试,不断修改程序,尽量简化硬件。
朱奇峰:
这次课程设计老师给我们的题目是超声波测距仪的设计,通过对本功能模块的调试,本功能模块完成了测量仪设计的目的和要求,在焊接好硬件电路并编写好软件程序后,经过长时间的调试并不断的改进方案,最终我们得到了预期的结果。
这也让我再次认识到了团体合作的力量。
我这次课程设计的任务是对于显示模块的设计,他不仅包括硬件的还有软件的设计,所以我必须把数码管和一些显示电路设置他们与单片机连接的管脚等等的全部内容要搞清楚,所以课后我也下了些功夫去查些资料什么的研究它,最终定下了一些结论比如采用四位共阳极数码管显示等等。
在此期间,我认为团体协作是非常重要的,譬如我有好多不懂的问题可以互相讨论,还有我们每个人设计任务都是有联系的,比如说我设计的一些显示的电路和单片机怎么连接,又如何显示我比须告诉设计编程的周腾,这样他才能更好地完成编程任务。
在刚开始连接电路时,发现连好之后,数码管不亮,最后我们分析电路,单片机IO口输出电流太小,不足以驱动数码管,于是我们加了一个与门的驱动器,使之前的3A电流变为5A,由此数码管就足以驱动。
周腾:
我这此课程设计的任务是软件程序的编写,这占了此次设计的最主要的工作部分,之前自己对单片机在书本上的知识还比较了解,所以自己认为编程应该没什么大问题,在认识了超声波测距设计的一些原理和硬件的总体模块之后,我开始了编程,由于用的是C,我差不多把C都忘了一些,所以在课后我又补充了这些知识,这对我有极大的帮助。
之后我现在脑子里把具体程序的模块划分出来,然后对每个模块进行流程图设计,最后就每个模块开始编程,编完程对其不断检查和改进。
本系统采用模块化设计,由主程序、发射子程序、接收子程序、定时子程序、显示子程序等模块组成。
该系统的主程序处于键控循环工作方式,当按下测量键时,主程序开始调用发射子程序、查询接收子程序、定时子程序,并把测量结果用显示子程序在数码显示器上显示出来。
总体来说这次课程设计真的收获颇多,不仅复习了课本知识,最重要的是锻炼了自己的动手能力,将理论与实际很好的结合起来,而且第一次感觉到靠自己做出了自己专业的东西,很有成就感。
但莉:
这次课程设计我的主要任务是电路焊接,当任安他们把程序设计好之后我就开始焊接电路了,我们组由于使用的是超声波集成模块URF-04,相比与其他组我们的硬件焊接任务少了很多,主要也就是焊接单片机最小系统和数码管显示电路,开始我任务很简单,一个早上搞定。
然而当我焊完之后发现数码管并不显示,通过分析电路我才发现单片机输出电流太小,不足以驱动数码管点亮,于是我在每个数码管的位选端之前加了一个与门用以放大电流,这样数码管就亮了。
另外在设计单片机最小系统的时候忽略了复位电路的作用,焊接时出现错误,在课设快要结束的时候才发现这个错误,每次只是通过电源开关来复位。
在软件程序设计的时候我们也出现了很多问题,由于是第一次使用数码管和单片机,对于数码管的工作原理及单片机个功能引脚的使用都不清楚,在编写程序的时候都是一边翻开课本一边上网查资料,才把程序框架设计出来,硬件电路焊接好之后不断改进程序,才达到设计目标。
这次实习我不但学到了很多实际的东西,还体会到了团队合作的精神。
附录Ⅰ:超声波测距仪系统电路原理图
图10 超声波测距仪系统电路原理图
附录Ⅱ:程序代码
#include<reg52.h>
#include<STDIO.H>
#include<intrins.h>
#define CONTROL_PERIOD 1000
Unsigned int code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//0123456 789 共阳极编码表
unsigned int code table_point[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//0 123456789共阳极编码表(带小数点)
sbit Led1 = P2^0; //位选端1
sbit Led2 = P2^1; //位选端2
sbit Led3 = P2^2; //位选段3
sbit Led4 = P2^3; //位选段4
sbit TX = P1^0; //超声波接收端与单片机接口unsigned int qian,bai,shi,ge; //定义变量
unsigned int time_period=0;
unsigned int count=0;
void delay_xms(unsigned int xms) //延时xms毫秒;
{ unsigned int i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void display (unsigned int temp) //显示函数,数码管动态显示{ qian=temp/1000; //取得千位值
bai=(temp%1000)/100; //取得百位值
shi=(temp%100)/10; //取得十位值
ge=temp%10; //取得个位值
P2=0; //初始化P2端口
Led1=1; //选择位选端1,使Led1使能端打开,千位显示;
P0=table_point[qian]; //查表给P0口赋值,点亮数码管 delay_xms(1); //延时1ms
P2=0; //初始化P2端口
Led2=1; //选择位选端2,使Led2使能端打开,百位显示;
P0=table[bai]; //查表给P0口赋值,点亮数码管 delay_xms(1); //延时1ms
P2=0; //初始化P2端口
Led3=1; //选择位选端3,使Led3使能端打开,十位显示;
P0=table[shi]; //查表给P0口赋值,点亮数码管 delay_xms(1); //延时1ms
P2=0; //初始化P2端口
Led4=1; //选择位选端3,使Led3使能端打开,个位显示;
P0=table[ge]; //查表给P0口赋值,点亮数码管 delay_xms(1); //延时1ms
}
void start(void) //发射持续时间为15us的高电平,启动超声波测距模块,发出超声波;
{ unsigned int a;
TX=0;
_nop_();
TX=1;
for(a=15;a>0;a--)
_nop_();
TX=0;
}
void measure_init(void)
{ TCON|=0X01; //控制寄存器:TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0;0000 0001中断0下降沿触发;
TMOD|=0X19; //工作方式寄存器:GATA1 C/T1 M1 M0 GATA0 C/T0 M1 M0 计数器1工作在方式一;
//计数器0也工作在方式一,INT0和TR0必须都有效时才工作;
TH1=(65536-CONTROL_PERIOD)/256;
TL1=(65536-CONTROL_PERIOD)%256;
TR1=1; //打开计数器1,计数器1开始计数;
TH0=0; //给计数器0附初值,高八位为0; TL0=0; //给计数器0附初值,低八位为0;
TR0=1; //打开定时器0
IE=0X89; //中断允许寄存器:EA () () ES ET1 EX1 ET0 EX0 1000 1001,外部中断0允许中断,计数器1也允许中断;
}
void main(void)
{ measure_init();
while(1)
{ if(time_period)
display((unsigned int)(time_period*0.17));
else
display(8888);
}
}
void extern0_measure_server(void) interrupt 0 //外部中断0的中断程序{ time_period=TH0*256+TL0;
TH0=0;
TL0=0;
}
void timer1_isr(void) interrupt 3 //计数器1的中断程序
{ TR1=0;
TH1=(65536-CONTROL_PERIOD)/256;
TL1=(65536-CONTROL_PERIOD)%256;
count++;
if(count>=500) //0.5秒刷新一下显示;
{ start();
count=0;
}
TR1=1;
}
附录Ⅲ:参考文献
[1] 康华光. 陈大钦,等. 电子技术基础(模拟部分).高等教育出版社 2003年
[2] 谭浩强. C程序设计(第二版).清华大学出版社.1999年
[3] 李全利、迟荣强.单片机原理及接口技术.高等教育出版社.2004年
[4] 郭天祥.51单片机C语言教程.电子工业出版社.2008年。