網(wǎng)上看到資料,任何STC單片機都可硬件仿真。移植到普中開發(fā)板,用STC90C516實驗通過。版權(quán)歸原作者。初學者用來理解程序運行過程,深入點可以調(diào)試程序,不用反復燒錄程序,很好用。
任何一片 STC單片機(如低速 STC89C52,高速 STC12C5A60S2)都支持在片仿真調(diào)試,也稱為在系統(tǒng)調(diào)試,這種調(diào)試方式必須在每個需要調(diào)試的程序中增加 16行固定不變的代碼,并且必須加入 KEIL中自帶的兩個系統(tǒng)文件,先看下面這個最簡單的完整程序吧。 例 2-2:在片調(diào)試,讓接在 P1.0引腳 LED閃爍發(fā)光(工程名:ISD51_Debug.uv2) #include "stc12c5a.h" //STC12C5A60S2單片機寄存器定義頭文件 #include "ISD51.h" //系統(tǒng)調(diào)試專用 #define _DEBUG //系統(tǒng)調(diào)試專用,調(diào)試完成后,發(fā)布程序時,只需將該行注釋掉即可。 //若不注釋掉本行,單片機上電后不會自動執(zhí)行用戶程序,只能通過調(diào)試環(huán)境啟動。 sbit P10=P1^0; void delay(unsigned long cnt) { while(cnt>0) cnt--; } void main(void) { #ifdef _DEBUG //系統(tǒng)調(diào)試專用 SCON = 0x50; //系統(tǒng)調(diào)試專用(0101 0000,8位可變波特率,無奇偶校驗) TMOD = 0x20; //系統(tǒng)調(diào)試專用(定時器工作在方式 2) TH1 = 0xfd; //系統(tǒng)調(diào)試專用(11.059MHz晶振,波特率 9600) TL1 = 0xfd; //系統(tǒng)調(diào)試專用(11.059MHz晶振,波特率 9600) TR1 = 1; //系統(tǒng)調(diào)試專用 ISDinit(); //系統(tǒng)調(diào)試專用 ISDwait(); //系統(tǒng)調(diào)試專用 #endif //系統(tǒng)調(diào)試專用 ES=1; //系統(tǒng)調(diào)試專用 EA=1; //系統(tǒng)調(diào)試專用 while(1) //主程序循環(huán) { #ifdef _DEBUG //系統(tǒng)調(diào)試專用(此行一定不能寫在前行“{”后,否則編譯出錯) ISDcheck(); //系統(tǒng)調(diào)試專用 #endif //系統(tǒng)調(diào)試專用 delay(6); P10=~P10; } } 按正常方式建立工程和 C文件,并將 C文件加入工程,將這個程序代碼復制到 C文件中,把 keil安裝 目錄下\C51\ISD51目錄下的 ISD51.A51、ISD51.H兩個文件復制到當前工程文件夾中,并把 ISD51.A51添 加到 Source Group組中(與添加 C源程序文件方法相同)。 設(shè)置工程, 在Output選項卡選中“Create HEX File”,在Debug選項卡右半塊選擇“Keil ISD51 In-System Debugger”, 去掉 Run to main 的選擇,點 Settings按鈕,設(shè)置串口號和波特率,注意,由于上面代碼中初始化串口時波特率設(shè)的 9600,對應電路板晶振頻率是11.059MHz,所以這里的通信波特率只能設(shè)為9600,否則進入不了調(diào)試界面。   試狀態(tài)前需要重新下載程序或重新給單片機系統(tǒng)上電,或者通過芯片 9腳外部復位按鍵復位單片機,否則可能無法進入調(diào)試狀態(tài)。(提示連接錯誤) 特別提示:單步調(diào)試或程序中設(shè)有斷點,整個程序執(zhí)行速度特別緩慢(比實際運行速度慢 100 倍左右),由于這個原因,對于常見的通信程序,比如有時間限制的 18B20程序,實際程序下載到單片機后運行可能完全正常,而單步或斷點調(diào)試卻得不到正確的結(jié)果,對于這種情況的調(diào)試,可在通信程序開始時關(guān)閉串口中斷(ES=0;),通信程序結(jié)束時打開串口中斷(ES=1;),這樣就不影響程序速度,另外全速運行時也是不會影響程序速度的。 如果 STC的其它中斷函數(shù)擁有的中斷優(yōu)先級別比 ISD51 更高或者相同,要實現(xiàn)斷點或程序單步就不行了,默認狀態(tài)下, ISD51 中斷函數(shù)使用的中斷優(yōu)先等級為 0級(0低級中斷,1高級中斷),所以默認狀態(tài)下是不能調(diào)試帶有中斷函數(shù)的程序。 目前 STC 最新的單片機型號 STC15F2K60S2 可用 IAP15F2K61S2 仿真芯片進行仿真,IAP15F2K61S2仿真芯片也只能仿真 STC15F2K60S2 單片機,此仿真芯片使用方法詳見 STC 官方提供的 ISP 下載軟件。使用此仿真芯片優(yōu)點是不需要在代碼中增加額外代碼,不需要將 HEX 文件下載進入單片機,對程序執(zhí)行速度也沒什么影響,不足之處任然要占用串口(P3.0、P3.1),若在代碼中有操作串口(P3.0、P3.1)的命令,將會中斷程序的調(diào)試過程,如下圖所示。 另外 STC15 系列單片機引腳排列與 STC12 系列不兼容,連電源供電引腳都不一樣,不過還好,兩種單片機互換不會因電源引腳不同燒壞單片機,只是不能正常工作而已。 2.3.3 各種仿真方法對比 使用 P89V51RD2仿真芯片優(yōu)點是價格便宜,操作簡便,運行速度快,可仿真匯編語言和 C語言編寫的代碼,最適用于仿標準 8051內(nèi)核的單片機,如AT89C51,AT89C52等。 STC單片機的在片調(diào)試功能不但可仿真標準 8051的各個功能,還能仿 STC新增的其它功能,如 AD轉(zhuǎn)換、PWM等,缺點是要在每一個需要調(diào)試的程序中增加額外的專門用于調(diào)試的代碼,并且需要占用定時器 0,如果用戶程序中含有軟件延時程序,程序一旦進入延時程序就運行相當緩慢(比實際硬件運行速度慢 100倍),如果代碼中的其它中斷函數(shù)擁有的中斷優(yōu)先級別相比 ISD51 相同或者更高,要實現(xiàn)斷點或程序單步就不能了。在仿真復雜程序時,運行不穩(wěn)定而經(jīng)常死機,仿真SPI通信程序或 AD轉(zhuǎn)換程序時可能執(zhí)行了一條對相 應寄存器的操作命令后在 Watch窗口中根本看不到寄存器內(nèi)容的變化,當然,出現(xiàn)這種類似的不可思議的問題時首先需要檢查KEIL的優(yōu)化級別是否為0,若不為0首先把優(yōu)化級別改為0,另外可將光標定位在Watch窗口中變量值的位置,敲回車鍵刷新一下顯示看看數(shù)值是否有變化。也可單擊工具欄“Toolbox”按鈕如下 圖所示:  單擊后出現(xiàn)了屏幕刷新的小窗口和按鈕,單擊按鈕就可刷新數(shù)據(jù)。 從以上介紹可以看出,P89V51RD2芯片使用方便,主要用于仿傳統(tǒng) 51單片機,ISD51適用于任何一款STC單片機,使用麻煩,穩(wěn)定性較差,IAP15F2K61S2 價格低廉(10 元以下),使用方便,專用于 STC15F2K60S2單片機仿真,3種仿真方式都必須占用標準串口,對串口通信部分無法仿真,實際串口通信中就得特別留意波特率是否正確,計算機輸出字節(jié)數(shù)據(jù)時有時會多輸出無關(guān)的字節(jié),比如用串口助手或自己編寫代碼發(fā)送 3字節(jié)數(shù)據(jù),在有效的 3字節(jié)前有可能產(chǎn)生一個無效字節(jié),導致通信錯誤,單片機程序應加入幀頭識別,只有第一字節(jié)為有效幀頭才開始正式接收數(shù)據(jù),這在以后章節(jié)(單總線 18B20 通信)會有完整實例。有了硬件仿真,千萬別忘了軟件仿真,一般的程序調(diào)試都應先使用軟件仿真,軟件仿真有助于加強程序的理解,軟件仿真正常后下載到單片機觀察運行結(jié)果,如果有問題再次通過軟件仿真分析原因,最后才考慮硬件仿真。 普中開發(fā)板STC90c516RD測試通過。
以上圖文的Word格式文檔下載(內(nèi)容和本網(wǎng)頁上的一模一樣,方便大家保存):
OK-任何STC單片機都可硬件仿真-sim.7z
(1.1 MB, 下載次數(shù): 11)
2022-11-17 18:12 上傳
點擊文件名下載附件
|