电子计步器【毕业论文】

电子计步器【毕业论文】

ID:464314

大小:3.23 MB

页数:39页

时间:2017-08-05

上传者:U-944
电子计步器【毕业论文】_第1页
电子计步器【毕业论文】_第2页
电子计步器【毕业论文】_第3页
电子计步器【毕业论文】_第4页
电子计步器【毕业论文】_第5页
资源描述:

《电子计步器【毕业论文】》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库

本科毕业设计(20届)电子计步器摘要 步行是一种最简单也是最好的健身锻炼方法之一。医学专家统计得出,现代人一天大约有300千卡的多余热量,如果每天步行一万步,就意味着可以把这些过剩的热量消耗光。而说时容易,做时难,没有量化的数据,指根据自己的感觉来判断运动量的大小是有欠缺的。这时需要一组数据来告诉我们运动量的大小,例如步数,路程,消耗的热量等。然而计步器就像一个贴身的健身教练,告诉你运动量的大小,指导你如何科学的锻炼。这样就保证了步行锻炼的质量,达到应有的健身效果。计步器系统主要是包括计数器和传感器。设计计数器,分别运用了数字电路和编程单片机两种方法。在数字电路设计方法中,运用74LS192,CD4511,CD4011和数码显示管组成了计数器电路,并通过protel进行计数器印刷电路板的设计。在编程单片机设计方法中,运用了C8051F000系统,并用C语言对其进行编程,实现计步数,计路程,计算速度,计算耗能并且通过数码管显示数据。设计传感器,主要研究了干簧管振动传感器的制作方法,了解了加速度传感器在计步器中的运用。关键词:科学步行锻炼;计步器;数字电路计步器;编程单片机计步器; AbstractWalkingisoneofthesimplestandbestfitnesstrainingmethods.Themedicalexpertcountsobtains,modernpeopleonedayprobablyhas300kilocalorieunnecessaryquantityofheats,ifwalkseveryday10,000steps,meansmaythesesurplusheatexhaustionlight.Butsaidtimeeasy,doeswhendifficult,doesnothavethequantificationdata,referstoactsaccordingtoownfeelingtojudgethephysiologicalloadofexercisethesizetohaveisshort.Bynowneededagroupofdatatotellusthephysiologicalloadofexercisethesize,forexamplestep,distance,consumptionquantityofheatandsoon.Howeverthepedographlookslikeanexttotheskinthefitnesstraining,notonlytellsyouthephysiologicalloadofexercisethesize,butalsohowisinstructingyouscientificexercise.Thishadguaranteedthewalkexercise'squality,achievestheproperfitnesseffect.Thepedographsystemismainlyincludesthecounterandthesensor.Thedesigncounter,hasutilizedthedigitalcircuitandtheprogrammingmonolithicintegratedcircuittwomethodsseparately.Inthedigitalcircuitdesignmethod,hascomposedthecounterelectriccircuitusing74LS192,CD4511,CD4011andthedigitaldisplaytube,andcarriesonthecounterprintedwiringboardthroughprotelthedesign.Intheprogrammingmonolithicintegratedcircuitdesignmethod,hasutilizedtheC8051F000system,andcarriesontheprogrammingwiththeClanguagetoit,realizescountsthestep,countsthedistance,thecomputationspeed,thecomputationconsumesenergy,andthroughnixietubedemonstrationdata.Designsthesensor,mainlystudiedhasdonethereedpipesoscillationpick-up'smanufacturemethod,hasunderstoodaccelerationinstrument'sinpedographutilization.KeyWords:Sciencewalkexercise;Pedograph;Digitalcircuitpedograph;Programmingmonolithicintegratedcircuitpedograph; 目录1概述11.1课题研究背景及意义11.2现有技术分析11.3研究开发和论文内容22基于数字电路计步器的分析与设计42.1基于数字电路计步器的分析42.2基于数字电路计步器的设计52.2.1原理图的绘制与实物焊接52.2.2PROTEL入门与计数器PCB板制作72.3本章小结133Protel工业生产应用144基于单片机计步器的设计164.1基于单片机计步器设计的分析164.1.1设计系统的选择164.1.2编程语言的选择164.1.3设计环境的选择164.1.4系统设计思路构建164.2系统整体设计205计步器的传感器的分析与设计226测试结果与拓展247结论25致谢26参考文献27附录1主要源程序代码28 1概述1.1课题研究背景及意义步行是一种最简单也是最好的健身锻炼方法之一,这已被中外运动医学专家所认可。步行可以增强人体的心肺功能,增强肌肉,骨骼的力量,有利于防止日后的损伤和疼痛,同时还可以缓解紧张情绪,促进人体的新陈代谢。步行的好处可能很多人都知道,但是科学的步行又有多少人知道呢?可以说很多人都是盲目的运动。不能很好的把握锻炼的方法和要领,根据自己的感觉来判断运动量,这就会导致运动量的不够或者过量,反而不能达到应有的健身效果。特别要关注的是老年期。以往在指导老年期的体育活动中,往往忽视对老年人健康评价以及锻炼量的有效控制,由于老年期适应能力差,缓冲余地较小,如果给他们提出不适当的锻炼要求,将是有害无益的。因此掌握和分析老年期人的形态结构以及不同的机能特征,并采用科学的锻炼手段与方法,将会增进和改善各器官系统功能,从而提高和增强老年期对内外环境的适应能力。想在锻炼时保证一定的频率、强度和距离,计步器就成了人们保证步行锻炼质量的好帮手。计步器就像一个贴身的科学健身教练,根据你的身高步长,它随时随地的让你知道你已经走了多少步,多少路程,多少速度,消耗了多少热量,甚至可以测量血压和心跳等等。有了计步器,就可以让我们完成每天的运动定量,让我们的健身不再盲目。1.2现有技术分析现在对于计步器的设计方法主要有以下几种:(1)数字电子技术。由于计步器中包含了计数器的部分,所以用数字电路设计一个计数器是可以的。但是设计出来的产品仅仅提供了计步的功能,然而对于人们的需求,必须要让计步器具有更多的功能,更方便的携带。(2)编程单片机技术让计步器拥有更多的功能。代码能够根据所需要的功能进行灵活的编写。可以计算,可以设置,更可以根据需要做出显示,或者发出报警等等。 (3)如今手机已经越来越智能化,手机功能更是可以下载安装,并且手机随身携带。当然开发人员不会忘记利用这个优势来设计计步器。做一个计步器软件安装在手机上。然而最近android平台越来越受人们的喜爱,运用Eclipse来编程设计也成为了设计主流。1.3研究开发和论文内容通过了解计步器的相关原理和组成,得知计步器的设计主要包括传感器的设计和对传感器产生的信号做出处理和相应的设计。查阅相关资料后,我分别对振动传感器和加速度传感器进行了研究和分析。振动传感器运用干簧管和永磁铁来制作,但是由于发生震动后,磁铁的振动是无法控制的,从而产生的信号干扰很大,处理起来也不是很容易。所以我运用了加速度传感器。通过测量人体加速度的变化设计出来的计步器,不仅灵敏度高,准确性也高。接下来就是设计信号处理和响应了。根据现有计步器技术的资料,了解到这部分的设计主要有以下几点方法:(1)利用数字电子技术:这个方法主要是设计一个计数器来接收信号,并且对信号进行计数并显示。我需要了解计数器的设计方法。然而运用protel99se软件来绘制原理图,绘制PCB电路图以及制作PCB印制电路板使得数字电路设计的时候更接近于产品化。(2)利用单片机技术:首先我查阅单片机c8051的相关资料,熟悉Keilc51编程软件的使用,以及C语言编程基础与技巧。其次明确了设计思路,明确我需要设计的计步器功能。而外我还了解android相关资料,从中得知android开发的环境是Eclipse,从而熟悉Eclipse软件的应用以及编程技巧。并模仿教程动手进行操作。本文共分六章,主要讲述了计步器的制作方法和制作过程中所学到的知识。第一章介绍了课题研究的背景,意义和主要的工作内容。第二章介绍了基于数字电路计步器的分析与设计。第三章介绍了PROTEL工业生产方法与其计步器设计。第四章介绍了基于单片机计步器的分析与设计。第五章介绍了计步器相关传感器的研究。 2基于数字电路计步器的分析与设计2.1基于数字电路计步器的分析运用数字电路设计的计步器,主要是计数器的设计。通过加速度传感器产生信号,然后由计数器进行接收,并进行相应的处理和响应。通过资料查阅,我设计的计步器主要包括以下几个芯片:(1)74LS192是十进制可逆计数器,也是同步可预置四位计数器。它具有双时钟输入,并具有清零和置数的功能。在过去数字电路实验时,用它来设计计数器,简单,思路清晰。图2-1,2-2分别为74ls192引脚图和功能表。图中当清除(CR)为高电平时,不管计数时钟(CPD,CPU)状态如何,所有计数输出(Q0~Q3)均为低电平。当置入控制(LD)为低电平时,Q0~Q3将随数据输入D0~D3一起变化。当技术上溢(为9)并且CPU为低电平时,进位输出(CO)产生一个低电平脉冲。当计数下溢(为0)并且CPD为低电平时,借位输出BO产生一个低电平。只要把BO或CO接到后一级的CPD和CPU就可以实现多位数的计数了。图2-174ls192引脚图 图2-274ls192功能表(2)CD4511,它是用来驱动共阴数码管,只能对0-9的数字译码,超出范围将无显示,它具有BCD转换、消隐和锁存控制、七段译码及驱动功能的CMOS电路,能提供较大的电流。可直接驱动LED显示器。并且可以搭配74LS192一同使用。图为CD4511引脚图和真值表。图2-3中A1-A4为信号输入端,a-g为译码输出端。图2-4表示了输入输出的关系。图2-3CD4511引脚图图2-4CD4511真值表(3)共阴7段数码显示管,搭配CD4511一起使用。输出高电平有效。2.2基于数字电路计步器的设计2.2.1原理图的绘制与实物焊接 根据47LS192,CD4511和7段数码显示管的功能表画出计数器电路图如下所示:图2-5计数器原理图根据电路图,找导师拿取元器件,进行实物焊接。焊接结果如下图所示:图2-6实物连接图由于焊接时采用的导线太粗,而且焊接起来线路交错复杂。这样的产品十分的不美观。为了使设计更加的产品化,通过与导师的沟通,开始了PROTEL软件的安装,学习与操作 2.2.2PROTEL入门与计数器PCB板制作由于之前从未接触过PROTEL,这样必须从头学起。首先是安装。从网站上下载PROTEL99SE,按照压缩文件中提供的安装说明进行安装。经过在网上的搜索,资料的查询,同时也去找同学询问,得到一些宝贵的信息和心得体会。1.sch库文件的添加在C盘windows中找到advsch99se.ini文件,使用记事本方式打开;在[ChangeLibraryFileList]中找到Count=1,下面的File0等一串东西就是系统已添加的库文件MiscellaneousDevices.ddb,下面是ini文件的相关信息:[ChangeLibraryFileList]…Count=1File0=D:DesignExplorer99SELibrarySchMiscellaneousDevices.ddb下面就是修改方法:以添加ProtelDOSSchematicLibraries.ddb这个为例[ChangeLibraryFileList]Count=2File0=D:DesignExplorer99SELibrarySchMiscellaneousDevices.ddbFile1=D:DesignExplorer99SELibrarySchProtelDOSSchematicLibraries.ddb说明:因为添加了文件,所以count的数值要改成2;改写成File1,而且路径和名字都要正确;添加多个文件就以此类推。2.pcb库文件添加在C盘windows中找到advpcb99se.ini文件,使用记事本方式打开;在[PCBLibraries]中找到Count=1,下面的File0等一串东西就是系统已添加Advpcb.ddb里的PCBFootprints.lib库文件。[PCBLibraries]Count=1File0=D>MSACCESS:$RP>D:DesignExplorer99SELibraryPcbGenericFootprints$RN>Advpcb.ddb$OP>$ON>PCBFootprints.lib$ID>-1$ATTR>0$E>PCBLIB$STF>下面以添加Miscellaneous.ddb这个为例: [PCBLibraries]Count=2File0=D>MSACCESS:$RP>D:DesignExplorer99SELibraryPcbGenericFootprints$RN>Advpcb.ddb$OP>$ON>PCBFootprints.lib$ID>-1$ATTR>0$E>PCBLIB$STF>File1=D>MSACCESS:$RP>D:DesignExplorer99SELibraryPcbGenericFootprints$RN>Miscellaneous.ddb$OP>$ON>Miscellaneous.lib$ID>-1$ATTR>0$E>PCBLIB$STF>说明:因为添加了文件,所以count的数值要改成2;改写成File1,而且路径和名字都要正确,需要分别对ddb和lib文件的名称修改,红色的地方就是要你填空了;添加多个文件就以此类推。到这里PROTEL软件的安装就完成了,接下来就是入门应用了,这也是最关键的部分首先,我上网搜索了PROTEL的视频教程,然后一边看一边跟着操作,并且从中认识到制作PCB印刷版的基本步骤,以及相应步骤的有关设置和规则。然后视频看完后,再去找老师询问。从老师那得到了PROTEL的相关资料,还有一些常用的封装。下面我简单介绍我从中学习到的知识和应用。PROTEL的应用主要分为一下几个步骤:首先是创建新的文档,先创建一个.ddb的文件,然后在这个.ddb的文件中创建设计文件,点击新建文件后会出现提示框,结合我的设计,我只需要用到两个文件,一个是PCBDuconment,一个是SchematicDuconment。这两个文件,前者是设计PCB印刷电路板的设计,后者是原理图的设计。其次是原理图的设计。这原理图就相当于电路图,在PROTEL的库文件中找到电路中所需要的元件,并且依照电路图,依次把各个元件连接起来。在此过程中,由于库文件中的元器件是有限的,设计中会需要一些库文件没有的元件,那么就需要自己绘制元器件。但由于我是初学者,在绘制前需要上网查找相关创建新元件的资料和方法。其次是了解所需元件的模型和引脚图,从而进行绘制。原理图画好之后,要点击工具,再点击ERC,对其进行电气检查,查找是否有未连接的,连接错误的,元件名字重复的等一些错误。 然后下一个步骤就是给元器件选择封装,我觉得这是重点也是难点,封装直接影响的是PCB板元器件的焊接,如果封装距离不够,或者距离太近,或者插孔不对,都会导致最后元器件的焊接。第一步就是新建PCB文件,点击新建,选择PCBDUCONMENT,之后在库文件中找到所要用的封装,记住封装名字后,双击元器件,在FOOTDRINT里面填写上封装的名字。如果库文件中没有符合的封装,就要自己绘制封装,点击库文件中的其中一个封装,点击EDITER,点击工具,选择新建,点击CHANGE后就能绘制了,绘制之前可以上网查封装的大小,也可以自己量取。做好封装后,取名,保存。在元件的FOOTDRINT中输入相应名称就好,但是封装引脚名称一定要和元件引脚名称一致,不然后续工作中会报错。封装输入完成后,接下来就是PCB板的制作了,点击设计,选中UPDATEPCB,之后会弹出对话框,点击PREVIEWCHANGE,然后系统就会对元器件进行检查。检查封装有没有全部输入,检查封装引脚和元器件引脚是否一致。如果有错误,就会显示错误,从而对其进行修改,如果检查无误,那么就点击EXECUTE,从而产生网络网表。接下来就是绘制PCB印刷版了。根据视频教程的学习,以及与老师的沟通,入门主要是画单面板。而PCB板包括很多层,一般只用得到keepoutlayer层,toplayer层和bottomlayer层。首先在keepoutlayer层规定出板子的大小,形状,相当于边界。然后之前把产生的网络网表移动到画好的框内,然后排列各个封装。然后点击设计,选择规则,在里面可以设置线的宽度,线与线之间的距离,线与元件的距离等等。最后在toplayer层或者bottomlayer层划线,由于是初学,所以设计时用的是自动布线,但是缺点就是如果元件太多,自动布线就需要很大的空间,否则总会有线交叉,从而出现错误,而且自动布线的走线不是很好看。手动布线可以任意自己设计布线思路,还可以运用跳线来解决线路交叉的问题,并且所需要的空间可以自己调整。布线完成后点击工具,选择设计规则检查,在对话框中点击RUNDRC就可以检查是否与规则相符,是否有重叠,相交的错误,检查无误后就可以打印了,点击打印,会出现打印预览,只需打印toplayer层和bottomlayer层,还有把焊盘的孔打印出来。这样PCB印刷版的绘制就完成了。根据protel设计步骤,我设计了计数器的PCB印制电路板。 (1)绘制原理图图2-7计数器原理图1图2-8计数器原理图2(2)产生网络表文件: 图2-9计数器网络网表(3)布线图2-10布线1图2-11布线2图中显示绿色的部分就是线有交叉,我的解决方案就是使用跳线,放置两个焊盘,PCB板做出来后,外部接条线,连接起来就好。然后在网上购买复印纸和PCB板后,去询问老师,让老师讲解板子制作的过程。PCB印刷版就做好后,最后把元器件都焊接到板子上,这样计步器电路的PCB印刷版就制作完成了。结果如下图所示: 图2-12计数器印制电路板由于单面板的自动布线无法将所有的元器件都布在同一块大小规定好的板子上,所以才用了两块板子,最后将两块板子通过外部导线连接到一起。2.3本章小结本章讲述了基于数字电路计步器的分析与设计,从选择要用到的元器件到了解元器件,画出电路图;从纯手工的线路焊接到PROTEL软件的学习,最后到制作出PCB印刷电路板,中间的每一步,都标志着设计的不断改进和知识的扩展。最重要的是从中学会了PROTEL软件的基本使用和PCB印刷版的制作。 3Protel工业生产应用现代社会,由于电子产品的飞速发展,protel软件得到了非常广泛的应用,更是涌现很多PCB工程师。生产的电子产品在追求外形的美观,携带更方便等等要求,让PCB印制电路板不得不根据外形改动,并且大小越做越小,所以在PCB布线的时候,单层板已经不能满足用户的要求,必须要用多层板来完成。而且在多达几十,几百,甚至几千个元件,要安放在一块小小的PCB板上,单层板是不可能做到的。在我的设计中,也想让它更贴近生活,更有工业生产的价值和趋势,我对之前的PCB印制电路板做了更进一步的改善,手动绘制了双层板。不仅把两块板子的元器件合在一块板子上,还让它的大小做到了5(cm)*7(cm)。如图所示:图3-1基于工业生产的PCB印制电路左图显示的是顶层,右图显示的是底层。一般来说,在工业设计中,如果顶层走线是横的,那么底层走线就是竖的;如果顶层走线是竖的,那么底层走线就是横的。 本次布线用的是手动布线。在工业生产中,走线之间的距离,网络线的宽度,电源线的宽度等等有严格的要求,所以手动布线非常灵活,随心所欲,遇到走线问题,解决起来方便容易,更重要的一点就是手动布线可以让走线的外观很好看,不凌乱。在本次改进过程中,还添加了铺地的工作。铺地的作用主要是以下几点:(1)屏蔽;(2)散热;(3)加固;(4)PCB工业加工的需要。像这样做出来的PCB板就严谨很多了,看上去也很舒服。但是由于学校只能做单面板,所以改进后的PCB印制电路板没有做成产品。 基于单片机计步器的设计4.1基于单片机计步器设计的分析4.1.1设计系统的选择上一章介绍了数字电子技术设计的计步器,但是制作出来后,只能进行简单的计数功能,然而就想再进一步完善计步器的功能,让它能够对输入的信号进行统计。由于设计的东西是面向用户的,所以也需要增加一些用户可设置的功能。综上所述,我联想到之前电子综合设计的课程设计,学习了在C8051F000系列器件上进行设计的一些方法,从而我就利用这套系统来完善计步器的设计。4.1.2编程语言的选择由于C8051F000系列器件使用的是CIP-51微控制器内核。CIP-51与MCS-51指令集完全兼容。由于我对C语言更熟悉一些,而且C语言简洁紧凑,灵活方便,是结构式的语言,在结构上条理清晰,所以选用的是C语言进行编程。4.1.3设计环境的选择开发环境我用的是SiliconLaboratoriesIDE,原因之一是SiliconIDE作为一款Silicon官方出的软件,无论是是兼容性、还是对新型号芯片的支持都是最好的,并且是专门针对C8051F系列芯片而设计的软件。使用SiliconLaboratoriesIDE的另外一个原因是,Keil可以嵌入在SiliconIDE内使用,组成一个即可C编译又可以进行下载、仿真的平台,功能与易用性都得到了极大的提升。这个软件的功能是编写代码,然后把编写好的代码通过串口写进C8051F000系统里,从而在系统上测试是否符合自己所设计的要求。4.1.4系统设计思路构建在程序设计之前,都要对所要设计的东西进行逻辑化的思考,明确 设计思路。首先需要构思设计的系统总框图。通过思考,系统中包括有CPU模块,显示模块,按键模块。如图所示:图4-1系统总框图(1)在CPU模块中,主要包括了定时器模块,PCA寄存器模块。(a)在定时器模块中,我运用了定时器0和定时器2,定时器0是用来定时的,用它来完成时钟的工作。定时器2是用来计数的,用它来完成脉冲信号的处理。编程代码如下:voidTimer0_Init(void){CKCON&=0x08;定时器0时钟选用系统时钟的12分频TMOD=0x01;定时器0方式寄存器选用16位定时器TCON=0x10;定时器0控制寄存器允许TH0=TIMER_RELOAD>>8;定时器0高字节TL0=TIMER_RELOAD;定时器0低字节ET0=1;开启定时器0中断}voidTimer2_Init(void){CKCON=0x00;T2CON=0x04;定时器2允许TH2=TIMER_RELOAD>>8;TL2=TIMER_RELOAD;RCAP2H=TIMER_RELOAD>>8;RCAP2L=TIMER_RELOAD;//自动重载值,ET2=1;//开启定时器2中断}(b)PCA寄存器模块中,我主要是用它来存放脉冲信号的PWM值,中断对此值做出响应并且输出脉冲宽度调制信号。编程代码如下: voidPCA_Init(void){PCA0MD=0x00;//禁止CF中断PCA0CPL0=pwm;//初始化PCA的PWM值PCA0CPH0=pwm;PCA0CPL1=pwm;//初始化PCA的PWM值PCA0CPH1=pwm;PCA0CPM0=0x42;//比较器功能使能并且允许输出脉冲宽度调制信号PCA0CPM1=0x42;PCA0CN=0x40;//允许PCA计数器并且允许中断(2)显示模块,用它来完成信号处理后数据的显示工作。运用写的方式让数码管显示。编程代码如下:voidwrite(intaddr,intdatain){charpp;PRT2CF|=0xff;pp=addr;pp|=0xA0;P1=pp;P2=datain;wr=1;wr=0;}(3)按键模块,通过按键设置身高,体重,时间,通过按键显示时间,步数,路程等。按键模块的设计,我认为要从流程图入手,有了流程图,就能按照流程图的思路,对各个按键进行编程设计。流程图包括顺序结构,分支结构,和循环结构。程序流程图表示程序中的操作顺序。进过思考,按照设计计步器所需要的功能,我画出了如下的按键流程图: 开始按1键加数按键4=1?设置步长个位/(cm)是按2键减数否按1键加数按键4=2?设置步长十位/(cm)是按2键减数否按1键加数按键4=3?设置步长百位/(cm)是按2键减数否按1键加数按键4=4?调整时钟小时是按2键减数否按1键加数按键4=5?调整时钟分是按2键减数否按键4=6?是计时调零并开始计数计时否 是按键3=1?显示时间否是按键3=2?显示路程否是按键3=3?显示步数否是按键3=4?显示时长否图4-2系统按键流程图4.2系统整体设计设计一个计步器的程序,首先最主要的就是考虑它计数的功能,在这个基础之上,再去考虑实现其它的功能,例如计算路程,计算时间,计算耗能等等。考虑好最主要的功能之后,就可以通过按键的设计,完善整个计步器的功能。根据之前设计电机转动并显示转速的经验,也就是电机转动能输出脉冲信号,从而被单片机接收,并对此脉冲信号进行处理的方法,让我有了设计的灵感:首先由单片机产生PWM波,调整它的频率,让它大于人步行或跑步的最大频率,这样就可以保证人体每一次震动,单片机都会接收到一次信号。 否则可能会出现,正好需要计步的时候,频率等于0。然后设计一个接收端,并对其处理和做出响应。思路如下:接收到脉冲信号之后,这个时候的频率是大于零的,所以只要当接收端的频率大于零,就可以计数一次,以此类推,一直计数。同时并对其进行计时。所计的这个数,也就是所走的步数。有了步数的统计,通过用户设计的步长,就能计算出所走的路程。通过所计时间,就能计算出当前平均速度。通过用户设计的体重和身高,根据公式0.43*身高+0.57*体重+0.26*步频+0.92*时间-108.44就可以计算出所消耗的能量了。最后通过按键的设计,把需要显示的数据,显示出来。按键设计如流程图所示。一共有四个按键,按键1是数字加键、按键2是数字减键、按键3是显示键、按键4是功能选择键。当按键4按一下时,按键1和按键2可以设置步长的个位;当按键4按两下时,按键1和按键2可以设置步长的十位;当按键4按三下时,按键1和按键2可以设置步长的百位;按键4按四下时,按键1和按键2可以设置当前时间的小时;当按键4按5下时,按键1和按键2可以设置当前时间的分钟;当按键4按6下时,开始计步并且按键3按一下可以显示当前时间、按键3按两下时可以显示路程、按键3按3下时可以显示步数、按键3按4下时可以显示步行时长。当按键4按七下时,又回到设置,如此循环。 5计步器的传感器的分析与设计从相关资料了解得到:振动传感器的主要原件是干簧管和永久磁体。如下图所示,在一个中空塑料圆管内固定一个干簧管2,在管4的下面再固定一个环形磁铁,在其上面装有处于浮动状态下的环形磁铁组1,它的内径要比中空管的外径大0.5mm。调整磁铁5的位置,使在垂直静止状态下的干簧管接点开路。这样由于震动,磁铁组1会上下振动,使干簧管的接点不断闭合。图5-1振动传感器设计但是此方法在实际输出的时候,存在走一步会出现多个振动,永磁铁的振动不好控制的缺点,从而使脉冲信号混叠,处理起来很不方便。因此又从其他资料中查到加速度传感器。应用加速度传感器,通过测量人体行走时加速度的变化,来达到计步的功能。ADXL330是一个三轴(X轴、Y轴和Z轴)模拟输出的加速度传感器,正好可以作为垂直、前向和侧向三个方向的传感器。如图所示,ADXL330X、Y、Z三轴的数据输出就代表了人体行走三个方向的加速度曲线。从图中我们可以看到三个方向中垂直方向(Z轴)具有明显的周期特性。定义的αv,βv,γr分别为垂直方向和X、Y、Z轴的夹角,因此可以得到垂直方向的加速度X、Y、Z。垂直方向(Z轴)加速度曲线更为明显。把Z轴输出的脉冲信号通过A/D转换输入到单片机中,并进行处理,从而实现计步器的设计。 图5-2人体走路时ADXL330三轴数据输出通常来讲,人体每秒钟行走O.5~2步,最多不超过5步。因此,合理的计步器输出为O.5~5Hz。在模拟电路部分,我们采用5Hz的抗混叠带宽来过滤高频噪声;在数字电路部分,采用5Hz截止频率的FIR低通滤波器来过滤高频噪声。另外,低通滤波器无法过滤0.5Hz以下的噪声,因此采用了时间窗口的方法来实现。把大于T1或者小于T2的频率输出都认为是噪声的影响。传感器模块的设计如图所示,由三轴加速度传感器ADXL330、AD85545(四通道运算放大器组成抗混叠滤波器)和内部集成多通道ADC的单片机组。ADXL330作为传感器来感知人体走的动作,并有X、Y、Z三个模拟输出。带宽为5Hz的抗混叠滤波器来去除高频噪声,利用单片机内部三通道的ADC对三个模拟输出进行采样,同时利用一个数字输出管脚作为ADXL330的电源。图5-3传感器模块 6测试结果与拓展在数字电子技术方面,根据资料得来的原理图,虽然对原理图也有深入研究,包括各个引脚的功能,但是绘制成的PCB印制电路板,经过对线路连接的反复检查,检查也没有什么问题,但是数码管无法显示,用电压表测量,74192没有输出,最终失败了。在单片机设计方面,所使用的SiliconLaboratoriesIDE软件,各项设置正确,代码编译无误,可是显示代码字节太大,无法将代码烧入单片机中。询问老师,也按照老说的建议,用导入keilc文件的方法,估计是自己对软件还是不熟悉,而导致了代码还是无法载入。在传感器的设计方面,用干簧管设计出来的振动传感器,由于输出的脉冲信号干扰太大,也没有设计加速度传感器的条件,所以传感这部分可以用一个手动开关进行代替,每走一步按一下开关。只要设计一个脉冲发生器,例如文中所述的555设计脉冲发生器,编程单片机产生PWM波。开关闭合,就相当于产生了一个脉冲信号。如今,智能手机已经成为了一种发展趋势,把软件做在手机上方便又时尚。因此,在网上我查找了手机计步器的软件,并下载安装,使用之后对android的开发产生了兴趣。通过视频教程,我安装了android开发环境eclipse,并从图书馆借阅相关书籍,学习了eclipse的入门,并按照书中方法进行编写,在模拟机上观看效果。 7结论本次设计按照任务书的要求,系统由振动传感器和电子计数器组成。人在走路时重心上下移动,通过手动开关,输出信号,然后传给芯片,从而完成计数和计算。首先是对计数器的研究,通过查找资料,画出计数器的原理图。由于全手工的焊接不成功,因此选用了protel绘制PCB印制电路板,但也由此我学会了protel的使用。简单的计数器功能还不能够完善,如果想要设计计数,计算和显示的功能,就必须依靠单片机,通过回忆之前电子综合设计的课程,从而让我在编程方面上手很快,整理出思路,画出流程图,根据流程图,对每一个部分进行设计,最后把每一个部分结合起来,完成总的编程设计。在测试的时候遇到了一些问题,例如原理图的正确与否,设计具备的条件不足,对SiliconLaboratoriesIDE软件的应用还不熟等。虽然这次设计没有做出作品,但是从毕业设计中学到很多。包括Protel的使用,eclipse的入门等。锻炼了我自主学习,学以致用的能力,这是毕业设计的目的。 参考文献[1]唐文彦.传感器第四版[M].北京:机械工业出版社,2006,7.[2]李道华等.传感器电路分析与设计[M].武汉:武汉大学出版社,2000,3.[3]梁渊等.传感器应用电路集萃[M].北京:中国电力出版社,2008.[4]松井邦彦.传感器实用电路设计与制作[M].北京:科学出版社,2005.[5]吴兴惠.传感器与信号处理[M].北京:电子工业出版社,1998,8.[6]丁镇生.传感器及遥控遥测技术应用[M].北京:电子工业出版社,2003.[7]陈尔绍.传感器实用装置制作集锦[M].北京:人民邮电出版社,1999,10.[8]王煜东.传感器应用电路400例[M].北京:中国电力出版社,2008.[9]宋浩然,廖文帅,赵一呜.基于加速度传感器ADXL330的高精度计步器[J].传感技术学报,2006,8.[10]缪建奇.老年期身体形态机能及体育锻炼的评价与控制[J].淮阴师范学院学报,2002.[11]长乐,电子计步器-让健身不再盲目[EB/OL],[2009-1].http://www.cnki.net.[12]ADXL330Datasheet[EB/OL]AnalogDevicesInc,Norwood,MA.http://www.analog.com.[13]张利国.Android移动开发入门与进阶[M].人民邮电出版社,2009,1.[14]施惠琼.实用数字电子技术[M].清华大学出版社,2006,10. 附录1主要源程序代码#include#defineSYSCLK11059200#defineTIMER_PRESCALER12#defineLED_TOGGLE_RATE10#defineTIMER_TICKS_PER_MSSYSCLK/TIMER_PRESCALER/1000#defineAUX1TIMER_TICKS_PER_MS*LED_TOGGLE_RATE#defineAUX2-AUX1#defineTIMER_RELOADAUX2sfr16RCAP2=0xCA;sfr16TMR2=0xCC;sbitrd=P1^7;sbitre=P1^5;sbitwr=P1^6;sbitaddr0=P1^0;sbitaddr1=P1^1;sbitaddr2=P1^2;sbitaddr3=P1^3;sbitaddr4=P1^4;sbitdata0=P2^0;sbitdata1=P2^1;sbitdata2=P2^2;sbitdata3=P2^3;sbitlcd_en=P3^0;sbitphase1=P0^6;inti1=8,i2=8,i3=1,i4=0,i5=0,i6=0,i7=0,pwm=0x80;intn=0,m=0,l=0;inthour=0,minute=0,second=0,percent=0;unsignedlongintfreq,freql,freqh; intjs=0,b1=0,b2=0,b3=0;intlc=0;inthour1=0,minute1=0,second1=0,percent1=0;voidwrite(intaddr,intdatain);unsignedintread();voidOSCILLATOR_Init(void);voidPORT_Init(void);voidTimer0_Init(void);voidTimer2_Init(void);voidPCA_Init(void);voiddelay(inttime_ms);voidTimer0_ISR(void)interrupt1{TH0=TIMER_RELOAD>>8;TL0=TIMER_RELOAD;percent++;if(percent==100){percent=0;second++;second1++;}if(second==60){second=0;minute++;}if(minute==60){minute=0;hour++;}if(second1==60){second1=0;minute1++;}if(minute1==60){minute1=0;hour++;}TF0=0;write(1,hour%10);write(2,(hour/10)%10);write(3,minute%10);write(4,(minute/10)%10);write(5,second%10); write(6,(second/10)%10);}voidTimer2_ISR(void)interrupt5//定时器2中断处理函数,2为定时器2的终端号{percent1++;if(percent1==100){percent1=0;TR0=0;freql=TH0;freql=freql<<8|TL0;TH0=0;TL0=0;percent1=0;freqh=freql;if(freqh>0){js++;}TR0=1;}TF2=0;}voidmain(void){unsignedinttemp1,temp2,xor1,wei1,wei2,temp_wei;WDTCN=0xde;WDTCN=0xad;OSCILLATOR_Init();PORT_Init();lcd_en=0;Timer2_Init();Timer0_Init();PCA_Init(); //write(0,15);temp2=read();while(1){temp1=read();if(temp1!=temp2){xor1=temp1^temp2;delay(10);temp2=read();if(temp1==temp2){wei1=xor1%2;temp_wei=temp2;if(wei1!=0){wei2=temp_wei%2;if(wei2==0){if(i4%5==1){i1=i2;i1++;b1=i1;if(i1==2){i1=0;write(4,b1%10);write(5,b2%10);write(6,b3%10);}}//设置步长if(i4%5==2){i1=i2;i1++;b2=i1;if(i1==10){i1=0;write(4,b1%10);write(5,b2%10);write(6,b3%10);}}//设置步长if(i4%5==3){i1=i2;i1++;b3=i1;if(i1==10) {i1=0;write(4,b1%10);write(5,b2%10);write(6,b3%10);}}//设置步长if(i4%5==4){i1=i2;i1++;hour=i1;if(i1==13){i1=0;write(2,hour%10);write(1,(hour/10)%10);write(4,minute%10);write(3,(minute/10)%10);write(6,second%10);write(5,(second/10)%10);}}//设置时间if(i4%5==0){i1=i2;i1++;minute=i1;if(i1==61){i1=0;write(2,hour%10);write(1,(hour/10)%10);write(4,minute%10);write(3,(minute/10)%10);write(6,second%10);write(5,(second/10)%10);}}//设置时间}}xor1>>=1;wei1=xor1%2;if(wei1!=0){temp_wei>>=1;wei2=temp_wei%2;if(wei2==0){if(i4%5==1){i2=i1;i2--;b1=i2;if(i2==-1){i2=1;write(4,b1%10);write(5,b2%10);write(6,b3%10);}}//设置步长if(i4%5==2){i2=i1;i2--;b2=i2;if(i2==-1) {i2=9;write(4,b1%10);write(5,b2%10);write(6,b3%10);}}//设置步长if(i4%5==3){i2=i1;i2--;b3=i2;if(i2==-1){i2=9;write(4,b1%10);write(5,b2%10);write(6,b3%10);}}//设置步长if(i4%5==4){i2=i1;i2--;hour=i2;if(i2==-1){i2=12;write(2,hour%10);write(1,(hour/10)%10);write(4,minute%10);write(3,(minute/10)%10);write(6,second%10);write(5,(second/10)%10);}}//设置时间if(i4%5==0){i2=i1;i2--;minute=i2;if(i2==-1){i1=60;write(2,hour%10);write(1,(hour/10)%10);write(4,minute%10);write(3,(minute/10)%10);write(6,second%10);write(5,(second/10)%10);}}//设置时间}}xor1>>=1;wei1=xor1%2;if(wei1!=0){temp_wei>>=2;wei2=temp_wei%2;if(wei2==0){if(i4%12==0){i3++;if(i3%4==1) {write(2,hour%10);write(1,(hour/10)%10);write(4,minute%10);write(3,(minute/10)%10);write(6,second%10);write(5,(second/10)%10);}if(i3%4==2){lc=((b1*100)+(b2*10)+b3)*js;write(1,lc%10);write(2,(lc/10)%10);write(3,(lc/100)%10);write(4,(lc/1000)%10);}if(i3%4==3){write(1,js%10);write(2,(js/10)%10);write(3,(js/100)%10);write(4,(js/1000)%10);}if(i3%4==0){write(2,hour1%10);write(1,(hour1/10)%10);write(4,minute1%10);write(3,(minute1/10)%10);write(6,second1%10);write(5,(second1/10)%10);}}}xor1>>=1;wei1=xor1%2;if(wei1!=0){temp_wei>>=3;wei2=temp_wei%2;if(wei2==0){ i4++;if(i4%12==0){EA=1;TR0=1;TR2=1;write(7,0);}if(i4%6==1){write(7,4);}if(i4%6==2){write(7,5);}if(i4%6==3){write(7,6);}if(i4%16==4){write(7,5);}if(i4%6==5){write(7,3);}if(i4%6==0){write(7,0);}}}}}//endofwhile(1)}//endofmain()}}unsignedintread(){unsignedintdata_rd;PRT2CF&=0xf0;P2=0xff;rd=0;data_rd=P2; data_rd&=0x0f;rd=1;PRT2CF|=0xff;returndata_rd;}voidOSCILLATOR_Init(void){inti;OSCXCN=0x67;//使能外部时钟for(i=0;i<256;i++);//等待外部时钟稳定while(!(OSCXCN&0x80));OSCICN|=0x88;//禁止内部时钟}voidPCA_Init(void){PCA0MD=0x00;//禁止CF中断PCA0CPL0=pwm;//初始化PCA的PWM值PCA0CPH0=pwm;PCA0CPL1=pwm;//初始化PCA的PWM值PCA0CPH1=pwm;PCA0CPM0=0x42;//CCM0为8位PWM方式PCA0CPM1=0x42;//CCM1为8位PWM方式PCA0CN=0x40;//允许PCA计数器}voidPORT_Init(void){PRT1CF|=0xff;//P1.6ispush-pullPRT2CF|=0xff;//P1.6ispush-pullPRT0CF|=0xff;//P1.6ispush-pullP1|=0xa0;//SetP1.7latchto'1'XBR0=0x18; XBR1=0x02;XBR2=0x40;//Enablecrossbarandenable//weakpull-ups}voidwrite(intaddr,intdatain){charpp;PRT2CF|=0xff;pp=addr;pp|=0xA0;P1=pp;P2=datain;wr=1;wr=0;}voidTimer0_Init(void){CKCON&=~0x08;//Timer0usesSYSCLK/12TMOD=0x01;TCON=0x10;//EnableTimer0inReloadModeTH0=TIMER_RELOAD>>8;TL0=TIMER_RELOAD;ET0=1;//Timer0interruptenabled}voidTimer2_Init(void){CKCON=0x00;//定时器2时钟选用系统时钟的12分频T2CON=0x04;TH2=TIMER_RELOAD>>8;TL2=TIMER_RELOAD;//装载定时器2的装载值 RCAP2H=TIMER_RELOAD>>8;RCAP2L=TIMER_RELOAD;//自动重载值,ET2=1;//开启定时器2中断}voiddelay(inttime_10ms){for(n=0;n<=time_10ms;n++){for(m=0;m<=10;m++){for(l=0;l<=80;l++);}}}

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
大家都在看
近期热门
关闭