- 單片機原理與嵌入式系統設計
- 張齊 朱寧西 畢盛編著
- 4719字
- 2018-12-27 05:43:30
3.4 基于Proteus的單片機系統仿真
單片機系統的開發除了需要購置諸如仿真器、編程器、示波器等價格不菲的電子設備外,開發過程也較煩瑣。如圖3.28所示,用戶程序需要在硬件完成的情況下才能進行軟硬件聯合調試,如果在調試過程中發現硬件錯誤需修改硬件,則要重新設計硬件目標板的PCB(Printed CircuitBoard,印制電路板)并焊接元器件。因此無論從硬件成本還是從開發周期來看,其高風險、低效率的特性顯而易見。
printf函數是極為方便的信息輸出函數,能將程序中的各種變量的值快速格式化并輸出到控制臺,在程序調試和測試中無處不在,C語言教材,例子程序中經常要用到它作為輸出。
英國Labcenter Electronics公司推出的Proteus套件,可以對基于微控制器的設計連同所有的周圍電子器件一起仿真調試,用戶甚至可以實時采用諸如LED/LCD、鍵盤、RS232終端等動態外設模型來對設計進行交互仿真調試,只要原理圖設計完成,軟件設計者就可以開始他們的工作,不用等待一個實際的硬件物理原型的出現。Proteus支持的微處理芯片(Microprocessors ICs)包括8051系列、AVR系列、PIC系列、HC11系列、ARM7/LPC2000系列以及Z80等。
ProteusVSM包含了大量的虛擬儀器,包括示波器、邏輯分析儀函數發生器、數字信號圖案發生器、時鐘計數器、虛擬終端及簡單的電壓表和電流表,為仿真調試提供了強有力的支持。
圖3.29為基于Proteus ISIS仿真軟件的單片機系統設計流程,它極大地簡化了設計工作,并有效地降低了成本和風險,得到眾多單片機工程師的青睞。

圖3.28 傳統的單片機嵌入式系統開發設計流程

圖3.29 基于Proteus ISIS仿真軟件的單片機系統設計流程
在PC上安裝Proteus軟件后,即可完成單片機系統原理圖電路繪制、PCB設計,更為顯著的特點是可以與μVision2 IDE工具軟件結合進行編程仿真調試。本節以Proteus 7 Professional為例介紹Proteus在單片機系統設計中的應用。
Proteus 7.5 Professional軟件主要包括ISIS 7 Professional和ARES 7 Professional,其中ISIS 7 Professional用于繪制原理圖并可進行電路仿真(SPICE仿真),ARES 7 Professional用于PCB設計。本書只介紹前者。
3.4.1 Proteus 7 Professional界面介紹
安裝完 Proteus后,運行ISIS 7 Professional,會出現如圖3.30所示的窗口界面。
窗口內各部分的功能用中文做了標注。ISIS大部分操作與Windows的操作類似。下面簡單介紹其各部分的功能。
1.原理圖編輯窗口(The Editing Window)
顧名思義,它是用來繪制原理圖的。藍色方框內為可編輯區,元器件要放到里面。與其他Windows應用軟件不同,這個窗口是沒有滾動條的,可以用左上角的導航窗口來改變原理圖的可視范圍。
2.預覽窗口(The Overview Window)
它可以顯示兩個內容:在元器件列表中選擇一個元器件時,它會顯示該元器件的預覽圖;當鼠標焦點落在原理圖編輯窗口時(即放置元器件到原理圖編輯窗口后或在原理圖編輯窗口中單擊鼠標后),就變成原理圖的導航窗口,會顯示整張原理圖的縮略圖,并會顯示一個綠色的方框,綠色方框里面的內容就是當前原理圖窗口中顯示的內容,因此可以用鼠標在上面單擊來改變綠色方框的位置,從而改變原理圖的可視范圍。

