底 群
(西安職業(yè)技術(shù)學院,西安 710032)
在以教學為目的的單片機虛擬實驗中仿真電路的建立是仿真軟件的核心組成部分。建立仿真電路的主界面對于用戶而言,它提供了一個可視的虛擬的單片機實驗平臺,用戶通過這一平臺建立仿真的實驗電路;當用戶仿真運行實驗程序時,又將通過這一平臺進行相關(guān)操作和觀察實驗現(xiàn)象。對于系統(tǒng)內(nèi)部,仿真電路對用戶建立的電路進行元件的記錄,對電路連接情況進行分析,計算元件(包括單片機端口)的狀態(tài),通過發(fā)送消息與仿真運行子系統(tǒng)交互。最終達到在全軟件仿真的環(huán)境中讓用戶完成單片機教學實驗,并獲得與真實實驗條件下相同的實驗結(jié)果。對于仿真電路的建立通過五個環(huán)節(jié)進行設(shè)計:
元件是電路建立的基礎(chǔ),分析實際教學實驗過程,列出實驗中用到的電器元件主要有51系列單片機89S51、電阻、電容、發(fā)光二極管、三極管、數(shù)碼管、撥動開關(guān)、按鈕開關(guān)、邏輯門電路(與門、或門、非門)、八D鎖存器(74LS373)、譯碼器(74Ls138)、存儲器芯片等。另外將電源、接地、導線、節(jié)點也作為元件進行設(shè)計。對應(yīng)各元件設(shè)計元件類。
元件以簡化的圖形表現(xiàn),在設(shè)計元件時為簡化軟件的設(shè)計,將部分元件以單元模塊的形式進行設(shè)計,例如對于發(fā)光二極管根據(jù)單片機I/O口的驅(qū)動方式設(shè)計兩種單元模塊,如圖1所示。
圖1 發(fā)光二極管單元模塊
這樣的設(shè)計只考慮單片機I/O口驅(qū)動發(fā)光二極管時發(fā)光二極管的狀態(tài)即,導通發(fā)光或截止熄滅,實質(zhì)上是以單元模塊電路的形式將模擬元件簡化為數(shù)字邏輯單元。忽略了電路及元件具體的電流電壓等模擬特性。這種簡化的設(shè)計形式可使學生在做仿真實驗時將注意力集中在程序的編寫和程序的運行過程上,同時,對單片機電路設(shè)計中元件常用的連接方法有更加深刻的認識,當然對于為什么這樣連接及元件的具體參數(shù),學生可以通過老師的講解或查閱資料來進一步學習。這樣的設(shè)計也非常符合實際教學的需求。
類似的單元模塊有,復位模塊、振蕩電路模塊、數(shù)碼管模塊、開關(guān)模塊。
元件設(shè)計時,首先要考慮元件的相關(guān)屬性,例如:在窗口中的位置、元件的線條及填充顏色、元件管腳斷點的坐標、管腳的連接信息和所屬的節(jié)點號、管腳的狀態(tài)(高電平或低電平)、元件的名稱、元件的狀態(tài)等。其次,對元件操作時的方法,例如:元件的繪制和對其它屬性進行設(shè)置等。
元件設(shè)計時首先設(shè)計出CYuanJian類,它繼承自CObject類。對于Cline類和CConnectDot類以外的其它元件類都由CYuanJian類繼承而來。元件在仿真時會具有一些共同的屬性和方法,依據(jù)面向?qū)ο蟮脑O(shè)計方法,將這些屬性和方法在父類中定義并實現(xiàn)。本軟件中的CYuanJian類定義了元件共有的基本屬性及方法。
為了讓元件對象能方便的以數(shù)據(jù)文件的形式在存儲器中存儲和讀取,將CYuanJian類的父類定義為VC++ MFC提供的基類CObject類。這樣就可使用CObject類的成員函數(shù)Serialize()對元件對象進行串行化。
CYuanJian類成員變量的訪問特性設(shè)為Protected以保護類的數(shù)據(jù)。成員函數(shù)的訪問特性設(shè)為Public,通過成員函數(shù)完成類的操作。子類的繼承特性采用Public。由于每個元件的外形均不相同,對元件進行繪制的Draw()函數(shù)和元件移動函數(shù)Move()定義為虛函數(shù),利用VC++的多態(tài)性在子類中實現(xiàn)。同時這使得CYuanJian類成為了抽象類,CYuanJian類僅用來派生子類,不能實例化。
單片機仿真實驗軟件中元件類的設(shè)計方法一致,由于元件類較多這里僅以低電平點亮發(fā)光二極管單元模塊為例,具體說明它的設(shè)計過程。
CLENl類的定義結(jié)構(gòu)如圖2所示。
圖2 CLENl類的結(jié)構(gòu)
CLENl類在繼承CYuanJian類的基礎(chǔ)上,添加了自己特有的屬性和方法。屬性有:二極管的狀態(tài)m_State、導通時的顏色m_BOColor、可連接的管腳端點坐標m_EndPoint、管腳的電平m_EndPointValue、管腳連接的節(jié)點號m_NodeNum。方法有:構(gòu)造函數(shù)LENl()、元件繪制函數(shù)Draw()、元件移動函數(shù)Move()、元件默認名設(shè)置函數(shù)SetDefName()、設(shè)置及獲取導通時顏色函數(shù)SetBOColor()和GetBOColor()、設(shè)置及獲取節(jié)點號函數(shù)SetNodeNum()、設(shè)置管腳值函數(shù)SetEPValue()、獲取管腳端點坐標函數(shù)GetEndPoint()。
對每一個元件或單元模塊都根據(jù)上述方法建立對應(yīng)的類。由于篇幅限制不在詳細敘述。
在元件類建立完成的基礎(chǔ)上,仿真實驗電路建立的第一步就是元件的添加、移動、刪除、設(shè)置元件屬性等基本操作。
在單片機虛擬實驗中通過菜單中各菜單項及工具欄按鈕向用戶提供操作類型選擇。用戶首先選擇操作類型(如果用戶未選擇,系統(tǒng)將操作類型設(shè)置為預(yù)設(shè)的默認值);之后,用戶通過鍵盤和鼠標進行操作,系統(tǒng)獲得Windows消息判斷出鼠標和鍵盤事件再結(jié)合操作類型以決定程序的執(zhí)行。
以新添加元件為例,首先,通過菜單或工具欄按鈕判斷出用戶選擇了添加元件操作及所需添加元件的類型;其次,用該元件類的構(gòu)造函數(shù)新建立一個對象并將對象存入一個集合類中;再次,設(shè)置元件的默認屬性(如:根據(jù)鼠標當前位置確定元件的坐標);最后,調(diào)用元件繪制函數(shù)Draw()繪制函數(shù)。這樣一個虛擬的電子元件就以圖形的形式顯示在顯示器上,用戶可以直觀的觀察并進一步進行移動、刪除、設(shè)置元件屬性等基本操作。
當用戶添加了所需的元件后就需要進行元件的連接,進而建立出用戶所希望得到的實驗電路。此時,用戶需要先選中元件連接菜單或工具欄按鈕,系統(tǒng)判斷用戶的操作,從鼠標單擊某元件的管腳端點或連接點開始,并通過單擊鼠標左鍵確定連線的軌跡,最終當鼠標左鍵單擊另一管腳端點或連接點時結(jié)束。
系統(tǒng)獲取起始點對應(yīng)元件信息同時創(chuàng)建一個Cline類(導線類)對象并將其存入集合類;在用戶進行元件連接的同時系統(tǒng)記錄連接信息并參考起始點和終點的連接信息計算更新結(jié)點表。結(jié)點表記錄了用戶所建立的實驗電路的連接信息,它是進行電路仿真時計算電路狀態(tài)(包括各個元件狀態(tài))的依據(jù)。
電路初始狀態(tài)的計算的主要目的是根據(jù)仿真電路中的具體元件和連接信息計算出電路各結(jié)點的邏輯電平,進而計算各元件管腳的邏輯電平,最終決定各元件的狀態(tài)。
在這里將元件管腳分為輸入型、輸出型和雙向型三類,并設(shè)置優(yōu)先度。例如:接地是輸出型,優(yōu)先度最高為10;電源是輸出型,優(yōu)先度為8;開關(guān)元件是輸出型,優(yōu)先度為9;單片機的P0、P1、P2、P3為雙向型,優(yōu)先度為7;發(fā)光二極管單元模塊是輸入型,優(yōu)先度為最低0(不能主動改變結(jié)點表)。建立結(jié)點表時會將元件管腳的優(yōu)先度傳遞給結(jié)點,但電路元件狀態(tài)發(fā)生改變更新結(jié)點表時,對某一結(jié)點的改變要參考優(yōu)先度決定結(jié)點值。
在電路狀態(tài)計算時設(shè)計了一組規(guī)則以保證電路計算的正確性。規(guī)則較多在此列表列舉部分進行說明。
表1.1電路連接及狀態(tài)說明規(guī)則
編號 規(guī)則類型 規(guī)則說明
1 連接規(guī)則 電源和接地不能直接連接。
2 連接規(guī)則 仿真電路中只能包含一個CSCM類的實例。
3 連接規(guī)則 電源不能和雙向型元件管腳直接連接。
4 連接規(guī)則 輸出型元件管腳不能直接連接。
5 連接規(guī)則 同一元件的輸入型管腳和輸出型管腳不能直接連接。
6 計算規(guī)則 0表示低電平、1表示高電平、5表示無信號
7 計算規(guī)則 直接連接的電路連線及連接點在電氣特性上視為同一結(jié)點
8 計算規(guī)則 節(jié)點表的內(nèi)容與電路連線及連接點的信息保持一致。
9 計算規(guī)則 結(jié)點表更新時結(jié)點值改變必須遵守新值的優(yōu)先度>=原優(yōu)先度
電路初始狀態(tài)計算時發(fā)現(xiàn)仿真電路違反連接規(guī)則時停止計算提示用戶修改。否則遵循表1.1所列計算規(guī)則進行計算。電路初始狀態(tài)計算的算法如下。
①按照接地→電源→單片機→開關(guān)→其它元件的順序,遍歷元件輸出型管腳,將與之連接的結(jié)點值和優(yōu)先度進行修改,更新結(jié)點表。注:某些元件在初始時輸出無法確定將其值設(shè)為5表示無信號。
②對結(jié)點表中結(jié)點值不等于5的結(jié)點,修改其連接的元件管腳值。元件會立刻自動計算自身狀態(tài)改變及輸出。
③按照單片機→其它元件的順序(不包含接地、電源、開關(guān)和純輸入型元件),遍歷元件輸出型管腳,將與之連接的結(jié)點值和優(yōu)先度進行修改,更新結(jié)點表。判斷結(jié)點表是否改變。若節(jié)點表發(fā)生改變,返回第②步;若結(jié)點表未改變,向下執(zhí)行第④步。
④電路初始狀態(tài)計算完畢。對仿真電路窗口進行重繪。
通過以上算法經(jīng)過若干次循環(huán)后可計算出電路初始狀態(tài),計算的復雜度與電路中元件數(shù)量和元件的級聯(lián)層數(shù)有關(guān)。在教學過程中的實驗其電路都較為簡單,元件的數(shù)量一般為十幾個到幾十個,級聯(lián)層數(shù)也不會超過五層,所以該算法是可行的。
與現(xiàn)實中的單片機實驗一樣,在用戶進行仿真運行時有兩種情況會改變仿真電路的狀態(tài),一是:正在運行的用戶程序改變了單片機的I/O口。二是:用戶通過鼠標操作改變了電路中按鈕開關(guān)或撥動開關(guān)的狀態(tài)。
在設(shè)計時定義兩個函數(shù)IOchange()和SWchange(),在上述兩種情況發(fā)生時,分別調(diào)用對應(yīng)函數(shù)進行處理。函數(shù)采用與電路初始狀態(tài)計算相似的算法計算當前電路狀態(tài)。實現(xiàn)實時更新仿真電路狀態(tài),使電路狀態(tài)與程序的執(zhí)行或用戶對電路的操作保持一致。
本文主要闡述單片機虛擬實驗電路建立的方法和過程。討論了仿真元件的設(shè)計方法以及使用面向?qū)ο蠓椒ㄟM行元件類的設(shè)計過程,并以CYuanJian類和CLENl類為例說明各元件的定義。其次討論了電路仿真設(shè)計思路,元件相關(guān)操作的設(shè)計方法,其中關(guān)鍵問題為元件連接信息的獲取即結(jié)點表的維護和電路狀態(tài)的計算方法。
[1]邵春波,張濤.單片機虛擬實驗平臺的設(shè)計與實現(xiàn)[J].臺州學院學報,2008,(6).
[2]辛允東.虛擬實驗和真實實驗的比較研究[J].科技教育創(chuàng)新中國科技信息,2008 ,(10).
[3]黃慕雄.高校教學型虛擬實驗室建設(shè)的現(xiàn)狀與建議[J].電化教育研究, 2005,(9).
[4]張學軍,馬彥芬.EWB仿真在實驗教學中的應(yīng)用[J].河北工程技術(shù)高等專科學校學報,2011,(1)
[5]田軍營,韓建海,單片機實驗的虛擬化改革[J].實驗室科學,2008,(6).
[6]JoséM Garrido.Object - oriented discrete- event simulation with Java ∶ a practical introduction [M].Kluwer Academic/ Plenum Publishers , 2001.
[7]M.J.Harrold.Testing∶ A Roadmap In the Future of Software Engineering [J].Anthony Finkelstein (ED.), pp.63-71,ACM Press 2000