PIC單片機C語言程序設(shè)計(12)
改寫后的pic07a.C 的功能,是0 ~ 03 的增量循環(huán)計數(shù),其增量耗時很短( 不再是1 秒)。
將pic07a.C 按照《PIC 單片機C 語言設(shè)計程序(8)》和《PIC 單片機C 語言設(shè)計程序(9)》中所述, 在MPLAB IDE 中存盤, 再進(jìn)行編譯,編譯成功生成目標(biāo)碼。hex 后,便能對其進(jìn)行模擬仿真操作了。
?。?) 根據(jù)《PIC 單片機C 語言設(shè)計程序(10)》所述,建立模擬仿真調(diào)試環(huán)境,pic07a.C 源程序編譯成功, 在MPLABIDE 窗口中, 點擊Debugger( 調(diào)試命令)→ Selec TooL…… 的方法, 把pic07a.C 設(shè)置成仿真調(diào)試狀態(tài),再快速點擊模擬調(diào)試快捷圖標(biāo)中的Animate( 動畫運行) 和Hate( 停止), 則在pic07a.C 主函數(shù)main( ) 以下的TRISA=0X10 ;的左邊,會出現(xiàn)一黃色箭頭,如圖53 所示。該箭頭是C 程序運行的起始位,即程序運行總是從主函數(shù)開始的。
圖53
?。?)程序運行全過程,點擊圖53 中模擬調(diào)試快捷圖標(biāo)的step lnto(單步運行),你會觀察到,鼠標(biāo)每點擊一次step lnto 命令,圖53 中的黃色箭頭會沿著C 程序代碼運行一次,我們只需用鼠標(biāo)一次一次地點擊step lnto 命令,黃色箭頭就沿著主函數(shù)以下的C 代碼一步一步地運行。
當(dāng)點擊step lnto,使黃色箭頭到達(dá)while(1)語句時,程序的運行就進(jìn)入到while(1) 語句的無限循環(huán)區(qū)域,這時,程序僅在while(1) 區(qū)域運行,不再返回主函數(shù)(除非復(fù)位)。下面看看,程序在while(1) 中是如何運行的。
繼續(xù)用鼠標(biāo)一步一步點擊step lnto, 一旦黃色箭頭到達(dá)調(diào)用顯示函數(shù)display(x) ;,黃色箭頭就會跳轉(zhuǎn)到顯示函數(shù)void display(unsignedint x)的說明語句中運行。注意:按上述單步運行,當(dāng)黃色箭頭到達(dá)unit_bit=x%10;(送個位數(shù)顯示)時,因它和下一條代碼ten_bit=x/10%10(送十位數(shù)顯示)的操作耗時太長,用step lnto 命令難以進(jìn)行,應(yīng)改用模擬調(diào)試快捷圖標(biāo)中的命令stepover(單步越過),即點擊兩次step over,黃色箭頭就運行到while(d>0) 語句。然后又用steplnto(單步運行),即一步一步點擊step lnto,黃色箭頭就沿著while(d>0) 中的C 代碼運行。當(dāng)運行到調(diào)用延時delay(4) ;時再點擊step lnto,黃色箭頭轉(zhuǎn)到延時函數(shù)Void delay(unsignedlong int k) 中進(jìn)行延時功能操作。因delay(4);的形參數(shù)為4,所以標(biāo)點擊step lnto 命令應(yīng)4 次,才能跳出延時操作功能,此后黃色箭頭又回到RA3=1 ;代碼,依序用鼠標(biāo)一步一步點擊steplnto 運行,黃色箭頭又運行到調(diào)用延時delay(4)時,又轉(zhuǎn)到前述延時函數(shù)進(jìn)行延時功能操作,也是點擊step lnto 命令,又是 4 次,才能跳出延時函數(shù)。按上述規(guī)律,當(dāng)黃色光標(biāo)箭頭運行到自減量d-- ;時,d 值從3 減1 得2,while(d>0)語句中d 仍大于0, 黃色光標(biāo)箭頭再次回到whila(d>0) 中的代碼中, 點擊step lnto 命令重復(fù)上述程序運行過程,直到d-- ;從3 減到0,黃色箭頭跳出while(d>0) 語句, 回到while(1)語句中的x++ ;使x 值從0 增量到1。再用鼠標(biāo)點擊step lnto,黃色光標(biāo)箭頭到達(dá)if(x==4) 語句,判斷x 是否等于4,若不為4(此時x 等于1),黃色光標(biāo)箭頭隨鼠標(biāo)點擊step lnto 又回到調(diào)用顯示函數(shù)display(x) ;中運行。按上述方法重復(fù)操作,當(dāng)x++; 自增量等于4 時,由if(x==4) 條件語句引導(dǎo)給x 賦值0,即x=0 ;pic07a.C 程序中的x++ 的0-4 增量計數(shù)全部完成。上述C 程序運行全過程,讀者應(yīng)反復(fù)熟練操作。
?、?模擬仿真找出pic07.C 程序的錯誤pic07.C 的功能, 是0 ~ 99 增量計數(shù)( △ 為1 秒)。初看程序while(1) 中的x++ ;條件是if(x==99) 時給x 賦值0(x=0;),即能完成0 ~ 99的計數(shù)功能。可事實上,如果將pic07.C 進(jìn)行編譯生成目標(biāo)碼。hex,再用PIC 編程器將該目標(biāo)碼燒寫到PIC16F84A 芯片中, 用《PIC 單片機C 語言設(shè)計程序(4)》中的電路圖3 的實驗板通電觀察兩位數(shù)碼管顯示時,循環(huán)計數(shù)顯示的是0 ~ 98 而不是0 ~ 99(約1 秒)計數(shù)。實驗說明,pic07.C 程序沒有達(dá)到設(shè)計要求,程序中有錯誤。
下面我們一起來通過模擬仿真找到該錯誤點并進(jìn)行修正。
具體操作過程如下:
在MPLAB IDE 中, 按照《PIC 單片機C 語言設(shè)計程序(11)》中介紹的方法, 點擊debugger, 在下拉菜單中將stop watch( 跑表)調(diào)到圖53 的窗口中(時鐘頻率為4HZ),再點擊MPLAB IDE 中的View, 在下拉菜單中點擊Locals(局部變量), 將Locals 界面也調(diào)到圖53 窗口中,用鼠標(biāo)調(diào)整各界面后的顯示界面如圖54 所示。圖54 中的Locals 界面上顯示有Address(地址)、Symbol Name ( 符號名或參數(shù)名) 和Valua(取值)。
圖54
在進(jìn)行下面的模擬調(diào)試時注意觀察,會看到Locals 界面各參數(shù)隨調(diào)試運行顯示。按照前述方法,對圖54 中的程序(pic07a.C)進(jìn)行全過程運行。用鼠標(biāo)一步一步點擊模擬調(diào)試快捷圖標(biāo)中的step lnto,一旦程序旁邊的黃色箭頭運行到顯示函數(shù)Void display(unsigned int x) 以下代碼時,圖54 中的Locals(局部變量)就會出現(xiàn)pic07a.C 參數(shù)相關(guān)的顯示值,見圖55。
圖55
symbol Name(符號名)為ten_bit(顯示十位數(shù)),unit_bit( 顯示個位數(shù)、d(unsignenint d)、SEG7(7 段碼) 和X( 自增量) 的Address( 地址) 分別為0010、0012、0014、0016 和000E。這些Value(值)由程序運行決定。Locals(局部變量)界面顯示的,實際上是pic07a.C 程序主要參數(shù),可幫助用戶了解程序的重要功能參數(shù)隨程序運行(黃色光標(biāo)指示)的變化,而這些功能參數(shù)正是增量計數(shù)時所需的數(shù)據(jù)。只要按照上述方法,對該程序進(jìn)行全功能運行, 直到X++ ;自增量為4, 即滿足了if(x=4)的條件,此時X=0 ;(給X 賦值0), 再用鼠標(biāo)點擊step lnto,Locals 的界面演變成圖56。從圖54 可清楚看出:只要X++ ;(自增量)滿足if 語句的條件,就會給X 賦值0,這里X++ ;一旦為4,就給X 賦值0,所以程序再運行時,回到調(diào)用顯示函數(shù)display(x),其中X 已為0,再運行,其個位unit_bit 顯示即為0,而不會是X++ ;的4 值, 如圖56 中的unit_pit(個位)只能為3。
圖56
程序再運行,顯示又從0 開始直到0 ~ 03 為止。
由此可見,對于pic07a.C,當(dāng)X++ ;自增量為4 時,會立刻因it(x==4) 的條件而導(dǎo)致X=0,所以程序運行顯示時,只會從unit_bit ;的3 回到0,而不可能使個位顯示X++ ;自增的4 值。按上述邏輯過程,對Pic07.C,當(dāng)其中的X++ ;自增為99 時,同樣會由if(x==99) 的條件滿足而使X=0 ;程序運行時,只能是顯示98 后即清零,不可能顯示99。如果想滿足0 ~ 99 的增量顯示,必須將條件語句if(x==99) 改為if(X==100)⑶ 模擬仿真優(yōu)化C 程序代碼利用模擬仿真,可對C 程序中的代碼進(jìn)行優(yōu)化(即去掉多余的代碼),以簡化程序而不改變其功能。當(dāng)然,優(yōu)化后的程序還應(yīng)通過最后的實驗驗證。例如pic07.C 的延時函數(shù)Void delay(unsighed long int k)可優(yōu)化為Void delay(unsighed int k) 而不需要long 的條件,因為int k 的定義范圍已滿足了程序中delay(200); 即K=200 的要求。受版面限制,筆者不再介紹此程序的優(yōu)化過程。總之,利用MPLAB IDE 7.40 開發(fā)環(huán)境進(jìn)行程序的SIM 模擬仿真,對初學(xué)C 語言是十分有用的,大家必須熟練掌握其操作方法。
c語言相關(guān)文章:c語言教程
評論