圖3.30 Proteus ISIS 7的編輯環境
3.模型選擇元器件欄(Mode Selector Toolbar)
主要模型(Main Modes)由上向下功能如下。
配件(Gadgets)由上向下功能如下。
2D圖形(2D Graphics)由上向下功能如下。
4.元器件列表區(The Object Selector)
用于挑選元器件(Components)、終端接口(Terminals)、信號發生器(Generators)、仿真圖表(Graph)等。例如,當選擇“元器件”(Components),單擊P按鈕會打開挑選元器件對話框,選擇了一個元器件后(單擊了OK按鈕后),該元器件會在元器件列表中顯示,以后要用到該元器件時,只需在元器件列表區中選擇即可。
5.方向工具欄(Orientation Toolbar)
旋轉:旋轉角度只能是90的整倍數。
翻轉:水平翻轉和垂直翻轉。
使用方法:先右鍵單擊所選元件,再選擇相應的旋轉圖標。
6.仿真工具欄
仿真控制按鈕由左向右功能分別為:運行、單步運行、暫停、停止。
3.4.2 繪制電路原理圖
下面通過一個簡單的示例說明繪制原理圖過程。
1.將所需元器件加入到對象選擇器窗口
單擊對象選擇器按鈕,在彈出的Pick Devices窗口中,使用搜索引擎,在Keywords欄中分別輸入AT89C52.BUS、BUTTON、SW-SPDT和7SEG-BCD,在搜索結果Results欄中找到該對象,并將其添加到對象選擇器窗口,如圖3.31所示。

圖3.31 把元器件加入到對象選擇器
2.放置元器件至圖形編輯窗口
將AT89C52.BUS、BUTTON、SW-SPDT和7SEG-BCD放置到圖形編輯窗口,如圖3.32所示。

圖3.32 放置元器件至圖形編輯窗口
3.放置總線至圖形編輯窗口
單擊繪圖工具欄中的總線按鈕,使之處于選中狀態。將鼠標置于圖形編輯窗口,繪制出如圖3.33所示的總線。

圖3.33 放置總線至圖形編輯窗口
在繪制總線的過程中,應注意:
① 當鼠標的指針靠近對象的連接點時,鼠標的指針會出現一個“×”號,表明總線可以接至該點;
② 在繪制多段連續總線時,只需要在拐點處單擊鼠標左鍵,其他步驟與繪制一段總線相同。
4.添加電源和接地引腳
單擊繪圖工具欄中的Inter-sheet Terminal按鈕,在對象選擇器窗口,選中對象POWER和GROUND,如圖3.34所示,將其放置到圖形編輯窗口。
5.元器件之間的連線Wiring Up Components on the Schematic
在圖形編輯窗口,完成各對象間的連線,如圖3.35所示。

圖3.34 添加電源和接地引腳

圖3.35 完成各對象的連線后的界面
在此過程中請注意:當線路出現交叉點時,若出現實心小黑圓點,表明導線接通,否則表明導線無接通關系。當然,也可以通過繪圖工具欄中的連接點按鈕,完成兩交叉線的接通。
6.給導線或總線加標簽
單擊繪圖工具欄中的導線標簽按鈕,在圖形編輯窗口,完成導線或總線的標注,如圖3.36所示。

圖3.36 給導線或總線加標簽
在此過程中請注意:
① 總線的命名可以與單片機的總線名相同,也可不同。但方括號內的數字卻賦予了特定的含義。例如,總線命名為P2[0..7],意味著此總線可以分為8條彼此獨立的命名為P20、P21、P22、P23、P24、P25、P26、P27的導線,若該總線一旦標注完成,則系統自動在導線標簽編輯頁面的String欄的下拉菜單中加入以上8組導線名,今后在標注與之相聯的導線名時,如P20,要直接從導線標簽編輯頁面的String欄的下拉菜單中選取,如圖3.37所示。
② 若標注名為,直接在導線標簽編輯頁面的String欄中輸入$WR$即可,也就是說可以用兩個$符號來表示字母上面的橫線。

圖3.37 從下拉菜單中選取標簽
7.添加電壓探針
單擊繪圖工具欄中的電壓探針按鈕,在圖形編輯窗口,完成電壓探針的添加,如圖3.38所示。

圖3.38 添加電壓探針
在此過程中,電壓探針名默認為“?”,當電壓探針的連接點與導線或者總線連接后,電壓探針名自動更改為已標注的導線名、總線名,或者與該導線連接的設備引腳名。

圖3.39 添加文字標注
8.添加文字標注
單擊繪圖工具欄中的文字標注按鈕,在圖形編輯窗口,完成文字標注的添加,如圖3.39所示,此處添加“加1按鈕”、“減1按鈕”、“清零按鈕”。
9.添加虛擬儀器
單擊繪圖工具欄中的文字標注按鈕,選擇VIRTUAL TERMINAL,完成虛擬終端的添加和接線,如圖3.40所示。

