基于單片機的光纖智能位移計_第1頁
基于單片機的光纖智能位移計_第2頁
基于單片機的光纖智能位移計_第3頁
基于單片機的光纖智能位移計_第4頁
基于單片機的光纖智能位移計_第5頁
已閱讀5頁,還剩61頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

分類號: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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論