




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
淮南師范學院2014屆本科畢業論文PAGE3畢業論文(設計)論文題目:二維點樣平臺設計目錄TOC\o"1-2"\h\u16928前言 2176951總體方案設計 240781.1總體方案實現框圖 249351.2軟硬件開發環境和工具 3922二維點樣平臺上位機設計 3113782.1VisualBasic語言概述 310582.2程序編寫 419002.3錯誤處理和調試 10173902.4程序發布 11191903二維點樣平臺下位機設計 1143843.1單片機硬件電路設計 11148623.2單片機軟件程序設計 13259704系統測試 16264764.1上位機串口通信測試 16125394.2下位機電路和通信測試 1746165總結 1828969參考文獻: 18二維點樣平臺設計淮南師范學院2014屆本科畢業論文PAGE20PAGE19二維點樣平臺設計摘要:二維點樣在各行各業中都得到重要的運用,其工作原理是上位機通過控制步進電機在X、Y方向的拍數比實現對二維空間的精確定位并進行點樣。本課題以VB6.0為平臺并通過與上位機的通訊實現點樣定位控制和對點樣進程進行模擬實現。關鍵字:點樣;步進電機;上位機;VB;通訊Two-dimensionalPointSamplePlatformAbstract:Two-dimensionalpointsampleisimportantinallwalksoflife,itsworkingprincipleistheuppermachinebycontrollingstepmotorthanthenumberofbeatsintheX,Ydirectionimplementationsareprecisepositioningandoftwo-dimensionalspace.ThistopicinVB6.0byuseoftheplatformandthroughcommunicationwithPCtorealizethecontrolandthepositioningofthesamplepointssimulatedimplementationsampleprocess.Keywords:Samplepoints;Steppingmotor;PC;VB;communication前言隨著科學技術的不斷進步,機械產業朝著微型化,精密化發展,零件的微小化與運動位移的高速化、衡量化是未來的主要研究方向之一,其精準的位置控制即準確無誤的定位技術顯得日益重要。因此,開發功能實用,定位精確度高的定位平臺運動系統具有廣闊的應用前景。二維點樣平臺作為空間三維定位的重要組成部分,也可以說是二維定位平臺在國內外取得了較快的發展。二維定位平臺是完成X、Y維精確定位的工作平臺。它在微機電系統、微電子、納米制造、納米電子及航空航天等眾多高科技領域都發揮著重要作用,隨著科技的進步,這種重要性日益增強。生活中常見的一些機器如電子廠車間的高速機、點膠機等。在日常生活中我們能過接觸最多最常見的二維點樣平臺也就是車間的點膠機了,點膠機是一種對流體進行控制并將流體進行點滴、涂覆于產品表面或產品內部的自動化機器。可實現二維、三維的路徑點膠,能夠高效精準的進行點膠。其應用的行業也非常的寬廣,可以在電子行業中進行手機按鍵點膠,手機電池封裝,光學器件加工等;在工業電氣方面可以對電容,變壓器,繼電器,按鈕等進行粘接灌封,對電機線圈進行涂膠,對電器柜門進行封邊涂膠。本設計就是以我在聯寶實習期間對點膠機的操作進行實際的理論驗證而設計一個基于VB平臺的二維點樣平臺。用VB設計上位機軟件控制界面,能夠設置待點樣行數、列數及行列間距,并對點樣進程進行模擬。設計相應插補算法。單片機通過串口通信接收上位機所給的坐標控制X、Y步進電機,實現點樣定位控制。1總體方案設計1.1總體方案實現框圖本設計分兩部分設計,一部分是基于VisualBasic的二維點樣平臺的設計,另一部分是基于51單片機的下位機設計,兩者之間通過串口通信。系統框圖如圖1所示。圖1系統框圖上位機設計部分主要是設置相應的控制界面(打開串口、手動點樣、自動點樣)和實現串口通信,當手動點樣、自動點樣或回原點操作時,會通過串口將相應的X軸和Y軸的坐標值傳給下位機。為了直觀看到坐標位置和移動軌跡,在上位機上設計了二維坐標顯示區。下位機是由51單片機控制一個系統,當接收到串口數據時,對數據進行分析,提取出上位機發送的坐標值,驅動X軸和Y軸步進電機,實現二維點樣。51單片機的串口通信部分利用51單片機內部的串口資源與外部串行端口電平轉換電路(即RS232)來實現。1.2軟硬件開發環境和工具軟件開發環境包括MicrosoftVisualBasic6.0[1][15][21]和KeiluVisionC51V4.1[2]。硬件開發環境是Proteus7.8SP2[4]。調試工具包括VirtualSerialPortDriver6.9和串口調試助手V1.0。VisualBasic是Microsoft公司開發的一種“可視化”的Windows應用程序開發工具。MicrosoftVisualBasic6.0是用來開發上位機的平臺。KeiluVisionC51是一種兼容單片機C語言軟件開發的系統,是由德國KeilSoftware公司(ARM公司之一)出品。包含標準的KeilC編譯器、宏匯編器、調試器、實時內核、單板計算機和仿真器,支持所有的251系列微控制器。在本設計中使用KeilC51是對51單片機程序進行編譯、調試和下載[2][5][7[9]。Proteus軟件是英國LabCenterElectronics公司出版的EDA工具軟件。它既具有其它EDA工具軟件的仿真功能,又能仿真單片機及外圍器件。可以說是目前最好的單片機仿真軟件。本設計中利用Proteus在單片機中加載Keil生成的HEX文件對步進電機的運動進行模擬。為了讓上位機發送的數據能夠傳送給Proteus仿真的單片機,這里選用VirtualSerialPortDriver6.9軟件,它可以模擬串口通信,虛擬出一對串口,這樣兩者之間就無需物理連接,即可以串口的形式進行通信[4][12]。串口調試工具很多,本系統采用常用的串口調試助手V2.1,其功能簡單,在本系統設計中主要用來調試上位機程序和測試下位機的串口通信功能。2二維點樣平臺上位機設計2.1VisualBasic語言概述VisualBasic是一種語言簡單、易學、易用的軟件,適用于開發Windows環境下的各類應用程序,并增加了結構化、可視化程序設計語言的功能,引入了“面向對象”和“事件驅動”等先進思想,支持ActiveX控件(用于Web或其它支持這一技術的程序中)、VBS(VBScript,VB的腳本語言,用于Web開發)和VBA(VBForApplication,嵌入式VB語言,用于對一些流行軟件進行二次開發),對網絡、多媒體和數據庫的編程有良好的支持,擁有完全的中文界面和幫助系統[1][15][21]。VisualBasic6.0主要有以下幾個特點:編程可視化、面向對象的程序設計、事件驅動的編程機制,以及結構化的程序設計。VisualBasic的可視化設計工具可以把Windows界面設計的復雜性“封裝”起來,利用VisualBasic提供的各種設計工具,程序開發人員只需按照程序界面的設計要求,在窗體中畫出各種“控件”,并設置這些對象的屬性,這樣程序設計人員就不需要為界面設計編寫代碼而浪費時間,只需要編寫實現程序功能代碼。因此,程序設計的效率會大大提高。面向對象的程序設計語言將整個現實世界或者其中的一部分看作是由不同種類的對象構成的。各種類型的對象之間通過發送消息進行聯系,消息能夠激發對象作出相應的反應,從而構成一個運動的整體。VisualBasic屬于事件驅動的編程機制,由事件控制著程序運行的流向。事件是可以由窗體或控件識別的操作。在響應事件時,事件驅動應用程序執行指定的代碼。VisualBasic是一種接近自然語言和人類的邏輯思維方式并具有結構化程序設計的控制結構。1966年,Bohra和Jacopini提出了結構化程序設計的三種基本結構,即順序結構、選擇結構和循環結構。這三種基本結構是VisualBasic程序設計的核心。2.2程序編寫該部分利用VB設計上位機控制平臺,實現手動和自動設置待點樣行列數;實現回原點操作,模擬顯示點樣當前位置和運動軌跡,設置的坐標值能通過串口通信發送到下位機,下位機在對步進電機進行驅動運行后能將相應的坐標返回給上位機實現點樣定位控制并將相應的坐標在二維坐標顯示區顯示出來。2.2.1創建標準項目文件本設計需要創建一個基于Standard.EXE的項目。先打開VisualBasic6.0,然后打開“文件”中的“新建工程”,然后選擇新建“標準EXE”即可,如圖2所示。這樣就創建了一個標準EXE的項目文件[1]。圖2創建標準EXE項目文件2.2.2加入串口通信控件MSComm控件是Microsoft公司為了簡化Windows下串行通信編程而提供的一種ActiveX控件,它為應用程序提供了通過串行接口收發數據的簡便方法。MSComm控件給出事件驅動和查詢兩種方式。事件驅動有程序響應及時的優點,開發者只需在每個事件中添加自己的程序。查詢方式在某些情況下更便捷,但其實質也是事件驅動。程序的每個關鍵功能之后,可以通過查詢CommEvent屬性值來查詢事件和錯誤。默認的控件工具欄沒有MSComm控件,因此需要打開菜單欄“工程”下面的“部件”(跳出如圖3所示的對話框,找到“MicrosoftCommControl6.0”,點擊確定完成添加)將MSComm控件加到工具欄中。圖3添加MSComm控件MSComm控件的許多屬性都是需要開發者根據自己的需要進行設置。將MSComm控件添加到工程的Form框中,點擊MSComm控件即可在右邊的屬性欄對其進行設置。MSComm控件有許多重要的屬性,如CommPort設置端口號;Settings設置波特率、奇偶檢驗、數據位和停止位;PortOpen設置并返回通信端口的狀態,也可以打開或關閉端口;Input從接收緩沖區返回或刪除字符;Output向傳輸緩沖區寫一個字符串。根據本設計需要,設置端口號CommPort固定為4,Settings設置為“9600,n,8,1”[12]。2.2.3設計程序主界面VisualBasic最大的好處就是他的可視化。對于主界面的設計,只需要選擇需要的工具在Fram上添加、移動,操作簡單方便。選擇Frame在窗體上分出四個部分,分別是串口通信、手動點樣、自動點樣和點樣坐標顯示。“打開端口”、“回原點”以及上下左右移動坐標等按鈕采用CommandButton工具。坐標輸入和坐標顯示采用TextBox工具。為了直觀顯示端口連接狀態,本設計使用Shape工具畫了一個圓點,當未連接的時候顯示黑色,處于連接狀態的時候顯示綠色。為了實時且直觀展示坐標所在位置,本設計用PictureBox工具,在其上面畫出坐標和顯示當前坐標的圓點。主界面設計如圖4所示。圖4主界面設計坐標的實現是使用VisualBasic的畫線功能。Scale用來定義刻度,例如Picture1.Scale(-10,,110)-(110,-10),定義左上角座標為(-20,120),右下角座標為(110,-20)。Line用來畫線,例如Picture1.Line(0,0)-(110,0),vbBlack,這句話是在(0,0)坐標和(110,0)坐標之間畫一條白色的線。DrawWidth用來定義線寬。Picture1的坐標程序如下所示:Picture1.ClsPicture1.ScaleMode=5Picture1.Scale(-10,110)-(110,-10)‘繪橫坐標Picture1.DrawWidth=2Picture1.Line(0,0)-(110,0),vbBlackPicture1.DrawWidth=1Picture1.Line(0,10)-(100,10),vbWhitePicture1.Line(0,20)-(100,20),vbWhite‘繪坐標縱線Picture1.DrawWidth=2Picture1.Line(0,0)-(0,110),vbBlackPicture1.DrawWidth=1Picture1.Line(10,0)-(10,100),vbWhitePicture1.Line(20,0)-(20,100),vbWhite'指定位置顯示原點OPicture1.CurrentX=-5Picture1.CurrentY=0Picture1.Print"O"…2.2.4參數輸入和控制實現本點樣控制平臺的使用必須先打開端口,只有串口設備號和本平臺的設備號一致時才能進行通信。當用戶點擊“打開端口”時,先檢查端口號是否存在或者已經被打開。當端口號正確之后將端口打開,即MSComm1.PortOpen=Ture,改變圓點的顏色為綠色,指示端口已經被打開,并且按鍵名稱更改為“關閉端口”。如果端口不正確,那么根據錯誤代碼,跳出消息框提示用戶錯誤原因。端口控制的代碼如下所示:PrivateSubCommand5_Click()IfCommand5.Caption="關閉端口"ThenMSComm1.PortOpen=FalseCommand5.Caption="打開端口"Shape1.FillColor=RGB(0,0,0)ElseIfTest_COM(4)=TrueThenMSComm1.PortOpen=TrueCommand5.Caption="關閉端口"Shape1.FillColor=RGB(0,255,0)EndIfEndIfEndSub'檢測端口號函數PrivateFunctionTest_COM(com_numAsInteger)AsBooleanIfCommand5.Caption="打開端口"ThenOnErrorGoToComm_ErrorMSComm1.CommPort=com_num'這里接收傳入的串口號MSComm1.PortOpen=TrueMSComm1.PortOpen=FalseTest_COM=True'如果返回1,表示串口可用ExitFunctionComm_Error:IfErr.Number=8002ThenMsgBox"串口不存在,請配置串口號為COM4!"ElseIfErr.Number=8005ThenMsgBox"串口已打開!"ElseMsgBox"其它錯誤"EndIfTest_COM=False'如果出錯,則返回0ExitFunctionResumeNextEndIfEndFunction上下左右移動按鈕和回原點按鈕控制原理一樣,即當有Click點擊事件時,改變坐標的值,如“Y+”按鈕被按下時,那么將當前坐標的Y軸坐標加一,然后將改變后的坐標值發送出去。為了在上位機上直觀看到坐標的移動軌跡,那么需同時移動坐標圓點的位置以及更改TextBox中的坐標值。圓點的移動用Move函數,如Point1.Move20,30是將Point1點的Left移動到20刻度處,Top移動到30刻度處。數據的發送使用MSComm控件Output屬性。每次點擊操作需要發送XY兩個數值,所以首先定義兩個字節:Dimsendbyte(1)AsByte。本系統設計X軸和Y軸坐標都在0-100以內,為了方便下位機區分接收到的數據,發送之前將X軸坐標值和十六進制H80相“與”,這樣X軸數據最高位為1,Y軸數據最高位為0,下位機就可以通過數據的最高位來判斷收到的數據是X軸坐標還是Y軸坐標。這種做法對下位機來說省去了繁瑣的數據解析工作,簡單方便。具體的代碼如下所示:PrivateFunctionSendXY(xvAsInteger,yvAsInteger)AsBoolean'發送xy坐標SendXY=FalseIfMSComm1.PortOpenThensendbyte(0)=xvOr&H80sendbyte(1)=yvMSComm1.Output=sendbyteSendXY=TrueEndIfEndFunction自動采樣需要用戶輸入三組坐標值,然后點擊開始,數據每隔一秒發送一組,同時移動二維坐標顯示區的圓點,并顯示坐標移動軌跡。因為需要定時每秒發送一次,所以這里用了一個定時工具Timer。Timer的Interval用來設置定時時間,單位為毫秒,本設計設置為1000,也就是一秒中斷一次。當用戶輸入三組數據并點擊“開始”按鈕之后,會打開定時器,延時時間到的時候進入Timer函數,在該函數中每秒發送一組坐標,三組發送完成之后關閉定時器。此外,對三組數據的輸入進行限制,當輸入為空或者大于100則跳出消息框提示用戶輸入正確的數值,錯誤提示如圖5所示。圖5輸入超出范圍報錯2.3錯誤處理和調試界面和代碼編寫完成并不代表工作的結束,最艱苦的就是對完成的程序的處理和調試。錯誤通常有語法錯誤、運行錯誤和邏輯錯誤。語法錯誤很容易修改,對于運行錯誤和邏輯錯誤,可以根據VisualBasic的錯誤提示進行修改。舉個例子來說,如果MSComm控件的Settings設置為“9600,n,9,1”,運行時會報錯,跳出對話框“Invalidpropertyvalue”。有時候捕獲了錯誤代碼,但是不應該只向用戶顯示錯誤信息代碼,而且大多數額用戶是不知道這些錯誤代碼的含義。為了將錯誤代碼翻譯成對改錯誤的描述,可以將捕獲的錯誤代碼傳給VisualBasic提供的Error函數,在給函數完成對錯誤代碼的解釋。在本設計中,當打開不存在的端口時會捕獲到錯誤代碼8002,這個錯誤號的含義是無效的端口號(comPortInvalid)。在本程序中是這么處理的:OnErrorGoToComm_Error…Comm_Error:IfErr.Number=8002ThenMsgBox"串口不存在,請配置串口號為COM4!"…2.4程序發布調試好程序之后,雖然沒有錯誤出現,但該應用程序還只是源文件,只能在VisualBasic的編譯環境中運行,因此需要制作成可執行文件。VisualBasic很容易生成“.exe”文件。方法是選擇“文件”菜單下的“生成Makeproject1.exe”選項,在跳出來的對話框中修改文件名,然后確認即可,這樣就完成了二維點樣平臺上位機的開發工作了[1]。3二維點樣平臺下位機設計3.1單片機硬件電路設計點樣平臺下位機以AT89C51單片機為控制核心,串口通信模塊用來接收上位機發送的坐標數據,外加兩個步進電機用來模擬點樣平臺的二維電機控制。下位機驅動步進電機運動流程圖如圖6所示圖6下位機控制步進電機流程圖3.1.151單片機最小系統AT89C51是應用廣泛的8位單片機,它擁有4K的FLASH,128字節的RAM,兩個16位的定時器,可編程串行中斷,以及低功耗閑置和掉電模式。AT89C51單片機最小系統包括單片機主控、時鐘電路和復位電路。如圖7所示。時鐘電路選用外部12M晶振,并聯兩個30pf的電容幫助起振。復位電路是由電阻、電容和按鍵組成的上電復位和按鍵復位。圖7單片機最小系統為了直觀顯示系統運行狀態和步進電機運行狀態,本設計中添加了三個LED指示燈,用來指示運行狀態,如圖8所示。圖8LED狀態指示燈3.1.2串口通信電路RS232接口上通信時要12V的電壓才能識別,也就是高低電平為12V和0V,但是51單片機的高低電平為5V和0V,所以單片機和電腦的串口通信需要高平轉換。實際的電路中需要加入電平轉換芯片,如MAX232或PL2303。本設計使用Proteus仿真,Protues帶有串口仿真元件COMPIM,它集成了TTL-RS232電路的。設好波特率即可實現串口通信。為了查看單片機串口通信數據,仿真中加入VirtualTerminal虛擬終端。該部分電路如圖9所示。圖9串口通信電路3.1.3二維步進電機電路為了模擬二維坐標電機的轉動,本系統設計了兩組步進電機,X軸步進電機和Y軸步進電機。由于單片機驅動能力有限,最大只有25mA,需要外加驅動電路。ULN2003是高耐壓、大電流復合晶體管陣列,由七個硅NPN復合晶體管組成。當輸入5V電壓時,輸出電流高達500mA。所以本設計選ULN2003驅動四線制步進電機。設計電路如圖10所示。圖10步進電機驅動電路3.2單片機軟件程序設計單片機軟件部分主要是串口通信程序、步進電機控制程序和接收到數據后的邏輯處理和控制程序。3.2.151單片機串口程序51單片機內部有一個可編程的雙向全雙工串行通信接口。該接口有4種工作方式,以適用于不同場合。波特率由單片機內部的定時器/計數器產生,可以用軟件進行設置。51單片機內部的串口擁有兩個物理上相互獨立的接收、發送緩沖器SBUF,可以同時接收和發送數據,兩個緩沖器占用同一個地址(99H)。本設計選用波特率9600bit/s,根據12M時鐘晶振算出裝載值,并且開啟接收中斷。接受到數據時進去進去中斷函數進行相應的處理。串口初始化代碼如下收中斷。當接收到數據時進去中斷函數進行相應的處理。串口初始化代碼如下:voidinit(){ TMOD=0x20; //定時器1工作方式2 TH1=0xfd; //裝載初值,波特率設置為9600 TL1=0xfd; TR1=1;//啟動定時器1 SM0=0; //設置串口工作方式1 SM1=1; REN=1;//允許串口接收 EA=1; //開總中斷 ES=1; //開串口中斷}串口產生接收中斷,RI硬件置位,在串口接收中斷函數里必須軟件清除接收中斷標志。接收中斷入口函數如下所示:voidser()interrupt4{ RI=0; //接受中斷標志位…}3.2.2步進電機程序步進電機工作原理簡單,本設計中選用四線制步進電機,每一條線導通,步進電機會旋轉一個角度,如果順序導通,那么電機就會正轉。如果逆序導通,那么電機反轉,通過改變線線之間導通時間可以改變轉速。本設計的步進電機可以通過坐標判斷而相應的正轉或翻轉。電機驅動函數如下:voidStepX(charxy,charm,charn);該函數有三個參數,第一個參數xy用來選擇電機,xy為1的時候控制X軸電機,xy為2的時候控制Y軸電機;第二個參數m是調整的角度;第三個參數n是選擇正轉反轉,n為1時正轉,n為0時反轉。3.2.3控制邏輯程序該部分是通過對串口接收到的數據進行解析,然后驅動步進電機的轉動。串口接收到數據時會觸發接收中斷,在中斷函數里不做處理,只把它存到一個隊列里,主函數判斷到隊列中有數值的時候會依次讀取,并判斷數值是X軸坐標數據還是Y軸坐標數據。X軸Y軸的判斷是通過數據的最高位來判斷的,因為在設計上位機的時候,考慮到數據在0-100之間,可以通過最高位來標識,如果是X軸坐標數據那么把最高位置1,否則置0。這樣單片機處理起來就簡單方便多了,單片機接到數據之后將最高位去除,然后送給相應的步進電機就可以了。步進電機的控制是由步進電機的當前坐標值和接收到的新的坐標值決定的,如果新的坐標值大于當前坐標值,那么正轉,否則反轉。轉動的角度即是當前值和接收的坐標值之間的差值。因為步進電機旋轉需要時間,而上位機可能會連續發送多個數據,所以需要定義一個隊列,用來存儲上位機發送過來的數據,在主函數中進行讀取和控制。隊列的定義:#definelen20//隊列長度ucharValue[len];//存數數組ucharhead=0;//隊列頭uchartail=0;//隊列尾ucharcnt=0;//隊列中的數據個數在接收中斷程序中將數據存入隊列,程序如下:voidser()interrupt4{ RI=0; //清除接受中斷標志位 if(cnt<len) { Value[tail]=SBUF; if(++tail==len) tail=0; cnt++; }}程序中還設計了三個LED狀態指示燈,系統運行時打開LED1,X軸步進電機運行時打開LED2,Y軸步進電機運行時打開LED3,停止運行時關閉相應的LED。4系統測試4.1上位機串口通信測試使用VirtualSerialPortDriver6.9虛擬出一對串口,將COM3和COM4連接起來,這樣就可以在電腦上進行串口通信測試了[4]。如圖11所示。圖11虛擬串口軟件使用串口調試助手和本課題設計的串口控制平臺進行通信,查看通信是否正常,測試圖如圖12所示。圖12上位機平臺和串口調試助手通信測試經測試,二維點樣平臺和串口調試助手通信正常。手動采樣、自動采樣和回原點操作都能發送出正確的二維坐標數值。4.2下位機電路和通信測試驗證二維點樣平臺功能正常之后,使用它和單片機進行通信。單片機啟動仿真按鈕,上位機測試手動發送、自動發送和回原點操作,測試發送數據是否正確,數據接收是否正確,電機轉動是否正常,以及指示燈狀態是否正常[12]。判斷單片機接收到的數據是否和上位機發送的一致,可以打開VirtualTerminal觀察,串口接收到的數據可以實時的顯示出來。測試如圖13所示。圖13上位機和單片機通信測試當有數據接收到時,可以看到步進電機轉動和LED狀態燈點亮,轉動方向和角度和上位機發送的一致。整體測試如圖14所示。圖14單片機系統仿真經測試,串口通信部分能接收到正確的數據,單片機能驅動X軸和Y軸步進電機正轉或反轉一定角度,旋轉方向和角度都和上位機發送的一致,LED燈能正確指示系統和步進電機運行狀態。系統各個模塊運行穩定。5總結本課題設計了基于VisualBasic的二維點樣控制平臺和基于51單片機的串口通信控制系統。上位機實現串口通信,當手動點樣、自動點樣或回原點操作時,會將相應的X軸和Y軸的坐標值傳給下位機。下位機是由51單片機控制一個系統,當接收到串口數據時,對數據進行分析,提取出上位機發送的坐標值,驅動X軸和Y軸步進電機,實現二維點樣。經測試各部分工作正常,達到了本課題的設計目標。由于本人時間和精力有限,有很多需要改進和完善的地方。上位機控制平臺可以添加更多功能,界面可以做的更美觀。單片機控制系統可以選用更強大的單片機,比如低功耗的16單片機MSP430或者運行更快的基于Cotex-M3內核的32位STM32單片機[6][9]。參考文獻:[1]李雁翎等.VisualBasic程序設計基礎教程(第二版)[M]人民郵電出版社2012.1[2]楊加國等.單片機原理與應用及C51程序設計(第二版)[M]清華大學出版社2011.10[3]周榮富.電子線路CAD[M]北京大學出版社2011.12[4]陳忠平.基于Proteus的51系列單片機設計與仿真(第二版)[M]電子工業出版社2012.5[5]陳曾平.電路設計基礎[M]北京高等教育出版社.2003:100-110.[6]肖洪兵.跟我學用單片機[M]北京航空航天大學出版社.2002.8.[7]何立民.單片機應用技術大全[M]北京航空航天大學出版社,1994.[8]邱光源等.電路基礎[M]高等教育出版社1998.[9]沈紅衛.基于單片機的智能系統設計與實現[M]北京:電子工業出版社,2005.1[10]康華光.電子技術基礎數字部分[M]北京高等教育出版社,2000.[11]郁有文,常健傳感器原理及工程應用[M]電子科技大學出版社,2008.7[12][Visual.Basic數據采集與串口通信測控應用實戰].李江全等.掃描版.[13]梅麗鳳,王艷秋,汪毓鐸,張軍.單片機原理及接口技術[M]清華大學出版社2006[14]蔡朝洋.單片機控制實習與專題制作[M]北京航空航天大學出版社2006.11[15]楊忠寶,康順哲.VB語言程序設計[M]人民郵電出版社2010.12[16]夏繼強.單片機實驗與實踐教程[M]北京航空航天大學出版社,2001.[17]王運堅.VISUALBASIC6.0應用指南[M]人民郵電出版社1998附錄附錄1上位機設計界面附錄2上位機程序Dimxx,yyAsLongDimtimercountAsIntegerDimsendbyte(1)AsBytePrivateSubCommand5_Click()IfCommand5.Caption="關閉端口"ThenMSComm1.PortOpen=FalseCommand5.Caption="打開端口"Shape1.FillColor=RGB(0,0,0)ElseIfTest_COM(4)=TrueThenMSComm1.PortOpen=TrueCommand5.Caption="關閉端口"Shape1.FillColor=RGB(0,255,0)EndIfEndIfEndSub'檢測端口信號函數'PrivateFunctionTest_COM(com_numAsInteger)AsBooleanIfCommand5.Caption="打開串口"ThenOnErrorGoToComm_ErrorMSComm1.CommPort=com_num'這里接受傳入的串口號MSComm1.PortOpen=TrueMSComm1.PortOpen=FalseTest_COM=True'如果操作成功,則說明當前串口可用,返回1,表示串口可用ExitFunctionComm_Error:IfErr.Number=8002ThenMsgBox"串口不存在,請配置串口號為COM4!"ElseIfErr.Number=8005ThenMsgBox"串口已打開"ElseMsgBox"其它錯誤"EndIfTest_COM=False'如果出錯,則返回0ExitFunctionResumeNextEndIfEndFunctionPrivateFunctionSendXY(xvAsInteger,yvAsInteger)AsBoolean'發送xy坐標SendXY=FalseIfMSComm1.PortOpenThensendbyte(0)=xvOr&H80sendbyte(1)=yvMSComm1.Output=sendbyteSendXY=TrueEndIfEndFunctionPrivateSubCommand8_Click()If(TextX1(intger).Text="X1"OrTextX1(intger).Text=""OrTextY1.Text="Y1"OrTextY1.Text=""_OrTextX2.Text="X2"OrTextX2.Text=""OrTextY2.Text="Y2"OrTextY2.Text=""_OrTextX3.Text="X3"OrTextX3.Text=""OrTextY3.Text="Y3"OrTextY3.Text="")ThenMsgBox"請輸入三組點樣坐標(0-100之間的數值)!"ElseIfCInt(TextX1(intger).Text)<=100AndCInt(TextY1.Text)<=100AndCInt(TextX2.Text)<=100_AndCInt(TextY2.Text)<=100AndCInt(TextX3.Text)<=100AndCInt(TextY3.Text)<=100ThenTimer1.Enabled=TrueCommand8.Enabled=Falsetimercount=0'Point1.MoveCInt(TextX1.Text)-Point1.Width/2,CInt(TextY1.Text)+Point1.Height/2'Textx.Text=CInt(Point1.Left+Point1.Width/2)'Texty.Text=CInt(Point1.Top-Point1.Height/2)ElseMsgBox"輸入數值必須在0-100之間"EndIfEndIfEndSubPrivateSubTimer1_Timer()timercount=timercount+1Iftimercount=1ThenPoint1.MoveCInt(TextX1(intger).Text)-Point1.Width/2,CInt(TextY1.Text)+Point1.Height/2Textx.Text=CInt(TextX1(intger).Text)Texty.Text=CInt(TextY1.Text)SendXYCInt(TextX1(intger).Text),CInt(TextY1.Text)EndIfIftimercount=2ThenPoint1.MoveCInt(TextX2.Text)-Point1.Width/2,CInt(TextY2.Text)+Point1.Height/2Textx.Text=CInt(TextX2.Text)Texty.Text=CInt(TextY2.Text)SendXYCInt(TextX2.Text),CInt(TextY2.Text)EndIfIftimercount=3ThenPoint1.MoveCInt(TextX3.Text)-Point1.Width/2,CInt(TextY3.Text)+Point1.Height/2Textx.Text=CInt(TextX3.Text)Texty.Text=CInt(TextY3.Text)SendXYCInt(TextX3.Text),CInt(TextY3.Text)timercount=0Timer1.Enabled=FalseCommand8.Enabled=TrueEndIfEndSubPrivateSubCommandYP_Click()'Y+操作If(Point1.Top-Point1.Height/2)<100ThenPoint1.MovePoint1.Left,Point1.Top+1Textx.Text=CInt(Point1.Left+Point1.Width/2)Texty.Text=CInt(Point1.Top-Point1.Height/2)SendXYCInt(Point1.Left+Point1.Width/2),CInt(Point1.Top-Point1.Height/2)EndIfEndSubPrivateSubCommandXM_Click()'X-操作If(Point1.Left+Point1.Width/2-1)>0ThenPoint1.MovePoint1.Left-1,Point1.TopTextx.Text=CInt(Point1.Left+Point1.Width/2)Texty.Text=CInt(Point1.Top-Point1.Height/2)SendXYCInt(Point1.Left+Point1.Width/2),CInt(Point1.Top-Point1.Height/2)EndIfEndSubPrivateSubCommandXP_Click()'X+操作If(Point1.Left+Point1.Width/2)<100ThenPoint1.MovePoint1.Left+1,Point1.TopTextx.Text=CInt(Point1.Left+Point1.Width/2)Texty.Text=CInt(Point1.Top-Point1.Height/2)SendXYCInt(Point1.Left+Point1.Width/2),CInt(Point1.Top-Point1.Height/2)EndIfEndSubPrivateSubCommandYM_Click()'Y-操作If(Point1.Top-Point1.Height/2-1)>0ThenPoint1.MovePoint1.Left,Point1.Top-1Textx.Text=CInt(Point1.Left+Point1.Width/2)Texty.Text=CInt(Point1.Top-Point1.Height/2)SendXYCInt(Point1.Left+Point1.Width/2),CInt(Point1.Top-Point1.Height/2)EndIfEndSub'回原點操作PrivateSubCommand7_Click()Point1.Move0-Point1.Width/2,0+Point1.Height/2Textx.Text=CInt(Point1.Left+Point1.Width/2)Texty.Text=CInt(Point1.Top-Point1.Height/2)SendXY0,0EndSubPrivateSubForm_Load()'Picture1.BackColor=vbGreenPicture1.ClsPicture1.ScaleMode=5'像素Picture1.Scale(-10,110)-(110,-10)定義左上角坐標為(-20,120),右下角坐標為110,-20)'設置繪線寬度Picture1.DrawWidth=2'繪坐標橫線Picture1.Line(0,0)-(110,0),vbBlackPicture1.DrawWidth=1Picture1.Line(0,10)-(100,10),vbWhitePicture1.Line(0,20)-(100,20),vbWhitePicture1.Line(0,30)-(100,30),vbWhitePicture1.Line(0,40)-(100,40),vbWhitePicture1.Line(0,50)-(100,50),vbWhitePicture1.Line(0,60)-(100,60),vbWhitePicture1.Line(0,70)-(100,70),vbWhitePicture1.Line(0,80)-(100,80),vbWhitePicture1.Line(0,90)-(100,90),vbWhitePicture1.Line(0,100)-(100,100),vbWhite'繪坐標縱線Picture1.DrawWidth=2Picture1.Line(0,0)-(0,110),vbBlackPicture1.DrawWidth=1Picture1.Line(10,0)-(10,100),vbWhitePicture1.Line(20,0)-(20,100),vbWhitePicture1.Line(30,0)-(30,100),vbWhitePicture1.Line(40,0)-(40,100),vbWhitePicture1.Line(50,0)-(50,100),vbWhitePicture1.Line(60,0)-(60,100),vbWhitePicture1.Line(70,0)-(70,100),vbWhitePicture1.Line(80,0)-(80,100),vbWhitePicture1.Line(90,0)-(90,100),vbWhitePicture1.Line(100,0)-(100,100),vbWhite'指定位置顯示原點0Picture1.CurrentX=-5Picture1.CurrentY=0Picture1.Print"O"Picture1.CurrentX=-5Picture1.CurrentY=10Picture1.Print"1O"Picture1.CurrentX=-5Picture1.CurrentY=20Picture1.Print"2O"Picture1.CurrentX=-5Picture1.CurrentY=30Picture1.Print"3O"Picture1.CurrentX=-5Picture1.CurrentY=40Picture1.Print"4O"Picture1.CurrentX=-5Picture1.CurrentY=50Picture1.Print"5O"Picture1.CurrentX=-5Picture1.CurrentY=60Picture1.Print"6O"Picture1.CurrentX=-5Picture1.CurrentY=70Picture1.Print"7O"Picture1.CurrentX=-5Picture1.CurrentY=80Picture1.Print"8O"Picture1.CurrentX=-5Picture1.CurrentY=90Picture1.Print"9O"Picture1.CurrentX=-5Picture1.CurrentY=100Picture1.Print"10O"Picture1.CurrentX=-3Picture1.CurrentY=106Picture1.Print"Y"Picture1.CurrentX=10Picture1.CurrentY=-2Picture1.Print"10"Picture1.CurrentX=20Picture1.CurrentY=-2Picture1.Print"20"Picture1.CurrentX=30Picture1.CurrentY=-2Picture1.Print"30"Picture1.CurrentX=40Picture1.CurrentY=-2Picture1.Print"40"Picture1.CurrentX=50Picture1.CurrentY=-2Picture1.Print"50"Picture1.CurrentX=60Picture1.CurrentY=-2Picture1.Print"60"Picture1.CurrentX=70Picture1.CurrentY=-2Picture1.Print"70"Picture1.CurrentX=80Picture1.CurrentY=-2Picture1.Print"80"Picture1.CurrentX=90Picture1.CurrentY=-2Picture1.Print"90"Picture1.CurrentX=100Picture1.CurrentY=-2Picture1.Print"100"Picture1.CurrentX=107Picture1.CurrentY=-2Picture1.Print"X"Textx.Text=CInt(Point1.Left+Point1.Width/2)Texty.Text=CInt(Point1.Top-Point1.Height/2)EndSubPrivateSubTextX1_GotFocus(IndexAsInteger)TextX1(Index).Text=""EndSubPrivateSubTextX1_KeyPress(IndexAsInteger,KeyAsciiAsInteger)IfKeyAscii<48OrKeyAscii>57ThenKeyAscii=0EndSubPrivateSubTextX2_GotFocus()TextX2.Text=""EndSubPrivateSubTextX2_KeyPress(KeyAsciiAsInteger)IfKeyAscii<48OrKeyAscii>57ThenKeyAscii=0EndSubPrivateSubTextX3_GotFocus()TextX3.Text=""EndSubPrivateSubTextX3_KeyPress(KeyAsciiAsInteger)IfKeyAscii<48OrKeyAscii>57ThenKeyAscii=0EndSubPrivateSubTextY1_GotFocus()TextY1.Text=""EndSubPrivateSubTextY1_KeyPress(KeyAsciiAsInteger)IfKeyAscii<48OrKeyAscii>57ThenKeyAscii=0EndSubPrivateSubTextY2_GotFocus()TextY2.Text=""EndSubPrivateSubTextY2_KeyPress(KeyAsciiAsInteger)IfKeyAscii<48OrKeyAscii>57ThenKeyAscii=0EndSubPrivateSubTextY3_GotFocus()TextY3.Text=""EndSubPrivateSubTextY3_KeyPress(KeyAsciiAsInteger)IfKeyAscii<48OrKeyAscii>57ThenKeyAscii=0EndSub附錄3下位機設計界面附錄4下位機程序#include<reg51.h>#include<stdio.h>#defineucharunsignedchar#defineuintunsignedintsbitLED1=P0^0; //系統狀態指示燈sbitLED2=P0^1; //x軸步進電機指示燈sbitLED3=P0^2; //y軸步進電機指示燈#definelen20//隊列長度ucharValue[len];//隊列數組ucharhead=0;uchartail=0;ucharcnt=0;ucharx_position=0;//x軸當前位置uchary_position=0;//y軸當前位置ucharstep_table1[]={0x01,0x02,0x04,0x08};//x正轉ucharstep_table2[]={0x08,0x04,0x02,0x01};//x反轉ucharstep_table3[]={0x10,0x20,0x40,0x80};//y正轉ucharstep_table4[]={0x80,0x40,0x20,0x10};//y反轉voiddelay(unsignedintn){ unsignedinti,j; for(i=0;i<n;i++) for(j=500;j>0;j--);//延時}voidinit(){ TMOD=0x20; //定時器1,工作方式--八位定時器初值自動重裝 TH1=0xfd; //定時器1裝初值,用波特率計算器計算,波特率設置為9600 TL1=0xfd; // TR1=1; //啟動定時器1 SM0=0; //設置串口工作方式1—八位數據,十位數據收發 SM1=1; // REN=1; //允許串口收發 EA=1; //開總中斷 ES=1; //開串口中斷}//xy:1-x軸電機,2-y軸電機//調整轉的角度//n:1-正轉,0-反轉voidStepX(charxy,charm,charn){ uchari; if(xy==1) { for(;m>0;m--) { for(i=0;i<4;i++) { if(n) P1=step_table1[i]; else P1=step_table2[i]; delay(1); } } } elseif(xy==2) { for(;m>0;m--) { for(i=0;i<4;i++) { if(n) P1=step_table3[i]; else P1=step_table4[i]; delay(1); } } }}//主函數voidmain(){ uchartemp; init(); LED1=0; while(1) { while(cnt>0) { if(Value[head]&0x80)//用高位來判斷是x軸還是y軸 { LED2=0;//開指示燈 temp=Value[head]&0x7F; if(temp>=x_position) StepX(1,temp-x_position,1);//正轉 else StepX(1,x_position-temp,0);//·反轉 LED2=1;//關指示燈 x_position=temp;//?更新當前位置 } else { LED3=0;//開指示燈 temp=Value[head]; if(temp>=y_position) StepX(2,temp-y_position,1);//正轉 else StepX(2,y_position-temp,0);//反轉 LED3=1;//關指示燈 y_position=temp;//更新當前位置 } if(++head==len) head=0; cnt--; } }}voidser()interrupt4{ RI=0; //接受中斷標志位 if(cnt<len) { Value[tail]=SBUF; if(++tail==len) tail=0; cnt++; }} SBUF='a'; //把接到的數據發送出去 while(!TI); delayms(1); TI=0;發送并接受測試 if(flag==1) //若收到數據{ ES=0; //關閉串口通信 for(i=0;i<9;i++)//發送’iget‘ { SBUF=table[i]; while(!TI);//發送中斷標志位,一位位發送,判斷發送成功 //硬件自動清零 TI=0; } SBUF=a; //把接受的數據發送出去 while(!TI); TI=0; ES=1; flag=0;}致謝在畢業設計的過程中,我得到了很多老師和同學的關心和幫助。我的畢業設計能夠順利按時完成離不開他們的支持與鼓勵。在論文的最后,我要向他們表示我真誠的感謝!感謝我的導師在畢業設計過程中給我的悉心指導和幫助,他淵博的學識和嚴謹的治學態度讓我受益匪淺。在此謹向我的老師致以崇高的敬意和誠摯的感謝!我還要感謝我的畢業設計論文評閱老師和答辯委員會的老師,謝謝你們對我的畢業設計的細心評閱基于C8051F單片機直流電動機反饋控制系統的設計與研究基于單片機的嵌入式Web服務器的研究MOTOROLA單片機MC68HC(8)05PV8/A內嵌EEPROM的工藝和制程方法及對良率的影響研究基于模糊控制的電阻釬焊單片機溫度控制系統的研制基于MCS-51系列單片機的通用控制模塊的研究基于單片機實現的供暖系統最佳啟停自校正(STR)調節器單片機控制的二級倒立擺系統的研究基于增強型51系列單片機的TCP/IP協議棧的實現基于單片機的蓄電池自動監測系統基于32位嵌入式單片機系統的圖像采集與處理技術的研究基于單片機的作物營養診斷專家系統的研究基于單片機的交流伺服電機運動控制系統研究與開發基于單片機的泵管內壁硬度測試儀的研制基于單片機的自動找平控制系統研究基于C8051F040單片機的嵌入式系統開發基于單片機的液壓動力系統狀態監測儀開發模糊Smith智能控制方法的研究及其單片機實現一種基于單片機的軸快流CO〈,2〉激光器的手持控制面板的研制基于雙單片機沖床數控系統的研究基于CYGNAL單片機的在線間歇式濁度儀的研制基于單片機的噴油泵試驗臺控制器的研制基于單片機的軟起動器的研究和設計基于單片機控制的高速快走絲電火花線切割機床短循環走絲方式研究基于單片機的機電產品控制系統開發基于PIC單片機的智能手機充電器基于單片機的實時內核設計及其應用研究基于單片機的遠程抄表系統的設計與研究基于單片機的煙氣二氧化硫濃度檢測儀的研制基于微型光譜儀的單片機系統單片機系統軟件構件開發的技術研究基于單片機的液體點滴速度自動檢測儀的研制基于單片機系統的多功能溫度測量儀的研制基于PIC單片機的電能采集終端的設計和應用基于單片機的光纖光柵解調儀的研制氣壓式線性摩擦焊機單片機控制系統的研制基于單片機的數字磁通門傳感器基于單片機的旋轉變壓器-數字轉換器的研究基于單片機的光纖Bragg光柵解調系統的研究單片機控制的便攜式多功能乳腺治療儀的研制基于C8051F020單片機的多生
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 隧道洞外施工方案
- 勞動防護用品課件
- 公司現場目視化標準
- 機械原理學習與考研輔導:第10章
- 港口石油公司雙體系建設
- 農作物繁育員職場心態試題及答案
- 種子繁育員培訓教材試題及答案
- 2024年項目管理資格考試內容的前瞻試題及答案
- 2024年游泳救生員職業標準試題及答案
- 2025電梯租賃合同樣本 標準版 模板
- 2025年有關“我為群眾辦實事”主題日活動工作方案
- 2025中國新型儲能行業發展白皮書
- 油氣管道輸送試題及答案
- 海南省天一大聯考2024-2025學年高三學業水平診斷(四)語文試題及答案
- 旅游合同簽署委托協議
- 山東司法警官職業學院招聘筆試真題2024
- 2025-2030中國非鄰苯二甲酸酯類增塑劑行業市場發展趨勢與前景展望戰略研究報告
- 2025年臺球理論測試題及答案
- 加油站現場服務提升方案
- 絕緣搖表培訓
- 保險合規知識培訓課件
評論
0/150
提交評論