圖3.40 添加虛擬儀器
10.修改AT89C52屬性并加載程序文件
雙擊U1-AT89C52,打開Edit Component對話框,如圖3.41所示。在Program File中選擇3.3.3節示例項目HelloWorld生成的hex文件HelloWorld.hex。
在Clock Frequency文本框中填入11.0592MHz,其他為選項默認,單擊OK按鈕退出。
從“文件”下拉菜單選擇“保存”項,出現如圖3.42所示的對話框,提示輸入文件名,圖中設文件名為80C51VSM.DSN,單擊“保存”按鈕。至此,便完成了整個電路圖的繪制。
11.調試運行
單擊仿真運行開始按鈕,能清楚地觀察到:①引腳的電頻變化,紅色代表高電平,藍色代表低電平,灰色代表未接入信號,或者為高阻態;②連到單根信號線上的電壓探針的高低電平值在周期性的變化,連到總線上的電壓探針的值顯示的是總線數據。圖3.43所示的程序運行情況與圖3.27所示的“程序連續運行時的窗口顯示”情況完全符合,但更直觀。圖3.44所示的虛擬終端窗口顯示了printf的打印信息。單擊仿真運行結束按鈕
,仿真結束。

圖3.41 修改AT89C52屬性并加載程序文件

圖3.42 保存文件對話框

圖3.43 調試運行窗口

圖3.44 虛擬終端窗口
3.4.3 ProteusVSM與μVision2的聯調
ProteusVSM能夠提供的CPU仿真模型有ARM7、PIC、Atmel AVR、Motorola HCXX及8051/8052系列。支持單片機系統的仿真是PROTEUSVSM的一大特色。ProteusVSM將源代碼的編輯和編譯整合到同一設計環境中,這樣使得用戶可以在設計中直接編輯代碼,并可容易地查看到用戶對源程序修改后對仿真結果的影響。但對于80C51/80C52系列,目前ProteusVSM只嵌入了8051匯編器,尚不支持高級語言的調試。但ProteusVSM支持第三方集成開發環境IDE,目前支持的第三方80C51IDE有IAR Embedded Workbench、Keil μVision2 IDE。本文以Keil μVision2 IDE為例介紹ProteusVSM與μVision2 IDE的聯調。
對于proteus 6.9或更高的版本,在安裝盤里有vdmagdi插件,或者可以到LABCENTER公司下載該插件,安裝該插件后即可實現與Keil μVision2 IDE的聯調。
下面的敘述是假定已經分別安裝了如下軟件:
① Proteus 7 Professional
② Keil μVision2 IDE
③Vdmagdi.exe
1.ProteusVSM的設置
進入Proteus的ISIS,打開一個原理圖文件(如在3.4.2節所繪制電路原理圖文件80C51VSM.DSN),鼠標左鍵單擊菜單Debug,選中use romote debuger monitor,如圖3.45所示,便可實現μVision2 IDE與Proteus連接調試。
2.μVision2 IDE設置
(1)設置option for target/Debug選項
打開μVision2,建立或打開一個工程,假設打開在3.3.3節所建立的項目HelloWorld。打開“Project菜單/Options for Target 'Target 1'”選項,在彈出的窗口中單擊Debug按鈕,出現如圖3.46所示對話框。

圖3.45 Proteus的設置

圖3.46 μVision2 IDE開發環境option for target/Debug選項設置
在該對話框中,在右欄上部的下拉菜單里選中ProteusVSM Simulator,并單擊一下Use前面表明選中的小圓點。如果所調試的Proteus文件不是裝在本機上,要單擊Setting按鈕,設置通信接口,在Host后面默認是本機IP地址127.0.0.1。如果使用的不是同一臺計算機,則需要在這里添上另一臺計算機的IP地址(另一臺計算機也應安裝Proteus)。在Port后面添加8000。設置好的情形如圖所示,最后單擊OK按鈕即可。
(2)設置option for target/Output選項
接著上述設置,打開Output標簽頁,將Create HEX File項打勾選中,如圖3.47所示。

