




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、一、Proteus VSM仿真模型簡介 在使用Proteus仿真單片機系統的過程中,經常找不到所需的元件,這就需要自己編寫。Proteus VSM的一個主要特色是使用基于DLL組件模型的可擴展性。這些模型分為兩類:電氣模型(Electrical Model)和繪圖模型(Graphical Model)。電氣模型實現元件的電氣特性,按規定的時序接收數據和輸出數據;繪圖模型實現仿真時與用戶的交互,例如LCD的顯示。一個元件可以只實現電氣模型,也可以都實現電氣和繪圖模型。 Proteus為VSM模型提供了一些C+抽象類接口,用戶創建元件時需要在DL
2、L中實現相應的抽象類。VSM模型和Proteus系統通信的原理如下圖:url= && image.height>0)if(image.width>=510)this.width=510;this.height=image.height*510/image.width;" border="0">/url 繪圖模型接口抽象類:ICOMPONENTISIS內部一個活動組件對象,為VSM模型提供在原理圖上繪圖和用戶交互的服務。IACTIVEMODEL用戶實現的VSM繪圖模型要繼承此類,并實現相應的繪圖和鍵盤鼠標事件處理。電氣模型接口抽象類
3、:IINSTANCE一個PROSPICE仿真原始模型,為VSM模型提供訪問屬性、模擬節點和數據引腳的服務,還允許模型通過仿真日志發出警告和錯誤信息。ISPICECKT(模擬)SPICE擁有的模擬元件,提供的服務:訪問、創建和刪除節點,在稀疏矩陣上分配空間,同時還允許模型在給定時刻強制仿真時刻點的發生和掛起仿真。ISPICEMODEL(模擬)用戶實現的VSM模擬元件要繼承此類,并實現相應的載入數據,在完成的時間點處理數據等。IDSIMCKT(數字)DSIM擁有的數字元件,提供的服務:訪問數字系統的變量,創建回調函數和掛起仿真。IDSIMMODEL(數字)用戶實現的VSM數字元件要繼承此類,并實現
4、相應的引腳狀態變化的判斷和回調事件的處理。IDSIMPIN(數字)數字組件的引腳,提供檢測引腳狀態和創建輸出事務事件的服務。IDBUSPIN(數字)數字組件的數據或地址總線,提供檢測總線狀態和創建總線輸出事務事件的服務。IMIXEDMODEL(混合)同時繼承了ISPICEMODEL 和 IDSIMMODEL,元件既有模擬特性,又有數字特性。 為了讓Proteus訪問用戶模型中的成員函數,必須創建用戶模型的一個實例。這不能通過類的接口來實現,只能通過從DLL中導出幾個C函數來實現,在用戶模型中必須實現這些C函數,達到構造和析構用戶模型實例的效果
5、。(1)構造和析構繪圖模型實例:IACTIVEMODEL *createactivemodel (CHAR *device, ILICENCESERVER *ils)VOID deleteactivemodel (IACTIVEMODEL *model)(2)構造和析構模擬電氣模型實例:ISPICEMODEL *createspicemodel (CHAR *device, ILICENCESERVER *ils)VOID deletespicemodel (ISPICEMODEL *model)(3)構造和析構數字電氣模型實例:IDSIMMODEL *createdsimmodel (CHA
6、R *device, ILICENCESERVER *ils)VOID deletedsimmodel (IDSIMMODEL *model)(4)構造和析構混合電氣模型實例:IMIXEDMODEL *createmixedmodel (CHAR *device, ILICENCESERVER *ils)VOID deletemixedmodel (IDSIMMODEL *model)二、Proteus VSM仿真模型開發流程1繪制元件圖形、引腳和相關符號。2制作元件,設置元件屬性。3用C+編寫元件,實現電氣和繪圖模型,編譯生成DLL。4搭建電路仿真測試。三、VSM模型開發實例下面以TG192
7、64A點陣式液晶顯示元件的開發為實例詳細講解開發過程。1打開Proteus,選擇菜單 查看>>Snap 10 th,選擇左邊繪圖工具欄的2D graphics box,繪制如圖所示的三個圖形。url= && image.height>0)if(image.width>=510)this.width=510;this.height=image.height*510/image.width;" border="0">/url 2選擇2D graphics line,給出兩條直線,設置width為36th,顏色為灰色。選擇2
8、D graphics circle,給四個角繪制安裝孔。選擇Markers for component origin,給三個圖形分別繪圖符號原點(圖中紅色部分)。url= && image.height>0)if(image.width>=510)this.width=510;this.height=image.height*510/image.width;" border="0">/url 3選擇Device pin,順時針旋轉90度,放置20個引腳,如圖所示。GND、VCC、V0、Vee、LED+的電氣類型選擇PP-Power
9、 Pin,D/I、R/W、E、CS1、RET、CS2、CS3的電氣類型選擇IP-Input,D0D7的電氣類型選擇IO- Bidirectional。url= && image.height>0)if(image.width>=510)this.width=510;this.height=image.height*510/image.width;" border="0">/url 4右鍵拖出選擇框選擇第一個符號,選擇菜單庫>>制作符號,命名為LCD19264A_C,確定。同理,第二和第三個分別命名為LCD19264A_
10、1 和LCD19264A_0。當用戶調用drawsymbol (-1),將繪制LCD19264A_C,調用drawsymbol (1),將繪制LCD19264A_1,調用drawsymbol (0),將繪制LCD19264A_0。url= && image.height>0)if(image.width>=510)this.width=510;this.height=image.height*510/image.width;" border="0">/url 5右鍵拖出選擇框選擇符號LCD19264A_C,選擇菜單庫>>
11、;制作元件,Device Properties設置如圖,url= && image.height>0)if(image.width>=510)this.width=510;this.height=image.height*510/image.width;" border="0">/url 點擊Next>。跳過封裝設置,點擊Next>。組件屬性設置如圖,url= && image.height>0)if(image.width>=510)this.width=510;this.height=i
12、mage.height*510/image.width;" border="0">/url url= && image.height>0)if(image.width>=510)this.width=510;this.height=image.height*510/image.width;" border="0">/url 點擊Next>。選擇數據手冊(可選),點擊Next>。選擇器件庫,點擊OK。 6打開VC,新建工程,選擇Win32 Dynamic-Link Library,給工
13、程命名,建立空的DLL工程。從Proteus安裝目錄的INCLUDE文件夾中將VSM.HPP復制到當前工程目錄,新建文件 LCD19264A.H和LCD19264A.CPP,編寫如下代碼。CODE:/* 文件:LCD19264A.H* 說明:不支持以下特性* (1) 不支持顯示開關控制* (2) 不支持設置顯示起始行*/i nclude "vsm.hpp"/LCD常量#define LCD_BLK_NUM 3 /lcd block number#define LCD_BLK_LEN 64
14、;/lcd block length#define見手冊)BYTE DDRAMLCD_BLK_NUMLCD_BLK_LEN*LCD_WIDTH/8; /LCD顯示RAMBOOL new_flag; /新數據到達標志/顯示參數BOX lcdarea; /LCD顯示區域float pix_width, pix_height; /每象素對應矩形的寬和高;CODE:/* 文件:LCD19264A.CPP* 說明:不支持以下特性* (1) 不支持顯示開關控制* (2) 不支持設置顯示起始行*/i nclude i nclude "LCD19264A.h"/-/電氣模型的實現/構造數字
15、電氣模型實例extern "C" IDSIMMODEL _declspec(dllexport) * createdsimmodel (CHAR *device, ILICENCESERVER *ils)/授權認證ils->authorize(0x88888888, 0x69); /版本為6.9return new LCD19264A; /創建模型實例/析構數字電氣模型實例extern "C" VOID _declspec(dllexport) deletedsimmodel (IDSIMMODEL *model)delete (LCD19264A
16、 *)model; /刪除模型實例/數字電路總是返回TRUEINT LCD19264A:isdigital (CHAR *pinname)return 1;/當創建模型實例時被調用,做初始化工作VOID LCD19264A:setup (IINSTANCE *inst, IDSIMCKT *dsim)instance = inst; /PROSPICE仿真原始模型ckt = dsim; /DSIM的數字元件/獲取引腳di = instance->getdsimpin("D/I,d/i", true);di->setstate(FLT); /
17、FLOATrw = instance->getdsimpin("R/W,r/w", true);rw->setstate(FLT);en = instance->getdsimpin("E,e", true);en->setstate(FLT);cs1 = instance->getdsimpin("CS1,cs1", true);cs1->setstate(FLT);cs2 = instance->getdsimpin("CS2,cs2", true);cs2->s
18、etstate(FLT);cs3 = instance->getdsimpin("CS3,cs3", true);cs3->setstate(FLT);d0 = instance->getdsimpin("D0,d0", true);d0->setstate(FLT);d1 = instance->getdsimpin("D1,d1", true);d1->setstate(FLT);d2 = instance->getdsimpin("D2,d2", true);d2-&
19、gt;setstate(FLT);d3 = instance->getdsimpin("D3,d3", true);d3->setstate(FLT);d4 = instance->getdsimpin("D4,d4", true);d4->setstate(FLT);d5 = instance->getdsimpin("D5,d5", true);d5->setstate(FLT);d6 = instance->getdsimpin("D6,d6", true);d6-&
20、gt;setstate(FLT);d7 = instance->getdsimpin("D7,d7", true);d7->setstate(FLT);/為方便操作,將D0D7映射為8位總線databus = instance->getbuspin("LCD_DBUS", d, 8);databus->settiming(100,100,100); /設置時間延遲databus->setstates(SHI,SLO,FLT); /設置總線邏輯為1,0,三態時的驅動狀態/lcd modelx_addr = 0; /X地址(見手
21、冊)y_addr = 0; /Y地址(見手冊)status = 0; /狀態(見手冊)new_flag = TRUE; /新數據到達標志/仿真運行模式控制,交互仿真中每幀開始時被調用VOID LCD19264A:runctrl (RUNMODES mode)/交互仿真時用戶改變按鍵等的狀態時被調用VOID LCD19264A:actuate (REALTIME time, ACTIVESTATE newstate)/交互仿真時每幀結束時被調用,通過傳遞ACTIVEDATA數據與繪圖模型通信,從而調用animate()進行繪圖BOOL LCD19264A:indicate (REALTIME t
22、ime, ACTIVEDATA *data)if(new_flag) /有新數據到達 data->type = ADT_REAL; /call back animate() to refresh lcd data->realval = (float)time*DSIMTICK;return TRUE;/當引腳狀態變化時被調用,主要用來處理數據輸入和輸出VOID LCD19264A:simulate (ABSTIME time, DSIMMODES mode)BYTE data;if(en->isnegedge()
23、0;/E的下降沿到達 if(rw->istate()=SLO)|(rw->istate()=WLO) /R/W為低表示寫 /讀塊選擇 if(cs1->istate()=SLO)|(cs1->istate()=WLO) cur_blk = 0; else if(cs2->istate()=SLO)|(cs2->istate()=WLO) cur_blk = 1; else if(cs3->
24、;istate()=SLO)|(cs3->istate()=WLO) cur_blk = 2; else return; /not select block data = (BYTE)databus->getbusvalue(); /讀數據 if(di->istate()=SHI)|(di->istate()=WHI) /D/I為高表示數據 DDRAMcur_blkx_addr*LCD_BLK_L
25、EN+y_addr = data; /寫入數據 new_flag = TRUE; /新數據到達標志 y_addr = (y_addr+1)%LCD_BLK_LEN); /y地址自動加1 if(y_addr=0) x_addr = (x_addr+1)%LCD_LINE_NUM); /自動換行 else /D/I為低表示命令 switch(data&CMD_MASK)
26、160; case DISP_ONOFF: /開關背光 break; case SET_STARTLINE: /設置起始行 break; case SET_XADDRESS: /設置X地址 x_addr = (data&0x07); /bit2bit0 break; case S
27、ET_YADDRESS: /設置Y地址 y_addr = (data&0x3f); /bit5bit0 break; default: break; else /E的下降沿到達,R/W為高表示讀結束 databus->drivetristate(time); /驅動總線為三態
28、60;else if(en->isposedge() /E的上升沿到達 && (rw->istate()=SHI)|(rw->istate()=WHI) /R/W為高表示讀 if(di->istate()=SHI)|(di->istate()=WHI) /D/I為高表示數據 /讀塊選擇 if(cs1->istate()=SLO)|(cs1->istate()=WLO) cur_blk = 0;
29、160; else if(cs2->istate()=SLO)|(cs2->istate()=WLO) cur_blk = 1; else if(cs3->istate()=SLO)|(cs3->istate()=WLO) cur_blk = 2; else return; /not select block data = DDRAMcur_blkx_addr*LCD_BLK_LEN+y_addr;
30、 databus->drivebusvalue(time, data); /輸出數據 y_addr = (y_addr+1)%LCD_BLK_LEN); /y地址自動加1 if(y_addr=0) x_addr = (x_addr+1)%LCD_LINE_NUM); /自動換行 else /D/I為低表示命令 databus->drivebusvalue(time, status); /
31、輸出狀態 /可通過setcallback()設置在給定時間調用的回調函數VOID LCD19264A:callback (ABSTIME time, EVENTID eventid)/-/繪圖模型的實現/ Exported constructor for active component models.extern "C" IACTIVEMODEL _declspec(dllexport) * createactivemodel (CHAR *device, ILICENCESERVER *ils)ils->authorize (0x888888
32、88,0x69); /6.9return new LCD19264A;/ Exported destructor for active component models.extern "C" VOID _declspec(dllexport) deleteactivemodel (IACTIVEMODEL *model)delete (LCD19264A *)model;/當創建模型實例時被調用,做初始化工作VOID LCD19264A:initialize (ICOMPONENT *cpt)/獲取ICOMPONENT接口和初始化component =
33、 cpt;component->setpenwidth(0);component->setpencolour(BLACK);component->setbrushcolour(BLACK);/獲取顯示區域component->getsymbolarea(0,&lcdarea);/計算每象素對應矩形的寬和高pix_width = (float)(lcdarea.x2-lcdarea.x1-BLANK_WIDTH*2-SYM_LINEWIDTH*2)/LCD_LENGTH;pix_height = (float)(lcdarea.y2-lcdarea.y1-BLAN
34、K_WIDTH*2-SYM_LINEWIDTH*2)/LCD_WIDTH;/被PROSPICE調用,返回模擬電氣模型ISPICEMODEL *LCD19264A:getspicemodel (CHAR *)return NULL;/被PROSPICE調用,返回數字電氣模型IDSIMMODEL *LCD19264A:getdsimmodel (CHAR *)return this;/當原理圖需要重繪時被調用VOID LCD19264A:plot (ACTIVESTATE state)/繪制LCD19264A_C元件基本圖形component->drawsymbol(-1);/刷新LCD數據顯示new_flag = TRUE;animate (0, NULL);/當相應的電氣模型產生活動事件時被調用,常用來更新圖形VOID LCD19264A:animate (INT element, ACTIVEDATA *data)BOX pix;BYTE dat,block,line,byte_off,bit_off;if(new_flag) /當有新數據到達 new_flag = FALSE;
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 中學水電使用管理制度
- 中學公務出國管理制度
- 企業消防設備管理制度
- 事業單位內部管理制度
- 交通施工安全管理制度
- pa清潔設備管理制度
- 企業職業健康管理制度
- 書法活動安全管理制度
- 數學教學實踐反思總結
- 人工智能對大學英語教學的影響與發展趨勢
- 江蘇省南通市2024年中考歷史真題試卷(含答案)
- 艦艇損害管制與艦艇損害管制訓練
- 英語國家概況(修訂版)Chapter-18
- 中職語文職業模塊1.2《寧夏閩寧鎮:昔日干沙灘-今日金沙灘》教案
- 《天文學上的曠世之爭》課件
- 2023-2024學年四川省南充市高一下學期7月期末物理試題(解析版)
- 【課件】慶祝新中國成立75周年主題班會課件
- GB/T 44336-2024素肉制品術語與分類
- 人力資源許可證制度(服務流程、服務協議、收費標準、信息發布審查和投訴處理)
- 中學體育七年級《籃球基本技巧》說課課件
- 機械手自動操作控制的程序設計
評論
0/150
提交評論