底群
摘 要:主要討論以微型計算機為操作平臺、基于Widnows操作系統的單片機實驗教學仿真軟件的設計。實現對單片機教學實驗的全軟件仿真。針對自主研發的單片機實驗教學仿真軟件的特點和實際實驗教學過程面臨的問題,詳細闡述軟件的系統需求分析、建模及各子系統的詳細設計過程。在此重點論述了仿真編譯、仿真運行和仿真電路子系統的設計思路、相關算法的設計及程序設計與實現。
關 鍵 詞:仿真軟件; 虛擬實驗; 實驗教學; 仿真編譯
中圖分類號:TN964?34 文獻標識碼:A 文章編號:1004?373X(2013)02?0039?03
0 引 言
目前,各高校順應發展設置的單片機課程是機電、自動化等電類專業的一門重要課程,是一門多基礎、多理論的實踐性課程[1]。在高職單片機教學過程中理論教學的發展已經較為完善,而實驗教學由于受到經費的限制,提供的實驗設備有限,不能滿足學生的要求。
鑒于以上情況,開發單片機教學實驗的全軟件仿真。可以減少實驗經費的開銷,又便于增添實驗內容,同時也可借用投影儀更加清晰地為學生做演示實驗,非常有利于學生加深對所學理論知識的感性認識、掌握基本實驗知識、方法、技能。對于有危險性的實驗,虛擬實驗平臺更具有優勢[2]。
1 單片機實驗教學軟件的系統組成
由于單片機實驗教學仿真軟件系統較為復雜固將其設計為如干個子系統,對每個子系統建模和設計,最后將它們連接起來構成整個系統模型。圖1說明了系統的組成和各子系統關系。
圖1 系統模型
考慮到單片機實驗教學仿真軟件的具體情況,同時使用結構化程序設計與面向對象設計2種方法,對于單片機實驗教學仿真軟件系統的功能模塊采用結構化方法來設計。
采用面向對象的方法設計軟件中的用戶界面、各個窗口、菜單、仿真元件等,最后,將各個子系統結合在一起, 就構成了單片機實驗教學仿真軟件。
下面對主要功能模塊進行論述。
2 仿真編譯子系統的設計
實際的編譯是利用編譯程序從源程序產生目標程序的過程。該過程分為5個階段:詞法分析,語法分析,語義檢查,中間代碼生成,代碼優化,目標代碼生成。主要是進行詞法分析和語法分析,又稱為源程序分析[3]。考慮本軟件的實際情況,仿真編譯子系統只進行詞法分析和語法分析,發現有語法錯誤,給出提示信息,仿真編譯成功后將仿真編譯結果保存。
(1)詞法分析模塊調用源程序編輯子系統產生的用戶源程序文件,逐行對文件中用戶輸入的源程序按照單片機指令系統規定的符號,如:(“Rn”、“#”、“/”、“@”、“$”、“:”及7種不同尋址方式表示的數據或地址、指令轉移的偏移量、工作寄存器和特殊功能寄存器的表示符號、44個指令助記符、7個偽指令、用戶定義的標號和符號常量、回車符)。進行詞法分析,判斷用戶源程序中使用的基本符號是否正確,如果不是合法的符號則將錯誤所在的位置及錯誤的類型反饋給用戶,終止仿真編譯等待用戶修改后再一次運行仿真編譯;如果是合法的符號則將每個符號以及符號的類型保存在string類型數組cifa[]和int類型數組type[]中供語法分析程序模塊使用。
(2)語法分析模塊首先定義了51系列單片機所有指令和偽指令的檢查函數。然后在詞法分析的基礎上,從數組cifa[]和數組type[]中取出用戶輸入的字符根據單片機指令的語法格式,字符的前后關系逐一進行處理,并調用指令和偽指令的檢查函數判斷:用戶輸入的源程序是否符合語法規則;標號和符號常量的定義與使用是否正確;偽指令的使用是否正確;程序是否以END結束等。如果存在錯誤則將錯誤所在的位置及錯誤的類型反饋給用戶,終止仿真編譯等待用戶修改后再一次進行仿真編譯;如果是正確的指令則將指令進行處理(對指令地址、指令ID、指令字節數、指令周期、操作數類型、操作數的值等進行處理)后存入預先定義的全局數組對象command中。仿真運行時由仿真運行子系統調用。
3 仿真運行子系統的設計與實現
(1)對51系列單片機指令系統的111條指令建立對應的處理函數,依照地址指針在指令類的數組對象中查詢到對應元素,再根據指令ID調用指令的處理函數,完成指令的所有處理功能,返回下一指令地址給地址指針,實現仿真運行子系統的基本需求。
(2)設計狀態掃描程序,查詢中斷申請。當有中斷時,在指令處理函數在完成指令的所有處理功能后進行中斷處理。
(3)仿真運行子系統與仿真電路建立子系統的信息交換功能的設計通過仿真電路子系統與程序仿真運行子系統的接口函數實現。
當仿真運行子系統仿真執行的指令向單片機I/O接口發送數據,這些數據將引起單片機外接電路及相關元件狀態的改變。此時,由仿真運行子系統向仿真電路子系統發送消息,啟動仿真電路狀態修改進程,對仿真電路及元件的狀態更新。然后修改進程結束將控制權交還,繼續仿真運行。
如果在仿真運行期間仿真電路或元件(僅限按鈕開關)狀態發生改變,此時則由仿真電路子系統向仿真運行子系統發送消息,啟動仿真運行狀態修改進程,更新存儲器單元對應的內部變量。然后修改進程結束將控制權交還,繼續仿真運行。
4 仿真電路子系統的設計
仿真電路子系統在外部,它向用戶提供了一個可視的虛擬的單片機實驗平臺,用戶通過這一平臺建立仿真的實驗電路。當用戶仿真運行實驗源程序時,將再次通過這一平臺進行相關操作,觀察實驗現象。在內部,仿真電路子系統對用戶建立的仿真電路進行元件的記錄、電路連接的分析、節點表的建立與維護、元件(包括單片機端口)狀態得計算,通過發送消息與仿真運行子系統交互。最終達到在完全軟件仿真的環境中讓用戶完成單片機教學實驗,并獲得與真實實驗條件下相同的實驗結果。
4.1 仿真元件的設計與實現
元件是電路建立的基礎[4]。對實驗中用到的電器元件(如:51系列單片機89S51、電阻、電容、發光二極管、數碼管、各種開關、邏輯門電路、譯碼器、存儲器芯片等)設計元件類。另外將電源、接地、導線、節點也作為元件進行設計。
部分元件以簡化的圖形表現,在設計元件時為簡化軟件的設計,將元件以單元模塊的形式進行設計,即以單元模塊電路的形式將模擬元件簡化為數字邏輯單元。忽略了電路及元件具體的電流電壓等模擬特性。類似的單元模塊有,復位模塊、振蕩電路模塊、數碼管模塊、開關模塊。
4.2 元件類的設計與實現
首先設計出CYuanJian類,它定義了元件共有的基本屬性及方法,例如:在窗口中的位置、元件的線條及填充顏色、元件管腳的坐標,其次,對元件操作時的方法,例如:元件的繪制和對其他屬性進行設置等。為了讓元件對象能方便地以數據文件的形式在存儲器中存儲和讀取,將CYuanJian類的父類定義為VC++ MFC提供的基類CObject類。這樣就可使用CObject類的成員函數Serialize()對元件對象進行串行化[5]。由于每個元件的外形均不相同,對元件進行繪制的Draw()函數和元件移動函數Move()定義為虛函數,利用VC++的多態性在子類中實現。同時這使得CYuanJian類成為了抽象類,CYuanJian類僅用來派生子類,不能實例化。
對每一個元件或單元模塊都根據上述方法建立對應的類。元件類的建立是仿真電路建立的基礎。根據元件的功能要設計其自身特有的屬性和方法。由于元件較多受篇幅限制不再一一詳細敘述。
4.3 電路仿真設計與實現
單片機電路設計在現實中是非常復雜的,要考慮眾多因素,如:接口的驅動能力、布線不良使數字噪聲影響模擬信號、電源去耦合、高低頻噪聲的處理、信號延時造成的競爭與冒險、阻抗匹配等[6]。在電路仿真設計時同樣采用元件設計時的思路,將電路簡化為一個數字電路模型。通過元件類中管腳結點號這一屬性記錄元件的連接信息,再通過結點表記錄各個結點的邏輯電平,最終元件同過結點的邏輯電平計算出自己的狀態。
數字電路中所有數字器件天然的按照時間的推移并行運算。輸入的變化導致器件按照內部的電路,完成一定的邏輯運算并可能導致輸出的改變。實際電路中各個器件是并行運行的,而程序指令的執行是串行的[6]。在軟件仿真中,引腳狀態的變化,數字器件的運算,只能按照程序中函數調用的順序,逐一執行,或交替執行。在不考慮信號延時的情況下,程序通過循環,檢測元件電路狀態最終計算出電路穩定時的各元件輸出值,達到與實際電路一致的目的[8]。電路仿真設計主要有以下幾個部分:
(1)元件的基本操作和元件的連接
單片機仿真實驗軟件系統通過電路建立菜單中各菜單項及工具欄按鈕向用戶提供操作類型選擇。用戶首先選擇操作類型,主要包括選擇元件、添加元件、設置結點、連接元件等。用戶通過鍵盤操作(按下shift鍵)和鼠標操作(左鍵單擊、右鍵單擊、雙擊、拖動)進行仿真電路的建立或修改,系統獲得Windows消息判斷出鼠標和鍵盤事件再結合操作類型以決定程序如何執行;元件的連接反映出用戶期望實現的電路功能,仿真電路子系統要完成連接線和連接點信息的記錄,元件管腳結點號的更新,結點表的建立及更新。
(2)電路初始狀態的計算
電路初始狀態的計算的主要目的是根據仿真電路中的具體元件和連接信息計算出電路各結點的邏輯電平,進而計算各元件管腳的邏輯電平,最終決定各元件的狀態。在這里將元件管腳分為輸入型、輸出型和雙向型三類,并設置優先度。建立結點表時會將元件管腳的優先度傳遞給結點,但電路元件狀態發生改變更新結點表時,對某一結點的改變要參考優先度決定結點值。并在電路狀態計算時設計了一組規則以保證電路計算的正確性。電路初始狀態計算時發現仿真電路違反連接規則時停止計算提示用戶修改。否則遵循計算規則進行計算。
(3)電路狀態的跟蹤
與現實中的單片機實驗一樣,在用戶進行仿真運行時有兩種情況會改變仿真電路的狀態,一是:正在運行的用戶程序改變了單片機的I/O口。二是:用戶通過鼠標操作改變了電路中按鈕開關或撥動開關的狀態。在設計時定義兩個函數IOchange()和SWchange(),該函數采用與電路初始狀態計算相似的算法計算當前電路狀態。仿真電路子系統將重新計算電路中個結點的邏輯值并更新元件管腳的值,同時發出消息使所有元件將發生重繪,在元件重繪時由元件類自己的成員函數根據管腳值計算元件狀態繪制對應圖形。
5 結 論
本文在深入分析單片機實驗教學需求的基礎上,對單片機實驗教學仿真軟件建立系統模型并針對功能最為重要的仿真編譯、仿真運行和電路仿真三個子系統的設計方法進行詳細的論述。對詞法分析、語法分析、元件操作、元件連接以及電路狀態計算跟蹤等重要功能,設計了相關算法。由于單片機的實際應用涉及到很多領域的相關知識,本文不是非常成熟和完善。但同時我們看到單片機實驗教學仿真軟件的應用在單片機的教學過程中有著巨大的使用價值和深遠的意義。
參考文獻
[1] 邵春波,張濤.單片機虛擬實驗平臺的設計與實現[J].臺州學院學報,2008(6):7?10.
[2] 封小鈺,余雄.構建單片機虛擬實驗仿真平臺[J].計算機與信息技術,2008(4):32?35.
[3] 劉文秀.單片機應用系統仿真策略的研究[J].現代電子技術,2005,28(14):25?27.
[4] 艾莉.基于VB的單片機虛擬實驗軟件的研制與開發[D].沈陽:沈陽工業大學,2006.
[5] TAIBI Toufik. Hybrid object?oriented method (HOOM): the software development poreess [C]// 36th International Conference on Technology of Object?Oriented Languages and Systems. Xian, China: CTOOLS, 2000:8?17.
[6] 吳王平.基于89C51 單片機的計算機仿真系統設計[J].電腦知識與技術,2004(32):65?67.
[7] 馬鵬舉,張保平.數字電路仿真的Java實現[J].微處理機,2009(1):151?152.
[8] 辛允東.虛擬實驗和真實實驗的比較研究[J].中國科技信息,2008(10):64?66.
[9] GARRIDO José M. Object?oriented discrete?event simulation with Java: a practical introduction [M]. [S.l.]: Kluwer Academic/ Plenum Publishers, 2001.
[10] HARROLD M J. Testing: a roadmap in the future of software engineering [M]. New York: ACM Press, 2000.