圖3.47 μVision2 IDE開發環境option for target/Output選項設置
3.ProteusVSM與μVision2的聯調
在μVision2環境下,首先按F7鍵產生該項目的HEX文件,然后單擊進入μVision2調試模式,為了在ProteusVSM環境下能觀察到程序連續運行情況,單擊
取消目前項目中所有斷點。單擊
或按F5鍵進入全速運行,然后切換到ProteusVSM環境,可以看到同圖3.43調試運行窗口完全一致的運行畫面。此時ProteusVSM的運行完全依賴于外部調試器μVision2。
由3.3.3節中的項目HelloWorld的運行情況可知,μVision2 ID只支持AT89C52片內的外圍部件,如圖3.27所示,對AT89C52片外的外圍部件的仿真無能為力。但現在配合ProteusVSM可仿真AT89C52片外的外圍部件。利用圖3.43中接在U1-AT89C52單片機P1.0和P1.3的元器件單刀雙擲開關SW-SPDT和P1.6的元器件按鈕BUTTON可說明如何仿真AT89C52片外的外圍部件。
要求在圖3.43中,當單刀雙擲開關SW-SPDT接到P1.0,單片機P2口輸出進行加法計數,當單刀雙擲開關SW-SPDT接到P1.3,單片機P2口輸出進行減法計數。當按鈕BUTTON按下時超過1秒,單片機P2口的計數輸出清零。
為此修改項目HelloWorld中的文件HelloWorld.c,修改后的源程序如下:
#include <REG52.H>//片內寄存器定義 #include <stdio.h>//輸入/輸出函數庫 sbit inc_BUTTON=P1^0;//加1按鈕 sbit dec_BUTTON=P1^3;//減1按鈕 sbit clr_BUTTON=P1^6;//清0按鈕 void initUart(void);/*初始化串口波特率,使用定時器1*/ /***********mAin C **************/ voidmAin (void) { unsigned long ulTimer;//延時設定的循環次數 unsigned char ucCounter=0;//打印輸出計數 initUart();//為了使用printf語句,要初始化串口 while (1){ P2=ucCounter; printf ("%bx ",ucCounter);/* Print ucCounter */ printf ("Hello World!");/* Print "Hello World" */ if(inc_BUTTON==0)ucCounter++;//加1 if(dec_BUTTON==0)ucCounter--;//減1 if(clr_BUTTON==0)ucCounter=0;//清0 for (ulTimer=0; ulTimer<2000; ulTimer++){}//延時 } } /********** 初始化串口波特率 ************/ //為了使用串行口帶格式輸出函數printf,串口必須初始化 void initUart(void)/*初始化串口波特率,使用定時器1*/ { /* Setup the serial port for 9600Baud at 11.0592MHz */ SCON=0x50;/* SCON: mode 1,8-bit UART,enable rcvr */ TMOD |=0x20;/* TMOD: timer 1,mode 2,8-bit reload */ TH1=0xfd;/* TH1: reloadValue for 9600Baud @ 11.0592MHz*/ TR1=1;/* TR1: timer 1 run */ TI=1;/* TI: set TI to send first char of UART */ }
在μVision2 IDE環境下重新編譯該項目。單擊進入μVision2調試模式,單擊
或按F5鍵進入全速運行。然后切換到ProteusVSM環境。可以分別單擊“加1按鈕”、“減1按鈕”和“清零按鈕”觀察程序單片機外圍部件仿真運行情況。
單擊,可以在程序中設置斷點,可以觀察到在μVision2環境下,斷點運行和單步運行時在ProteusVSM環境下原理圖的變化情況,如圖3.48所示。

圖3.48 ProteusVSM與μVision2 IDE實現聯調
ProteusVSM與μVision2聯調時,ProteusVSM的U1-AT89C52可以不加載任何程序文件。但筆者還是建議,要加載程序文件,且選擇當前在μVision2環境下所調試程序生成的HEX文件。這樣無論是否聯調,ProteusVSM的運行情況總是一致的。
3.4.4 ProteusVSM中的電源、復位與時鐘
ProteusVSM中繪制原理圖時,總是默認微處理器電路已經配置了電源與復位電路。電源與復位總是有效,仿真電路可以省略電源與復位電路。
時鐘電路同樣可以省略,時鐘固有頻率以在微處理器的屬性中所做設置為準。
為了節省版面,后面章節的電路中有時會省略電源、復位與時鐘電路。但在實際的工程實踐中,這些部分缺一不可!