摘要:主要討論以微型計算機為操作平臺、基于Widnows操作系統(tǒng)的單片機實驗教學仿真軟件的設計。實現(xiàn)對單片機教學實驗的全軟件仿真。針對自主研發(fā)的單片機實驗教學仿真軟件的特點和實際實驗教學過程面臨的問題,詳細闡述軟件的系統(tǒng)需求分析、建模及各子系統(tǒng)的詳細設計過程。在此重點論述了仿真編譯、仿真運行和仿真電路子系統(tǒng)的設計思路、相關算法的設計及程序設計與實現(xiàn)。
關鍵詞:仿真軟件;虛擬實驗;實驗教學;仿真編譯
0 引言
目前,各高校順應發(fā)展設置的單片機課程是機電、自動化等電類專業(yè)的一門重要課程,是一門多基礎、多理論的實踐性課程。在高職單片機教學過程中理論教學的發(fā)展已經(jīng)較為完善,而實驗教學由于受到經(jīng)費的限制,提供的實驗設備有限,不能滿足學生的要求。
鑒于以上情況,開發(fā)單片機教學實驗的全軟件仿真??梢詼p少實驗經(jīng)費的開銷,又便于增添實驗內(nèi)容,同時也可借用投影儀更加清晰地為學生做演示實驗,非常有利于學生加深對所學理論知識的感性認識、掌握基本實驗知識、方法、技能。對于有危險性的實驗,虛擬實驗平臺更具有優(yōu)勢。
1 單片機實驗教學軟件的系統(tǒng)組成
由于單片機實驗教學仿真軟件系統(tǒng)較為復雜固將其設計為如干個子系統(tǒng),對每個子系統(tǒng)建模和設計,最后將它們連接起來構(gòu)成整個系統(tǒng)模型。圖1說明了系統(tǒng)的組成和各子系統(tǒng)關系。
考慮到單片機實驗教學仿真軟件的具體情況,同時使用結(jié)構(gòu)化程序設計與面向?qū)ο笤O計2種方法,對于單片機實驗教學仿真軟件系統(tǒng)的功能模塊采用結(jié)構(gòu)化方法來設計。
采用面向?qū)ο蟮姆椒ㄔO計軟件中的用戶界面、各個窗口、菜單、仿真元件等,最后,將各個子系統(tǒng)結(jié)合在一起,就構(gòu)成了單片機實驗教學仿真軟件。
下面對主要功能模塊進行論述。
2 仿真編譯子系統(tǒng)的設計
實際的編譯是利用編譯程序從源程序產(chǎn)生目標程序的過程。該過程分為5個階段:詞法分析,語法分析,語義檢查,中間代碼生成,代碼優(yōu)化,目標代碼生成。主要是進行詞法分析和語法分析,又稱為源程序分析。考慮本軟件的實際情況,仿真編譯子系統(tǒng)只進行詞法分析和語法分析,發(fā)現(xiàn)有語法錯誤,給出提示信息,仿真編譯成功后將仿真編譯結(jié)果保存。
(1)詞法分析模塊調(diào)用源程序編輯子系統(tǒng)產(chǎn)生的用戶源程序文件,逐行對文件中用戶輸入的源程序按照單片機指令系統(tǒng)規(guī)定的符號,如:(“Rn”、“#”、“/”、“@”、“$”、“:”及7種不同尋址方式表示的數(shù)據(jù)或地址、指令轉(zhuǎn)移的偏移量、工作寄存器和特殊功能寄存器的表示符號、44個指令助記符、7個偽指令、用戶定義的標號和符號常量、回車符)。進行詞法分析,判斷用戶源程序中使用的基本符號是否正確,如果不是合法的符號則將錯誤所在的位置及錯誤的類型反饋給用戶,終止仿真編譯等待用戶修改后再一次運行仿真編譯;如果是合法的符號則將每個符號以及符號的類型保存在string類型數(shù)組cifa[]和int類型數(shù)組type[]中供語法分析程序模塊使用。
(2)語法分析模塊首先定義了51系列單片機所有指令和偽指令的檢查函數(shù)。然后在詞法分析的基礎上,從數(shù)組cifa[]和數(shù)組type[]中取出用戶輸入的字符根據(jù)單片機指令的語法格式,字符的前后關系逐一進行處理,并調(diào)用指令和偽指令的檢查函數(shù)判斷:用戶輸入的源程序是否符合語法規(guī)則;標號和符號常量的定義與使用是否正確;偽指令的使用是否正確;程序是否以END結(jié)束等。如果存在錯誤則將錯誤所在的位置及錯誤的類型反饋給用戶,終止仿真編譯等待用戶修改后再一次進行仿真編譯;如果是正確的指令則將指令進行處理(對指令地址、指令ID、指令字節(jié)數(shù)、指令周期、操作數(shù)類型、操作數(shù)的值等進行處理)后存入預先定義的全局數(shù)組對象command中。仿真運行時由仿真運行子系統(tǒng)調(diào)用。
3 仿真運行子系統(tǒng)的設計與實現(xiàn)
(1)對51系列單片機指令系統(tǒng)的111條指令建立對應的處理函數(shù),依照地址指針在指令類的數(shù)組對象中查詢到對應元素,再根據(jù)指令ID調(diào)用指令的處理函數(shù),完成指令的所有處理功能,返回下一指令地址給地址指針,實現(xiàn)仿真運行子系統(tǒng)的基本需求。
(2)設計狀態(tài)掃描程序,查詢中斷申請。當有中斷時,在指令處理函數(shù)在完成指令的所有處理功能后進行中斷處理。
(3)仿真運行子系統(tǒng)與仿真電路建立子系統(tǒng)的信息交換功能的設計通過仿真電路子系統(tǒng)與程序仿真運行子系統(tǒng)的接口函數(shù)實現(xiàn)。
當仿真運行子系統(tǒng)仿真執(zhí)行的指令向單片機I/O接口發(fā)送數(shù)據(jù),這些數(shù)據(jù)將引起單片機外接電路及相關元件狀態(tài)的改變。此時,由仿真運行子系統(tǒng)向仿真電路子系統(tǒng)發(fā)送消息,啟動仿真電路狀態(tài)修改進程,對仿真電路及元件的狀態(tài)更新。然后修改進程結(jié)束將控制權交還,繼續(xù)仿真運行。
如果在仿真運行期間仿真電路或元件(僅限按鈕開關)狀態(tài)發(fā)生改變,此時則由仿真電路子系統(tǒng)向仿真運行子系統(tǒng)發(fā)送消息,啟動仿真運行狀態(tài)修改進程,更新存儲器單元對應的內(nèi)部變量。然后修改進程結(jié)束將控制權交還,繼續(xù)仿真運行。
4 仿真電路子系統(tǒng)的設計
仿真電路子系統(tǒng)在外部,它向用戶提供了一個可視的虛擬的單片機實驗平臺,用戶通過這一平臺建立仿真的實驗電路。當用戶仿真運行實驗源程序時,將再次通過這一平臺進行相關操作,觀察實驗現(xiàn)象。在內(nèi)部,仿真電路子系統(tǒng)對用戶建立的仿真電路進行元件的記錄、電路連接的分析、節(jié)點表的建立與維護、元件(包括單片機端口)狀態(tài)得計算,通過發(fā)送消息與仿真運行子系統(tǒng)交互。最終達到在完全軟件仿真的環(huán)境中讓用戶完成單片機教學實驗,并獲得與真實實驗條件下相同的實驗結(jié)果。
4.1 仿真元件的設計與實現(xiàn)
元件是電路建立的基礎。對實驗中用到的電器元件(如:51系列單片機89S51、電阻、電容、發(fā)光二極管、數(shù)碼管、各種開關、邏輯門電路、譯碼器、存儲器芯片等)設計元件類。另外將電源、接地、導線、節(jié)點也作為元件進行設計。
部分元件以簡化的圖形表現(xiàn),在設計元件時為簡化軟件的設計,將元件以單元模塊的形式進行設計,即以單元模塊電路的形式將模擬元件簡化為數(shù)字邏輯單元。忽略了電路及元件具體的電流電壓等模擬特性。類似的單元模塊有,復位模塊、振蕩電路模塊、數(shù)碼管模塊、開關模塊。
4.2 元件類的設計與實現(xiàn)
首先設計出CYuanJian類,它定義了元件共有的基本屬性及方法,例如:在窗口中的位置、元件的線條及填充顏色、元件管腳的坐標,其次,對元件操作時的方法,例如:元件的繪制和對其他屬性進行設置等。為了讓元件對象能方便地以數(shù)據(jù)文件的形式在存儲器中存儲和
讀取,將CYuanJian類的父類定義為VC++MFC提供的基類CObject類。這樣就可使用CObject類的成員函數(shù)Serialize()對元件對象進行串行化。由于每個元件的外形均不相同,對元件進行繪制的Draw()函數(shù)和元件移動函數(shù)Move()定義為虛函數(shù),利用VC++的多態(tài)性在子類中實現(xiàn)。同時這使得CYuanJian類成為了抽象類,CYuanJian類僅用來派生子類,不能實例化。
對每一個元件或單元模塊都根據(jù)上述方法建立對應的類。元件類的建立是仿真電路建立的基礎。根據(jù)元件的功能要設計其自身特有的屬性和方法。由于元件較多受篇幅限制不再一一詳細敘述。
4.3 電路仿真設計與實現(xiàn)
單片機電路設計在現(xiàn)實中是非常復雜的,要考慮眾多因素,如:接口的驅(qū)動能力、布線不良使數(shù)字噪聲影響模擬信號、電源去耦合、高低頻噪聲的處理、信號延時造成的競爭與冒險、阻抗匹配等。在電路仿真設計時同樣采用元件設計時的思路,將電路簡化為一個數(shù)字電路模型。通過元件類中管腳結(jié)點號這一屬性記錄元件的連接信息,再通過結(jié)點表記錄各個結(jié)點的邏輯電平,最終元件同過結(jié)點的邏輯電平計算出自己的狀態(tài)。
數(shù)字電路中所有數(shù)字器件天然的按照時間的推移并行運算。輸入的變化導致器件按照內(nèi)部的電路,完成一定的邏輯運算并可能導致輸出的改變。實際電路中各個器件是并行運行的,而程序指令的執(zhí)行是串行的。在軟件仿真中,引腳狀態(tài)的變化,數(shù)字器件的運算,只能按照程序中函數(shù)調(diào)用的順序,逐一執(zhí)行,或交替執(zhí)行。在不考慮信號延時的情況下,程序通過循環(huán),檢測元件電路狀態(tài)最終計算出電路穩(wěn)定時的各元件輸出值,達到與實際電路一致的目的。電路仿真設計主要有以下幾個部分:
(1)元件的基本操作和元件的連接
單片機仿真實驗軟件系統(tǒng)通過電路建立菜單中各菜單項及工具欄按鈕向用戶提供操作類型選擇。用戶首先選擇操作類型,主要包括選擇元件、添加元件、設置結(jié)點、連接元件等。用戶通過鍵盤操作(按下shift鍵)和鼠標操作(左鍵單擊、右鍵單擊、雙擊、拖動)進行仿真電路的建立或修改,系統(tǒng)獲得Windows消息判斷出鼠標和鍵盤事件再結(jié)合操作類型以決定程序如何執(zhí)行;元件的連接反映出用戶期望實現(xiàn)的電路功能,仿真電路子系統(tǒng)要完成連接線和連接點信息的記錄,元件管腳結(jié)點號的更新,結(jié)點表的建立及更新。
(2)電路初始狀態(tài)的計算
電路初始狀態(tài)的計算的主要目的是根據(jù)仿真電路中的具體元件和連接信息計算出電路各結(jié)點的邏輯電平,進而計算各元件管腳的邏輯電平,最終決定各元件的狀態(tài)。在這里將元件管腳分為輸入型、輸出型和雙向型三類,并設置優(yōu)先度。建立結(jié)點表時會將元件管腳的優(yōu)先度傳遞給結(jié)點,但電路元件狀態(tài)發(fā)生改變更新結(jié)點表時,對某一結(jié)點的改變要參考優(yōu)先度決定結(jié)點值。并在電路狀態(tài)計算時設計了一組規(guī)則以保證電路計算的正確性。電路初始狀態(tài)計算時發(fā)現(xiàn)仿真電路違反連接規(guī)則時停止計算提示用戶修改。否則遵循計算規(guī)則進行計算。
(3)電路狀態(tài)的跟蹤
與現(xiàn)實中的單片機實驗一樣,在用戶進行仿真運行時有兩種情況會改變仿真電路的狀態(tài),一是:正在運行的用戶程序改變了單片機的I/O口。二是:用戶通過鼠標操作改變了電路中按鈕開關或撥動開關的狀態(tài)。在設計時定義兩個函數(shù)IOchange()和SWehange(),該函數(shù)采用與電路初始狀態(tài)計算相似的算法計算當前電路狀態(tài)。仿真電路子系統(tǒng)將重新計算電路中個結(jié)點的邏輯值并更新元件管腳的值。同時發(fā)出消息使所有元件將發(fā)生重繪,在元件重繪時由元件類自己的成員函數(shù)根據(jù)管腳值計算元件狀態(tài)繪制對應圖形。
5 結(jié)論
本文在深入分析單片機實驗教學需求的基礎上,對單片機實驗教學仿真軟件建立系統(tǒng)模型并針對功能最為重要的仿真編譯、仿真運行和電路仿真三個子系統(tǒng)的設計方法進行詳細的論述。對詞法分析、語法分析、元件操作、元件連接以及電路狀態(tài)計算跟蹤等重要功能,設計了相關算法。由于單片機的實際應用涉及到很多領域的相關知識,本文不是非常成熟和完善。但同時我們看到單片機實驗教學仿真軟件的應用在單片機的教學過程中有著巨大的使用價值和深遠的意義。