超声波测速系统Word格式文档下载.docx
《超声波测速系统Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《超声波测速系统Word格式文档下载.docx(8页珍藏版)》请在冰豆网上搜索。
(2)晶振电路
位单片机提供时钟频率
(3)复位电路
复位是单片机的初始化操作。
其主要功能是把PC初始化为0000H,使单片机从0000H单元开始执行程序。
除了进入系统的正常初始化之外,当由于程序运行出错或操作错误使系统处于死锁状态时,为摆脱困境,也需按复位键重新启动。
总的电路图如下:
(二)软件设计
软件分为两部分,主程序和中断服务程序。
主程序完成初始化工作、超声波发射和接收,距离计算、结果的输出。
外部中断服务子程序主要完成时间值的读取。
主程序首先是对系统环境初始化,设置定时器T1工作模式为16位定时计数器模式。
置位总中断允许位EA。
然后给Trig一个20us的高电平,然后在Echo引脚等待其变为高电平,一旦输出了高电平,表明超声波已开始发射,此刻即计时,等待Echo变为低电平,即触发外部中断0的跳变沿方式中断。
读取当前定时器的值,换算成时间,乘以波速,即得到测距距离。
程序如下:
#include<
reg52.h>
intrins.h>
#defineucharunsignedchar
#defineuintunsignedint
ucharcodetable[]={0xc0,0xf9,0xa4,
0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//共阳极0-9
unsignedcharled[]={0x40,0x79,0x24,
0x30,0x19,0x12,0x02,0x78,0x00,0x10};
//带小数点的位码
sbitSMG_q=P2^0;
//定义数码管的千位
sbitSMG_b=P2^1;
//定义数码管的百位
sbitSMG_s=P2^2;
//定义数码管的十位
sbitSMG_g=P2^3;
//定义数码管的个位
sbitTrig=P2^7;
//发送波形
sbitEcho=P3^2;
//回波产生中断
sbittest=P1^0;
//指示灯控制端
uintsucceed_flag,time,timeH,timeL;
//succeed_flag测试成功标志位
voiddelayms(uintz)//延时毫秒
{
uintx,y;
for(x=z;
x>
0;
x--)
for(y=110;
y>
y--);
}
voiddelay_20us()//延时20微秒函数
{
uchara;
for(a=0;
a<
=100;
a++);
//*******数码管显示数据转换程序********************//
voiddisplay(uinttemp)
{
ucharge,shi,bai,qian;
qian=temp/1000;
bai=temp%1000/100;
shi=temp%1000%100/10;
ge=temp%10;
SMG_q=0;
P0=table[qian];
//查找定义好的数码管段值与P0口
delayms
(2);
//加入短暂延时
P0=0Xff;
//清除数码管显示,因是共阳型,
SMG_q=1;
//关闭千位数码管
SMG_b=0;
//选择百位数码管
P0=table[bai];
SMG_b=1;
//关闭百位数码管
SMG_s=0;
//选择十位数码管
P0=led[shi];
//加入短暂延时
SMG_s=1;
//关闭十位数码管
SMG_g=0;
//选择个位数码管
P0=table[ge];
//查找"
2"
定义好的数码管段值与P0
SMG_g=1;
//关闭个位数码管
}
voidchaoshengbo_start(void)//发送波形产生一个20us的脉冲
Trig=0;
_nop_();
Trig=1;
//超声波输入端
delay_20us();
//延时20us
//产生一个20us的脉冲
}
voidinit(void)//初始化
test=0;
//首先拉低脉冲输入引脚
EA=1;
//打开总中断0
TMOD=0x10;
//定时器1,16位工作方式
voidcallIft(void)//开计时器,接收信号,调用中断
EX0=1;
//打开外部中断0
ET1=1;
//开定时器1中断
TH1=0;
//定时器1清零
TL1=0;
TF1=0;
//计数溢出标志
TR1=1;
//启动定时器1
delayms(10);
//等待测量的结果
while(Echo==0);
//等待Echo回波引脚变高电平
TR1=0;
//关闭定时器1
/*********************主函数部分**************************/
voidmain()
uintdistance;
voidinit(void);
//初始化
while
(1)
{
EA=0;
//关总中断
chaoshengbo_start();
//发射超声波
callIft();
//开计时器,接收到信号,调用中断
EX0=0;
//关闭外部中断0
if(succeed_flag==1)
time=timeH*256+timeL;
distance=time*0.172;
//time*0.170-1.425
test=!
test;
//测试灯变化
display(distance);
//显示距离
}
if(succeed_flag==0)
distance=0;
//没有回波则清零
display(distance);
}
//***************************************************************
//外部中断0,用做判断回波电平
voidint0sever()interrupt0//外部中断0是0号
timeH=TH1;
//取出定时器的值
timeL=TL1;
succeed_flag=1;
//至成功测量的标志
//关闭外部中断
//****************************************************************
//定时器1中断,用做超声波测距计时
voidtimer1()interrupt3
五、设计心得
俗话说“好的开始是成功的一半”,但我们的开始并不怎么太好,不过还是努力赶上了。
通过这次实习,我们学到了很多东西。
在进行课程设计时,我们应该做到以下三点:
首先,我认为最重要的就是认真的研究老师给的题目。
其次,在老师讲解的基础上认真研究硬件电路的设计,和软件流程的设计。
最后,重点实现软硬结合的综合调试。
这次的实习算起来一共进行了两周,在这两周的时间里我们进行了硬件电路图设计,电路板的设计,以及软件的编程实现,软硬件的综合调试。
最终一个完整的课程设计成果出来了,很高兴它能按着设计的思想与要求运作起来。
当然,这其中也有很多问题,第一、不够细心。
比如在PCB制作过程中没有建立网络报表导致了部分连线没有倒入PCB板中,还有部分封装出现了错误。
第二,实践环节上,这次课设是对我所学的理论课程的一次检验,对于这次单片机综合课程实习,使我们的动手能力得到提升,同时纠正我们对“系统”这一概念以往的错误理解。
就实现功能来说,设计结果能够符合题意,成功完成了此次实习要求,我们不只在乎这一结果,更加在乎的,是这个过程。
这个过程中,我们花费了大量的时间和精力,更重要的是,我们在学会创新的基础上,同时还懂得合作精神的重要性,学会了与他人合作。
在已度过的大学时间里,我们大多数接触的是理论课。
我们在课堂上掌握的仅仅是专业课的理论知识,如何去锻炼我们的实践能力?
如何把我们所学的专业基础课理论知识运用到实践中去呢?
我想做类似实习就为我们提供了良好的实践平台。
同时这次实习给我们带来了很多启发:
首先,查阅资料的必要性。
在做本次实习的过程中,我们感触最深的当属查阅大量的设计资料了。
为了让自己的设计更加完善,查阅这方面的设计资料是十分必要的,同时也是必不可少的。
我们是在做单片机实习,但我们不是艺术家,他们可以抛开实际尽情在幻想的世界里翱翔,而我们一切都要有据可依,有理可寻,不切实际的构想永远只能是构想,永远无法升级为设计,我们能做的就是理论结合实际。
其次,在这次课程设计中,我们运用到了以前所学的专业课知识,如:
模拟和数字电路知识等。
虽然过去从未独立应用过它们,但在学习的过程中带着问题去学我发现效率很高,这是我做这次课程设计的又一收获。
再次,在实习之前,我们要对所用单片机的内部结构有一个系统的了解,知道该单片机内有哪些资源;
要有一个清晰的思路和一个完整的的软件流程图;
在设计程序时,不能妄想一次就将整个程序设计好,反复修改、不断改进是程序设计的必经之路;
要养成注释程序的好习惯,一个程序的完美与否不仅仅是实现功能,而应该让人一看就能明白你的思路,这样也为资料的保存和交流提供了方便;
在实习过程中遇到问题是很正常的,但我们应该将每次遇到的问题记录下来,并分析清楚,以免下次再碰到同样的问题。
但是从中学到的知识会让我受益终身。
发现、提出、分析、解决问题和实践能力提高都会受益于我在以后的学习、工作和生活中
最后,我们在这次实习中我们使用了分模块焊接,分模块测试的方法进行硬件电路的焊接和测试,这是我们最宝贵的收获,这样做可以避免走很多弯路。
使得调试也条理分明。
总体上说,这次实习中收获很多,感触也很多。
参考文献
[1]刘凤然.基于单片机的超声波测距系统[J].
[2]胡汉才.单片机原理及其接口技术[M].北京:
清华大学出版社
[3]谭洪涛,张学平.单片机设计测距仪原理及其简单应用[J]