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