版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
分类号:TM93编号:BY15611913/14/212-1002沈阳化工大学本科毕业论文题目:基于单片机的光纤智能位移计院系:专业:班级:学生姓名:指导教师:论文提交日期:2014年06月23日论文答辩日期:2014年06月25日论文独创性声明本人郑重声明:此处所提交的学位论文是本人在导师指导下,在沈阳化工大学本科毕业环节独立进行研究工作所取得的成果。据本人所知,论文中除已注明部分外不包含他人已发表或撰写过的研究成果。对本文的研究工作做出重要贡献的个人和集体,均已在文中以明确方式注明。本声明的法律结果将完全由本人承担。作者签名:日期:年月日关于学位论文使用授权的说明本论文的研究成果归沈阳化工大学所有,本论文的研究内容不得以其它单位的名义发表。本学位论文作者和指导教师完全了解沈阳化工大学有关保留、使用学位论文的规定,即:学校有权保留并向国家有关部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅;本人授权沈阳化工大学可以将论文的全部或部分内容编入有关数据库进行检索、交流,可以采用影印、缩印或其他复制手段保存论文和汇编本学位论文。(保密的论文在解密后应遵循此规定)作者签名:导师签名:日期:年月日毕业设计(论文)任务书专业班学生:毕业设计(论文)题目:基于单片机的光纤智能位移计毕业设计(论文)内容:以单片机AT89C52为基础,加以A/D转换,声光报警以及按键和显示等外围器件,设计一款应用于微小距离测量的光纤智能位移计。毕业设计(论文)专题部分:1、智能位移计的硬件设计2、智能位移计的软件设计3、应用proteus进行仿真调试起止时间:2014年3月2014年6月指导教师:签字年月日教研主任:签字年月日学院院长:签字年月日摘要目前有很多位移测量的方法,光纤测位移测量是众多位移测量方法中发展较快、应用较多的一种。其中,反射式光纤测位移是发展较早且技术相对成熟的一种,选用此原理制成的光纤位移传感器具有抗电磁干扰能力强、灵敏度高、结构简单、体积小、质量轻、耐腐蚀、防爆等一系列独特的优点[1]。因此,本设计采用反射式光纤位移传感器,制成专用于微小距离测量的光纤智能位移计。系统的设计主要分为两部分,第一部分为硬件电路的器件选取与设计,第二部分为软件整体设计与具体程序编写与调试。其中,硬件电路选用了AT89C52单片机作为系统的控制中心,通过数据采集电路对位移量进行实时采集、通过MCP3001A/D转换电路对采集的模拟信号进行转换,通过LCD1602进行提示信息与数据的显示,通过行列式键盘实现人对光纤智能位移计的控制,同时还设计有上下限报警电路和独立复位按钮等。软件设计中,整体采用模块化设计,主要划分为按键处理模块、A/D转换部分、数据处理部分、LCD显示部分等。其中,每种模块在设计时又均采用子程序调用的方法,从而使得软件的编程更加高效、精简。同时采用C语言进行程序编写,大大增加了程序的可读性,使得软件调试变得较为方便。本设计主要采用PROTEUS进行硬件的设计及其仿真,采用Keil进行程序编写。在设计中,首先进行PROTEUS中的硬件系统搭建,在搭建完成后进行仿真运行,检查硬件系统搭建是否合理。在硬件搭建合理的前提下,阅读相关芯片的编程学习资料,并运用C语言在Keil中进行模块化程序设计。在每部分的软件编程完成后,都运用PROTEUS与Keil进行联合调试,确保其能完成设计所需的功能。为了使调试更加直观简便,在调试的过程中,我们按照显示部分、按键部分、A/D转化部分、数据采集的顺序进行,后面的部分以前面的部分为基础。整个设计完成后进行了软硬件的联合调试,最终实现了对位移的实时测量。关键词:单片机;光纤位移传感器;位移测量;PROTEUSAbstractTherearealotofdisplacementmeasurementmethod,opticalmeasuringdisplacementmeasurementisoneofmanydisplacementmeasurementmethoddevelopmentfaster,moreakindofapplication.Amongthem,thereflectivefiberopticdisplacementmeasurementtechnologyisrelativelymature,andtheolderone,theuseoffiberopticdisplacementsensormadeofthisprinciplehasastronganti-electromagneticinterferencecapability,highsensitivity,simplestructure,smallsize,lightweight,corrosionresistance,aseriesofuniqueadvantages,suchasproof.Therefore,thedesignusesfiberopticdisplacementsensordedicatedtothesmalldistancemeasurementsmadefiberintelligentdisplacementmeter.Designofthesystemisdividedintotwoparts,thefirstpartofthedevicetoselectanddesignthehardwarecircuit,thesecondpartistheoveralldesignandspecificsoftwareprogramminganddebugging.Amongthem,thechoiceofhardwarecircuitAT89C52microcontrollerasthesystemcontrolcenter,dataacquisitioncircuitfordisplacementofreal-timeacquisition,throughMCP3001A/Dconvertercircuitforconvertingtheanalogsignalacquisition,throughpromptLCD1602displayinformationanddatathroughdeterminantkeyboardtoachievecontrolleddisplacementmeterforfibersmart,butalsothedesignofthecircuitandaseparateupperandloweralarmresetbutton.Softwaredesign,theoverallmodulardesign,mainlydividedintokeyprocessingmodule,A/Dconversionsection,dataprocessing,LCDdisplaysectionandsoon.Whereeachmoduleareusedinthedesigntimeandmethodofsubroutinecalls,makingprogrammingsoftwaremoreefficient,streamlined.WhileusingtheCprogramminglanguage,whichgreatlyincreasesthereadabilityoftheprogram,makingthesoftwaredebuggingbecomesmoreconvenient.ThisdesignusesPROTEUShardwaredesignandsimulation,usingKeilforprogramming.Inthedesign,firstPROTEUShardwaresystemconstruction,builtafterthecompletionofthesimulationrun,checkthehardwaresystemsetupisreasonable.Inthecaseofhardwaretobuildareasonablepremise,Readchipprogramminglearningmaterials,andtheuseofClanguageprograminKeilinmodulardesign.Afterthecompletionofeachpartofsoftwareprogramming,allusingPROTEUSwithKeiljointcommissioning,ensurethatitcancompletethedesignoftherequiredfunctionality.Inordertomakemoreintuitiveandeasytodebug,debuggingprocess,wefollowthedisplaysection,thekeypart,A/Dconversionsection,theorderofdataacquisition,withthebackpartofthefrontpartofthefoundation.Afterthecompletionoftheentiredesignofthejointcommissioningofhardwareandsoftware,andultimatelyachievereal-timemeasurementofdisplacement.
Keywords:microcontroller;fiberopticdisplacementsensor;displacementmeasurement;PROTEUS目录第一章绪论 第二章光纤智能位移计的测量原理2.1结构原理反射式光纤位移传感器是一种传输型光纤传感器。其原理如图2-1所示:光纤采用Y型结构,两束光纤一端合并在一起组成光纤探头,另一端分为两支,分别作为光源光纤和接收光纤[16]。光从光源耦合到光源光纤,通过光纤传输,射向反射片,再被反射到接收光纤,最后由光电转换器接收,转换器接受到的光源与反射体表面性质、反射体到光纤探头距离有关[17]。当反射表面位置确定后,接收到的反射光光强随光纤探头到反射体的距离的变化而变化。显然,当光纤探头紧贴反射片时,接收器接收到的光强为零[18]。随着光纤探头离反射面距离的增加,接收到的光强逐渐增加,到达最大值点后又随两者的距离增加而减小。图2-2所示就是反射式光纤位移传感器的输出特性曲线,利用这条特性曲线可以通过对光强的检测得到位移量。图2-1反射式位移传感器原理图2-2反射式光纤位移传感器输出特性光纤位移传感器的位移、输出电压特性曲线呈如图2.2所示的抛物线形,由图可以看出,其输出曲线有一个前坡和一个后坡。两个坡的线性都很好,顶部域线性很差,因此可以利用其线性较好的前后坡进行测量,目前国内外所使用的光纤位移传感器仅仅是利用其线性较好的前坡[19]。2.2光纤位移传感器原理本设计采用的是传光型光纤,它由两束光纤混合后,组成Y型光纤,半圆分布即双D型一束光纤端部与光源相接发射光束,另一束端部与光电转换器相接接收光束。两光束混合后的端部是工作端亦称探头,它与被测体相距X,由光源发出的光纤传到端部出射后再经被测体反射回来,另一束光纤接收光信号由光电转换器转换成电量,而光电转换器转换的电量大小与间距X有关,因此可用于测量位移[20]。光纤位移传感器结构图如图2-3所示,由其结构我们可以看出,由光纤位移传感器制作的光纤智能位移计比较适宜测量微小距离,其电气原理图如图2-4所示。图2-3光纤传感器安装示意图图2-4光纤位移传感器接线图2.3设计的工作原理一个设计的开始,首先要进行系统的总体设计,也就是是在了解系统设计的任务要求后对系统做出初步设计。认真分析任务要求,设计系统框图,并比较选择合适的光纤传感器。根据设计要求,该设计需要将光纤检测技术与计算机技术相结合,对位移进行自动测量,并能显示实时数据,光纤测位移的工作原理图如图2-5所示。图2-5工作原理设计主要包括硬件设计和软件设计两部分。首先,根据系统所要完成的功能选择硬件芯片,绘制硬件电路图,用PROTEUS软件绘制电路原理图和PCB图;其次,在完成硬件电路图的基础上,画出软件流程图;再次,根据电路原理图连接实际电路,编写程序;最后,在检查确认硬件电路无误后,分部分对软件进行调试,部分调试完成后进行整体调试,并在调试结束后进行实时位移测量和数据显示。本设计采用LCD显示,10个按键,主要选用了中央处理器AT89C52,LCD1602,MCP3001A/D转换器等。2.4光纤位移计的工作流程首先,由光纤位移传感器接收距离信号,接着将信号转换为模拟量输出,并且通过信号转换电路转换为串行A/D转换接口芯片MCP3001可接收的0~5V电压信号,并由其转换为数字量输入单片机,通过采样模块进行数据处理得到位移值,通过LCD1602实时显示出来。此外本设计有报警功能,将采样值同预先设定的报警上、下限进行比较,当超出报警范围时由单片机控制蜂鸣器发声,与此同时LCD显示“outmeasure!”,方便操作人员对检测对象的及时的准确的监控。第三章光纤智能位移计的硬件设计3.1器件选取及介绍3.1.1器件选择主要有AT89C52、LCD1602、行列式键盘、蜂鸣器、MCP30013.1.2AT89C52介绍AT89C52是一个低电压,高性能CMOS8位单片机,片内含8kbytes的可反复擦写的Flash只读程序存储器和256bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元,AT89C52单片机在电子行业中有着广泛的应用[21],其引脚如图3-1所示:图3-1PDIP封装的AT89C52引脚图单片机总共有40个引脚,根据功能可以将其分为三部分,分别为:电源与晶振引脚、控制引脚和I/O端口。连接好电源与晶振电路后,单片机可以通过控制引脚和I/O端口读取需要的信息,输出需要的控制信号。3.1.3LCD1602介绍如图3-2所示,LCD1602总共有16个引脚接口,其详细介绍如下:第1脚:VSS作为电源地,使用时接地。第2脚:VDD使用时接5V电源正极。第3脚:VEE作为1602的对比度调整端,对比度随接入电位的变高而降低。此引脚在使用时通常加一个电位器,通过控制电位将对比度控制在合理范围内,从而避免产生“鬼影”。第4脚:RS用于选择寄存器。输入为高电平(1)时选择数据寄存器,输入为低电平(0)时选择指令寄存器。第5脚:RW为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作。第6脚:E为使能端,高电平(1)时读取信息,负跳变时执行指令。第7~14脚:D0~D7为8位双向数据端。第15~16脚:空脚或背灯电源。15脚背光正极,16脚背光负极。在仿真中,这两个引脚不可以使用。图3-2LCD1602仿真图3.1.4MCP3001介绍IN+:正模拟量输入。IN-:负输入。VREF:基准电压输入。CLK:时钟输入。DO:数字量输出。—CS:片选输入。数字量输出:DO=1024*VIN/VREF其中,VIN=V(IN+)-V(IN-)其管脚如图3-3所示:图3-3MCP3001仿真管脚图3.2硬件接线图3.2.1AT89C52最小系统本设计采用手动加上电复位方式进行复位,其中,晶振的作用是为系统提供基本的时钟信号。通常一个系统共用一个晶振,便于各部分保持同步。两个引脚XTAL1和XTAL2分别是该放大器的输入端和输出端。在片外跨接一晶振和两个匹配电容C1、C2。就构成一个自激振荡器。振荡频率根据实际要求的工作速度,从几百千赫至24MHz可适当选取某一频率。匹配电容C1、C2要根据石英晶体振荡器的要求选取。当晶振频率为12MHz时,C1、C2一般选30pF左右。最小系统如图3-4所示:图3-4AT89C52最小系统图3.2.2LCD1602接口电路如图3-5所示,LCD1602由P0口驱动,其中RP1为阻排,作为上拉电阻使用。图3-5LCD1602与AT89C52连接图3.2.3MCP3001接口电路MCP3001基准电压为4V,端子连接如图3-6所示:图3-6MCP3001接口线路图3.2.4键盘接口电路键盘由行列式按键组成,由P2口控制,具体连接图如图3-7所示:图3-73x3行列键盘连接图3.2.5报警电路报警电路硬件连接见图3-8,使用蜂鸣器进行报警,当采样值高于预先设定的报警上下限值时,蜂鸣器发出蜂鸣声,且LCD显示“outmeasure!”。图3-8报警电路其中,Q1为三极管,主要用来放大控制电流,从而进一步起到放大声音的效果。3.2.6总体硬件电路图系统的总体硬件图如图3-9所示,单片机的1、2、3脚分别与MCP3001的6、5、7脚连接,单片机的4、5、6脚分别与LCD1的4、5、6脚连接,从而对采集与显示进行相应的控制。整个系统中有10个按键,其中复位键由硬件电路决定,其余9个按键的功能通过软件编程实现。整个硬件系统能够实现从数据采集到模数转换、数据处理到显示报警的功能。图3-9硬件电路总体图第四章光纤智能位移计的软件设计4.1主程序设计主程序流程如图4-1所示,main()函数运行后,首先对系统使用变量进行初始化,赋予变量初值以便程序能够正常运行。变量初始化结束后,还要进行LCD初始化,设置LCD工作模式。紧接着对LCD进行操作,使其显示“measurestart?”以实现人机交流,使操作者知道整个系统已经准备完毕,等待操作者进行相应操作。图4-1主程序流程发出以上提示后,主程序进入键盘扫描程序,且循环进行此程序。因此,只有当按键位置发生变化时,位移计才会根据键值进行相应操作。测量、显示函数,均作为子函数,当有按键按下时被调用执行。4.2LCD1602程序设计当系统需要利用1602进行显示时,其流程如图4-2所示:首先,调用Busy()函数(返回值为1时代表1602为忙碌状态,返回值为0时代表1602非忙碌状态),且当返回值为1时,对Busy()函数进行循环调用,直至返回值为0。当返回值为0后,立即调用清屏函数对LCD进行清屏,再根据不同的数据处理的情况设置显示位置,最后,写入需要现实的数据。返回值为0。当返回值为0后,立即调用清屏函数对LCD进行清屏,再根据不同的数据处理的情况设置显示位置,最后,写入需要现实的数据。图4-21602程序流程4.3键盘处理程序键盘处理程序是软件设计的重点,在主程序中被循环调用,同时,其它子程序又都是在键盘处理程序中进行调用,因此键盘处理程序设计的合理与否显得尤为重要。其总的程序工作流程如图4-3所示:图4-3键盘扫描总程序流程当主程序运行时,循环调用键盘处理函数,但每次调用后键盘处理函数都执行一样的操作。首先其调用hitkey()函数,判断是否有键盘按下,如果返回值为0,则返回主程序继续执行其它程序,如果返回值为1,此时调用延时函数延时200ms(利用延时函数消除干扰信号的影响),如果返回值仍然为1,则调用相应函数读取键值并进行相应的跳转。4.3.1hitkey()函数hitkey()函数,工作流程如图4-4所示,其中keycode为读取的P2口值,当没有按键按下时,其值为0x07。因此,当没有按键按下时(keycode&0x07)=0x07,此时函数返回值为0;反之,当有按键按下时,函数返回值为1。图4-4hitkey()函数程序流程4.3.2键值扫描键值扫描函数scan_key()流程见图4-5,主要采用行列扫描法,对9个按键进行扫描,得到相应的扫描码,取反后作为按键的键值,交由键值跳转程序使用。图4-5键值扫描函数scan_key()程序流程图4.3.3键值跳转键值跳转函数key_manage(),主要用于接收scan_key()函数的返回值,并利用switch函数调用按键对应的子函数其流程如图4-6所示。图4-6键值跳转程序流程图4.4具体按键对应子函数4.4.1设定键设定键对应子程序为key1(),其程序流程图如图4-7所示,其中H_flg与L_flg分别为上限设置标志和下限设置标志,均设定为全局变量,上限、下限对应程序key2()、key3()中进行相应的改变。当H_flg=1时能够只能进行上限值设定,当L_flg=1时能够且只能进行下限设定,均为0时,不能进行任何操作。图4-7设定键对应程序key1()4.4.2上限键、下限键如图4-8、图4-9所示:上下限函数主要通过改变上下限标志H_flg和L_flg来确定将要改变的是上线还是下限,通过调用SCANkey()来改变上下限的相应数值。图4-8上限键对应子函数key2()程序流程图图4-9下限键对应子函数key3()程序流程图4.4.3增加键、减少键如图4-10、图4-11所示,增减键通过左右移标志位来确定要改数值的高低位,改变数值后立即显示改变后的值。图4-10增加键对应子函数key4()程序流程图4-11减少键对应子函数key5()程序流程4.4.4左移键、右移键如图4-12、图4-13所示,左右移键对应函数key7()、key8()仅改变左右移标志位数值,除此之外不进行任何操作。图4-12左移对应程序key7()流程图4-13右移对应程序key8()流程4.4.5测量(mm)键、测量(cm)键如图4-14所示,测量键对应的函数首先进行距离测量,然后对测量的数据进行处理,得到实际要显示的结果,最后进行显示;延时20ms后子程序结束,返回主程序继续执行其它程序,直至按下复位键或切断电源。整个过程实现了对位移的实时测量。图4-14测量函数流程4.5MCP3001读取如图4-15所示,通过Read_MCP函数控制MCP3001进行数据的A/D转换,由于MCP3001为10为A/D转换器,所以要屏蔽高六位以获取有效转换值,将有效转换值返回后结束。图4-15MCP3001数据读取流程图第五章运行结果及分析上电后即如图5-1所示,显示“measurestart?”,以提醒操作系统进入待机状态,操作者可以做适当的测量。此时,三极管输入为低电平,蜂鸣器不响。图5-1上电后显示“measurestart?”人机交互按下【报警上限】键后,如图5-2所示,显示默认报警上限,此时,三极管输入为低电平,蜂鸣器不响。图5-2点击【报警上限】键后,显示默认上限值点击【减少】键,由于此时没有点击【左移】、【右移】键,上限值进行自然减少。此时,三极管输入为低电平,蜂鸣器不响。连续点击三次后如图5-3所示:图5-3连续点击三次【减少】键后显示点击【左移】后,再点击【减少】,此时高位进行循环减小,此时,三极管输入为低电平,蜂鸣器不响。显示结果如图5-4所示:图5-4依次点击【左移】、【减少】键后显示此时,点击【设定】后上限设定为26mm。按下【报警下限】键后,如图5-5所示,显示默认报警下限,此时,三极管输入为低电平,蜂鸣器不响。图5-5点击【报警下线】后显示默认下限点击【增加】键,由于此时没有点击【左移】、【右移】键,下限值进行自然增加。此时,三极管输入为低电平,蜂鸣器不响。连续点击七次后如图5-6所示:图5-6点击7次【增加】后显示此时点击【设定】后,下限值设定为7mm。至此,上下限设置完成。点击【测量(mm)】后,显示如图5-7所示:图5-7点击【测量(mm)】键后显示由于此时输入为距离为28mm,所以图5-7中LCD显示“outmeasure!”另外,由上图管脚电平可以看出,此时蜂鸣器开始报警。调节测量距离,使之变小后显示如图5-8所示:图5-8调节距离小于28mm后显示不断调节被测距离,使之减小,并且逐渐接近下限值,如图5-9、图5-10、图5-11所示:图5-9一次改变被测距离图5-10二次改变被测距离图5-11三次改变被测距离当再次减小时,超出最小限,显示结果如图5-12所示:图5-12超出下限后由于此时输入为距离为5mm,所以图5-12中LCD显示“outmeasure!”另外,由上图管脚电平可以看出,此时蜂鸣器开始报警。同理,进行设定好上下限后,点击【测量(cm)】后,测量结果如图5-13、图5-14所示:图5-13一次测量结果图5-14二次测量结果第六章调试过程中所遇问题及其解决6.1硬件问题及解决初步调试时,复位键不能正常工作,经过检查发现复位电路电容存在问题,更换电容后,能够实现正常复位。6.2软件问题及解决6.2.1按键程序初步调试时,发现多数按键能够正常工作,但是发现右移键按下后五任何反应,后来发现是switch函数中地址数据不正确所致,经过对数据取反后,工作正常。再次调试的时候,增加程序在左右移后,不能按照设计功能工作,经过仔细检查程序发现,是标志位的问题,经修改后增加按键工作正常。报警上限与报警下限在调试中工作正常,测量(mm)也能正常工作,但是在设定的时候,发现设定的报警上限和报警下限在测量时没有作用。调试后发现,上下限存的是子函数内有效地变量,改为全局变量后,设定键工作正常。6.2.2LCD显示程序初次调试时,能够正常显示“measurestart?”,但是在调试上下限及设定键时发现,显示时数据依次显示直到整个显示屏满屏,经检查发现缺少LCD清屏函数。在增加清屏函数后,再次调试发现,显示结果没有按照自己的意思显示在第二行中央,而是显示在右边,而且显示残缺,经调试发现,显示位设定函数赋值不正确,更改后显示正常。6.2.3整体调试整体调试时能够采集和显示,但是显示的数据与真实测量数据不相符,初步判断数据处理有误,经过检查发现,数据处理公式用的不对,经过修正后,能够正常测量显示,整个系统可以正常工作。
总结经过近四个月的学习与实践,毕业设计即将结束。在老师、学长的指导、同学的帮助以及个人的努力下,基本完成了设计任务。自我设计的光纤智能位移计将光纤位移传感器提供4—20mA的输入信号转变成0—5V的电压信号,并进一步送入A/D装换芯片,最后,通过单片机对接收的数字信号处理且发送到LCD显示,达到实时显示测量距离的目的。另外,通过行列式键盘与LCD显示,实现了人与单片机之间的信息交换,可以根据测量需要改变相应的上下限数值。作为人机交互的重点,九个按键都能够正常工作。通过左移、右移、增加、减少、以及上下限按键,可以方便的设定上下限数值;通过测量(mm)和测量(cm)可以自动完成单位的转换。整个测量过程,操作简单,实时性好,适合于实际工程中的应用。虽然本次设计基本完成了所要求的任务,但由于本人知识水平有限,设计距完美还有一定差距,软件的编写还有待进一步简化,位移计整体性能也有待进一步加强提高。本次设计完成了理论到实践的有机结合,使我在对理论知识进一步理解的同时,增强了由理论转化为实践的的工程实践能力,为未来的独立学习与工作打下一定基础。此外,本次设计中查阅了大量期刊与专业书籍,开阔了自我的学术视野,使得我对单片机的理解也更加深入。另外,几天的编程经历使我懂得,认真的态度和刻苦的精神才是成功的必需品。总之,四个月的设计生活带给我的不仅仅是专业知识,在独立完成设计的过程中,真正体会到了否定自我与超越自我的重要性,同时也找到了自己的优缺点,使得自己对未来职业生涯的规划也更加明确。
参考文献[1]张齐,杜群贵.单片机应用系统设计技术—基于C语言编程[M].北京:电子工业出版社,2004:276—282.[2]张旭.单片机在传感器设计中的应用[J].机电信息,2011,36:132—133.[3]程国钢.基于8051+Proteus仿真[M].北京:电子工业出版社,2012:170-177.[4]郑峰,王巧芝,李英建,刘瑞国.51单片机应用系统典型模块开发大全[M].北京:中国铁道出版社,2011:604—608.[5]魏立峰,王宝兴.单片机原理与应用技术[M].北京:北京大学出版社,2006:2-8.[6]秦永烈等.位移测量仪表[M].北京:机械工业出版社,1978(1):105—207.[7]张春光.微型计算机控制技术[M].北京:化学工业出版社,2002.[8]马忠梅.单片机的C程序应用设计[M].北京:北京航空航天大学出版社,1999.[9]胡学海.单片机原理及运用系统设计[M].北京:电子工业出版社,2008.[10]宫亚梅.基于Proteus和Keil的单片机课程设计[J].济南职业学院报,2008.[11]周润景,徐宏伟,丁莉.单片机电路设计、分析与制作[M].北京:机械工业出版社,2010.5.[12]刘守义.单片机应用技术[M].西安:电子科技大学出版社,2004.[13]张洪润,刘秀英,张亚凡.单片机应用设计200例[M].北京:航空航天大学出版社,2006.[14]周润景,张丽娜.PROTEUS入门实用教程[M].北京:机械工业出版社,2007.[15]景小松.单片机电路设计实例[D].呼和浩特:内蒙古大学,2007.[16]胡伟.单片机C程序设计及应用实例.北京:人民邮电出版社,2003.[17]朱宇光.单片机应用新技术教程.北京:电子工业出版社,2000.[18]赵德安.单片机原理与用.北京:机械工业出版社,2004.[19]武庆生.MCS系列单片机及接口教程.成都:电子科技大学出版社,1995.[20]沈红卫.基于单片机的智能系统设计与实现[M].北京:电子工业出版社,2005.[21]余永权,汪明慧,黄英.单片机在控制系统中的应用[M].北京:电子工业出版社,2003.
致谢时间过得很快,转眼间毕业设计已经走近尾声,这段难忘的日子也将要成为一份回忆!在毕业设计的这几个月里,经历了从烦躁轻浮到冷静踏实,从几乎不懂到渐渐熟悉,从毫无头绪到任务完成;有过找硬件找到心烦的时候,有过编程编到恶心的时候,还有过调试程序调试到不知所错的时候;但是,最后的最后还是坚持了下来,完成了大学的最终任务—毕业设计。在这里,我要感谢陪我走过这段艰辛而又甜蜜的旅程的老师、学长及同学们,正是由于你们的帮助,我才得以顺利完成了本次的毕业设计。首先要感谢***老师,作为您的毕业设计学生,虽然没能得到您的亲自教导,但是您对学术的执着已经对我起到了榜样的作用。每当遇到不会的问题时,我就会想到您坐在电脑前认真研究的样子,没有丝毫的烦躁。是您用行动教会了我如何自学,如何独立完成一件事情。其次要感谢的是**学长,谢谢您在我不知所措的时候给我指点迷经,帮我少走许多弯路,为我节省那么多时间。在这里,真诚的祝愿学长能够学业有成,早日找到一份喜欢的工作!除此之外,还要感谢同我一块并肩作战的同学们。在我找不到合适的资料时,是你们帮我找到我的所需;在我苦思不解的时候,是你们一句道破;在我设计完成无所事事的时候,是你们提醒我再次检查。在这里我想说,毕业后还想同你们一块学习,尽管这已经不太可能,谢谢你们!最后,感谢学校图书馆为我提供这么多的图书资料,和良好的图书馆学习氛围,感谢母校*****大学为提供的良好的学习环境!
附录光纤智能位移计完整程序:#include<reg52.h>#include<intrins.h>#defineucharunsignedchar#defineuintunsignedint#defineulongunsignedlong#defineKEYP2bithitkey();//判断是否有键按下,有返回1,没有返回0bitH_flg,L_flg; //上下限标志,用于设定程序 bitLshift_flg,Rshift_flg;sbitDOUT=P1^0;sbitCS=P1^1;sbitCLK=P1^2;sbitRS=P1^3; //LCD命令/数据端sbitRW=P1^4; //LCD读/写端sbitLCDE=P1^5; //LCD使能端sbitbuzzer=P1^7;ucharkey_vlue; uchardat_adjm(uintdat1); //mm显示数据调整函数uchardat_adjc(uintdat1); //cm显示数据调整函数ucharflag; //Busy标志uchardis_buf[6]; //显示缓冲区,用于显示uchardis_buf1[6]; //显示缓冲区,用于设定上下限ucharcodedis[]={"MeasureStart?"}; //显示ucharcodedis1[]={"Distance:"}; //显示表头ucharcodedis2[]={"0123456789.mm"}; //mm显示代码ucharcodedis3[]={"0123456789.cm"}; //cm显示代码ucharcodedis4[]={"OutMeasure!"};//显示超出量程ucharcodedis5[]={"maxlimit:"}; //显示上限ucharcodedis6[]={"minlimit:"}; //显示下限ucharscan_key(); //扫描键盘,返回键值uintH=1281,L=0; //定义上下限变量:默认上限为40mm,默认下限为00mmuintaverage(void); //算术平均滤波程序uintread_TLC2543(ucharCHN); //读TLC2543uintread_MCP(void); //读MCP3001uintmeasure;uintdistance(void); //距离计算函数voiddelay_ms(uintn); //延时函数voidinit_1602(void); //1602初始化函数 voidbusy(void); //LCD忙标志判断函数voidcmd_wrt(ucharcmd); //写命令子函数voiddat_wrt(uchardat); //写数据子函数 voidLCD_Clear(void); //LCD清屏函数voidprint(uchar*str); //字符串显示函数voiddispmm(uintdat); //mm显示子函数 voiddispcm(uintdat); //cm显示子函数voidlcd_start(ucharstart); //设定显示位置函数voidSCANkey();//程序扫描键盘,供主程序用 voidkey_manage(ucharkeycode);//键值处理跳转程序voidkey1(void); //按键1处理程序voidkey2(void); //按键2处理程序voidkey3(void); //按键3处理程序voidkey4(void); //按键4处理程序voidkey5(void); //按键5处理程序voidkey6(void); //按键6处理程序voidkey7(void); //按键7处理程序voidkey8(void); //按键8处理程序voidkey9(void); //按键9处理程序/****************************主函数*******************************/voidmain(){buzzer=0;//工作前的人机交互 init_1602(); print(dis); //显示测量开始 delay_ms(1000);//按键处理程序EA=0; //关中断while(1){ SCANkey(); //调用扫描键盘程序}}/************************扫描键盘程序************************///有键按下完成按键处理,无键按下直接返回。voidSCANkey(){ ucharkey_code; if(hitkey())//判断是否有键按下 { delay_ms(20);//延时20ms左右,消除抖动干扰 if(hitkey())/判断是否有效按键 { key_code=scan_key(); while(hitkey());//等待按键释放 key_manage(key_code);//键盘控制 } }}/************************判断是否有键按下********************///判断是否有键按下,有返回1,没有返回0bithitkey(){ ucharscancode,keycode; scancode=0x07; //P2.3~P2.7输出全0 KEY=scancode; keycode=KEY;//读P2.0~P2.3的状态 if((keycode&0x07)==0x07) //屏蔽高4位 return(0); //全1则无键闭合,返回0 else return(1); //否则有键闭合,返回1}/************************扫描键值程序*************************///扫描键盘,返回键值(高四位代表行,低四位代表列)ucharscan_key() { ucharscancode,keycode; scancode=0xf7;//键盘扫描码,采用逐行扫描法,P2.3=0,扫描第一列 while(scancode!=0xbf) { KEY=scancode; //输入扫描码,扫描P1.4对应的行 keycode=KEY; //读出数据,看是否在此行上的某列键盘被按下 if((keycode&0x07)!=0x07)break;//扫描到按下的键,则退出 scancode=(keycode<<1)|0x0f;//否则,左移,更新扫描码继续扫描} keycode=~keycode; //键盘扫描码变反,返回 return(keycode);}/***********************键值处理跳转子程序********************/voidkey_manage(ucharkeycode){ switch(keycode) { case0x09:key1();break; case0x11:key2();break; case0x21:key3();break; case0x0a:key4();break; case0x12:key5();break; case0x22:key6();break; case0x0c:key7();break; case0x14:key8();break; case0x24:key9();break; default:break;}}/************************设定处理程序************************/voidkey1(void){uintm,n;n=10*dis_buf1[0]+dis_buf1[1];m=256*n/10;if(H_flg==1){ H=m;}if(L_flg==1){ L=m;} }/************************报警上线处理程序********************/voidkey2(void){ucharj;H_flg=1;L_flg=0;LCD_Clear();print(dis5); //显示上限lcd_start(0x42); //确定显示起始位置dis_buf1[0]=4; //默认显示报警下线为0dis_buf1[1]=0;dis_buf1[2]=11;dis_buf1[3]=12;for(j=0;j<4;j++) //显示报警上限dat_wrt(dis2[dis_buf1[j]]); while(1){ SCANkey(); //调用扫描键盘程序}}/************************报警下线处理程序********************/ voidkey3(void){ucharj;H_flg=0;L_flg=1;LCD_Clear();print(dis6); //显示下限lcd_start(0x42); //确定显示起始位置dis_buf1[0]=0; //默认显示报警下线为0dis_buf1[1]=0;dis_buf1[2]=11;dis_buf1[3]=12;for(j=0;j<4;j++) //显示报警下限dat_wrt(dis2[dis_buf1[j]]);while(1){ SCANkey(); //调用扫描键盘程序}}/************************增加处理程序************************/ voidkey4(void){ucharj;if((Rshift_flg==0)&(Lshift_flg==0)){ dis_buf1[1]+=1; lcd_start(0x42); //确定显示起始位置 for(j=0;j<4;j++) //显示增加后的报警下限 dat_wrt(dis2[dis_buf1[j]]); if(dis_buf1[1]==10) { dis_buf1[1]=0; dis_buf1[0]+=1; lcd_start(0x42); //确定显示起始位置 for(j=0;j<4;j++) //显示增加后的报警下限 dat_wrt(dis2[dis_buf1[j]]); } if(dis_buf1[0]==4) //数据超出50mm时,重新从0开始递加 { dis_buf1[1]=0; dis_buf1[0]=0; lcd_start(0x42); for(j=0;j<4;j++) dat_wrt(dis2[dis_buf1[j]]); }}elseif(Rshift_flg==1){ dis_buf1[1]+=1; if(dis_buf1[1]==10) { dis_buf1[1]=0; } lcd_start(0x42); //确定显示起始位置 for(j=0;j<4;j++) //显示增加后的报警下限dat_wrt(dis2[dis_buf1[j]]);}else{ dis_buf1[0]+=1; if(dis_buf1[0]==4) dis_buf1[0]=0; lcd_start(0x42); for(j=0;j<4;j++) dat_wrt(dis2[dis_buf1[j]]);}}/************************减少处理程序************************/ voidkey5(void){ucharj;if((Rshift_flg==0)&(Lshift_flg==0)){ dis_buf1[1]-=1; lcd_start(0x42); //确定显示起始位置 for(j=0;j<4;j++) //显示减少后的报警下限 dat_wrt(dis2[dis_buf1[j]]); if(dis_buf1[1]==-1) { dis_buf1[1]=9; dis_buf1[0]-=1; lcd_start(0x42); //确定显示起始位置 for(j=0;j<4;j++) //显示减少后的报警下限 dat_wrt(dis2[dis_buf1[j]]); } if(dis_buf1[0]==-1) //数据超出50mm时,重新从0开始递加 { dis_buf1[1]=0; dis_buf1[0]=4; lcd_start(0x42); for(j=0;j<4;j++) dat_wrt(dis2[dis_buf1[j]]); }}else if(Lshift_flg==1){dis_buf1[0]-=1; if(dis_buf1[0]==-1) { dis_buf1[0]=3; } lcd_start(0x42); //确定显示起始位置 for(j=0;j<4;j++) //显示减少后的报警下限 dat_wrt(dis2[dis_buf1[j]]);}else{ dis_buf1[1]-=1; if(dis_buf1[1]==-1) { dis_buf1[1]=9; } lcd_start(0x42); //确定显示起始位置 for(j=0;j<4;j++) //显示减少后的报警下限 dat_wrt(dis2[dis_buf1[j]]);}}/************************测量(mm)处理程序******************/ voidkey6(void){while(1){ measure=distance();dispmm(measure);delay_ms(1000);}}/************************左移处理程序************************/ voidkey7(void){Lshift_flg=1; //左移标志位设置为1 Rshift_flg=0; //清除右移标志}/************************右移处理程序************************/voidkey8(void){ Rshift_flg=1; //右移标志位设置为1 Lshift_flg=0; //清除左移标志} /************************测量(cm)处理程序******************/voidkey9(void){while(1){ measure=distance();dispcm(measure);delay_ms(1000);}} /************************写数据子函数************************/voiddat_wrt(uchardat){busy(); //检测读写操作使能吗LCDE=0;RS=1; //指向数据寄存器RW=0; //写P0=dat; //写数据LCDE=1; //高电平有效LCDE=0;}/**************************延时函数**************************/voiddelay_ms(uintn){uintj;while(n--){for(j=0;j<125;j++);}}/************************LCD忙标志判断函数*******************/voidbusy(void){flag=0x80; //赋初值高位为1禁止while(flag&0x80) //读写操作使能位禁止时等待继续检测{P0=0xff;RS=0; //指向地址计数器RW=1; //读LCDE=1; //信号下降沿有效flag=P0; //读状态位高位为状态LCDE=0;}}/*************************写命令子函数************************/voidcmd_wrt(ucharcmd){LCDE=0;busy(); //检测读写操作使能吗P0=cmd; //命令RS=0; //指向命令计数器RW=0; //写LCDE=1; //高电平有效LCDE=0;}/*************************1602初始化函数************************/voidinit_1602(void){cmd_wrt(0x01); //清屏cmd_wrt(0x0c); //开显示,不显示光标,不闪烁cmd_wrt(0x06); //完成一个字符码传送后,光标右移,显示不发生移位cmd_wrt(0x38); //16×2显示,5×7点阵,8位数据接口}/**************************字符串显示函数**************************/voidprint(uchar*str){ while(*str!='\0')
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年房地产电工模拟试题(含答案)
- 2026年设备检验员实习生新员工岗位专业知识笔模拟题目及答案详解
- 2026年全国临床医学检验技术中级职称考试模拟题及答案详解
- 山东省青岛市平度第一中学2026-2027学年高二上学期10月月考化学试卷(含答案)
- 2026年大龄务工人员入职适配细则
- 广西南宁市第十四中学2026-2027学年九年级(上)素养测试数学试卷(10月份)(含答案)
- 2026-2027学年上学期山西省临汾市八年级英语期中学业水平监测(含答案)
- 2026年人教版小学语文第4单元阅读理解专项训练习题及答案
- 湖南省湘教版初中物理第4章同步练习题及答案
- 2026年黑龙江省哈尔滨市第二中学高一语文第4册单元测试卷及答案
- 2026年中国电信应届生校园招聘笔试真题(含详细答案解析)
- 2026年中国联通网络技术岗校园招聘笔试题及答案
- 2026年高考北京卷物理高考真题(解析版)
- 2027年山西大同市高职单招职业技能考试题库【有一套】附答案详解
- 前程无忧国企招聘笔试题库(含答案)
- 2024年全国统一高考数学试卷(理科)(甲卷)
- 中国肘关节置换术指南(2026版)
- 初中物理晋升高级(一级)职称水平考试模拟试卷有答案解析共三套
- 《炼化企业离心压缩机 干气密封技术规范》
- 三废环保管理培训
- DD 2023-02 地浸砂岩型铀矿地质调查技术要求
评论
0/150
提交评论