新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > PIC單片機(jī)C語(yǔ)言程序設(shè)計(jì)(12)

PIC單片機(jī)C語(yǔ)言程序設(shè)計(jì)(12)

作者: 時(shí)間:2013-02-05 來(lái)源:網(wǎng)絡(luò) 收藏

改寫(xiě)后的pic07a.C 的功能,是0 ~ 03 的增量循環(huán)計(jì)數(shù),其增量耗時(shí)很短( 不再是1 秒)。

  將pic07a.C 按照《PIC 單片機(jī)C 語(yǔ)言設(shè)計(jì)程序(8)》和《PIC 單片機(jī)C 語(yǔ)言設(shè)計(jì)程序(9)》中所述, 在MPLAB IDE 中存盤(pán), 再進(jìn)行編譯,編譯成功生成目標(biāo)碼。hex 后,便能對(duì)其進(jìn)行模擬仿真操作了。

 ?。?) 根據(jù)《PIC 單片機(jī)C 語(yǔ)言設(shè)計(jì)程序(10)》所述,建立模擬仿真調(diào)試環(huán)境,pic07a.C 源程序編譯成功, 在MPLABIDE 窗口中, 點(diǎn)擊Debugger( 調(diào)試命令)→ Selec TooL…… 的方法, 把pic07a.C 設(shè)置成仿真調(diào)試狀態(tài),再快速點(diǎn)擊模擬調(diào)試快捷圖標(biāo)中的Animate( 動(dòng)畫(huà)運(yùn)行) 和Hate( 停止), 則在pic07a.C 主函數(shù)main( ) 以下的TRISA=0X10 ;的左邊,會(huì)出現(xiàn)一黃色箭頭,如圖53 所示。該箭頭是C 程序運(yùn)行的起始位,即程序運(yùn)行總是從主函數(shù)開(kāi)始的。

圖53

 ?。?)程序運(yùn)行全過(guò)程,點(diǎn)擊圖53 中模擬調(diào)試快捷圖標(biāo)的step lnto(單步運(yùn)行),你會(huì)觀察到,鼠標(biāo)每點(diǎn)擊一次step lnto 命令,圖53 中的黃色箭頭會(huì)沿著C 程序代碼運(yùn)行一次,我們只需用鼠標(biāo)一次一次地點(diǎn)擊step lnto 命令,黃色箭頭就沿著主函數(shù)以下的C 代碼一步一步地運(yùn)行。

  當(dāng)點(diǎn)擊step lnto,使黃色箭頭到達(dá)while(1)語(yǔ)句時(shí),程序的運(yùn)行就進(jìn)入到while(1) 語(yǔ)句的無(wú)限循環(huán)區(qū)域,這時(shí),程序僅在while(1) 區(qū)域運(yùn)行,不再返回主函數(shù)(除非復(fù)位)。下面看看,程序在while(1) 中是如何運(yùn)行的。

  繼續(xù)用鼠標(biāo)一步一步點(diǎn)擊step lnto, 一旦黃色箭頭到達(dá)調(diào)用顯示函數(shù)display(x) ;,黃色箭頭就會(huì)跳轉(zhuǎn)到顯示函數(shù)void display(unsignedint x)的說(shuō)明語(yǔ)句中運(yùn)行。注意:按上述單步運(yùn)行,當(dāng)黃色箭頭到達(dá)unit_bit=x%10;(送個(gè)位數(shù)顯示)時(shí),因它和下一條代碼ten_bit=x/10%10(送十位數(shù)顯示)的操作耗時(shí)太長(zhǎng),用step lnto 命令難以進(jìn)行,應(yīng)改用模擬調(diào)試快捷圖標(biāo)中的命令stepover(單步越過(guò)),即點(diǎn)擊兩次step over,黃色箭頭就運(yùn)行到while(d>0) 語(yǔ)句。然后又用steplnto(單步運(yùn)行),即一步一步點(diǎn)擊step lnto,黃色箭頭就沿著while(d>0) 中的C 代碼運(yùn)行。當(dāng)運(yùn)行到調(diào)用延時(shí)delay(4) ;時(shí)再點(diǎn)擊step lnto,黃色箭頭轉(zhuǎn)到延時(shí)函數(shù)Void delay(unsignedlong int k) 中進(jìn)行延時(shí)功能操作。因delay(4);的形參數(shù)為4,所以標(biāo)點(diǎn)擊step lnto 命令應(yīng)4 次,才能跳出延時(shí)操作功能,此后黃色箭頭又回到RA3=1 ;代碼,依序用鼠標(biāo)一步一步點(diǎn)擊steplnto 運(yùn)行,黃色箭頭又運(yùn)行到調(diào)用延時(shí)delay(4)時(shí),又轉(zhuǎn)到前述延時(shí)函數(shù)進(jìn)行延時(shí)功能操作,也是點(diǎn)擊step lnto 命令,又是 4 次,才能跳出延時(shí)函數(shù)。按上述規(guī)律,當(dāng)黃色光標(biāo)箭頭運(yùn)行到自減量d-- ;時(shí),d 值從3 減1 得2,while(d>0)語(yǔ)句中d 仍大于0, 黃色光標(biāo)箭頭再次回到whila(d>0) 中的代碼中, 點(diǎn)擊step lnto 命令重復(fù)上述程序運(yùn)行過(guò)程,直到d-- ;從3 減到0,黃色箭頭跳出while(d>0) 語(yǔ)句, 回到while(1)語(yǔ)句中的x++ ;使x 值從0 增量到1。再用鼠標(biāo)點(diǎn)擊step lnto,黃色光標(biāo)箭頭到達(dá)if(x==4) 語(yǔ)句,判斷x 是否等于4,若不為4(此時(shí)x 等于1),黃色光標(biāo)箭頭隨鼠標(biāo)點(diǎn)擊step lnto 又回到調(diào)用顯示函數(shù)display(x) ;中運(yùn)行。按上述方法重復(fù)操作,當(dāng)x++; 自增量等于4 時(shí),由if(x==4) 條件語(yǔ)句引導(dǎo)給x 賦值0,即x=0 ;pic07a.C 程序中的x++ 的0-4 增量計(jì)數(shù)全部完成。上述C 程序運(yùn)行全過(guò)程,讀者應(yīng)反復(fù)熟練操作。

 ?、?模擬仿真找出pic07.C 程序的錯(cuò)誤pic07.C 的功能, 是0 ~ 99 增量計(jì)數(shù)( △ 為1 秒)。初看程序while(1) 中的x++ ;條件是if(x==99) 時(shí)給x 賦值0(x=0;),即能完成0 ~ 99的計(jì)數(shù)功能??墒聦?shí)上,如果將pic07.C 進(jìn)行編譯生成目標(biāo)碼。hex,再用PIC 編程器將該目標(biāo)碼燒寫(xiě)到PIC16F84A 芯片中, 用《PIC 單片機(jī)C 語(yǔ)言設(shè)計(jì)程序(4)》中的電路圖3 的實(shí)驗(yàn)板通電觀察兩位數(shù)碼管顯示時(shí),循環(huán)計(jì)數(shù)顯示的是0 ~ 98 而不是0 ~ 99(約1 秒)計(jì)數(shù)。實(shí)驗(yàn)說(shuō)明,pic07.C 程序沒(méi)有達(dá)到設(shè)計(jì)要求,程序中有錯(cuò)誤。

  下面我們一起來(lái)通過(guò)模擬仿真找到該錯(cuò)誤點(diǎn)并進(jìn)行修正。

  具體操作過(guò)程如下:

  在MPLAB IDE 中, 按照《PIC 單片機(jī)C 語(yǔ)言設(shè)計(jì)程序(11)》中介紹的方法, 點(diǎn)擊debugger, 在下拉菜單中將stop watch( 跑表)調(diào)到圖53 的窗口中(時(shí)鐘頻率為4HZ),再點(diǎn)擊MPLAB IDE 中的View, 在下拉菜單中點(diǎn)擊Locals(局部變量), 將Locals 界面也調(diào)到圖53 窗口中,用鼠標(biāo)調(diào)整各界面后的顯示界面如圖54 所示。圖54 中的Locals 界面上顯示有Address(地址)、Symbol Name ( 符號(hào)名或參數(shù)名) 和Valua(取值)。

圖54

  在進(jìn)行下面的模擬調(diào)試時(shí)注意觀察,會(huì)看到Locals 界面各參數(shù)隨調(diào)試運(yùn)行顯示。按照前述方法,對(duì)圖54 中的程序(pic07a.C)進(jìn)行全過(guò)程運(yùn)行。用鼠標(biāo)一步一步點(diǎn)擊模擬調(diào)試快捷圖標(biāo)中的step lnto,一旦程序旁邊的黃色箭頭運(yùn)行到顯示函數(shù)Void display(unsigned int x) 以下代碼時(shí),圖54 中的Locals(局部變量)就會(huì)出現(xiàn)pic07a.C 參數(shù)相關(guān)的顯示值,見(jiàn)圖55。

圖55

  symbol Name(符號(hào)名)為ten_bit(顯示十位數(shù)),unit_bit( 顯示個(gè)位數(shù)、d(unsignenint d)、SEG7(7 段碼) 和X( 自增量) 的Address( 地址) 分別為0010、0012、0014、0016 和000E。這些Value(值)由程序運(yùn)行決定。Locals(局部變量)界面顯示的,實(shí)際上是pic07a.C 程序主要參數(shù),可幫助用戶了解程序的重要功能參數(shù)隨程序運(yùn)行(黃色光標(biāo)指示)的變化,而這些功能參數(shù)正是增量計(jì)數(shù)時(shí)所需的數(shù)據(jù)。只要按照上述方法,對(duì)該程序進(jìn)行全功能運(yùn)行, 直到X++ ;自增量為4, 即滿足了if(x=4)的條件,此時(shí)X=0 ;(給X 賦值0), 再用鼠標(biāo)點(diǎn)擊step lnto,Locals 的界面演變成圖56。從圖54 可清楚看出:只要X++ ;(自增量)滿足if 語(yǔ)句的條件,就會(huì)給X 賦值0,這里X++ ;一旦為4,就給X 賦值0,所以程序再運(yùn)行時(shí),回到調(diào)用顯示函數(shù)display(x),其中X 已為0,再運(yùn)行,其個(gè)位unit_bit 顯示即為0,而不會(huì)是X++ ;的4 值, 如圖56 中的unit_pit(個(gè)位)只能為3。

圖56

  程序再運(yùn)行,顯示又從0 開(kāi)始直到0 ~ 03 為止。

  由此可見(jiàn),對(duì)于pic07a.C,當(dāng)X++ ;自增量為4 時(shí),會(huì)立刻因it(x==4) 的條件而導(dǎo)致X=0,所以程序運(yùn)行顯示時(shí),只會(huì)從unit_bit ;的3 回到0,而不可能使個(gè)位顯示X++ ;自增的4 值。按上述邏輯過(guò)程,對(duì)Pic07.C,當(dāng)其中的X++ ;自增為99 時(shí),同樣會(huì)由if(x==99) 的條件滿足而使X=0 ;程序運(yùn)行時(shí),只能是顯示98 后即清零,不可能顯示99。如果想滿足0 ~ 99 的增量顯示,必須將條件語(yǔ)句if(x==99) 改為if(X==100)⑶ 模擬仿真優(yōu)化C 程序代碼利用模擬仿真,可對(duì)C 程序中的代碼進(jìn)行優(yōu)化(即去掉多余的代碼),以簡(jiǎn)化程序而不改變其功能。當(dāng)然,優(yōu)化后的程序還應(yīng)通過(guò)最后的實(shí)驗(yàn)驗(yàn)證。例如pic07.C 的延時(shí)函數(shù)Void delay(unsighed long int k)可優(yōu)化為Void delay(unsighed int k) 而不需要long 的條件,因?yàn)閕nt k 的定義范圍已滿足了程序中delay(200); 即K=200 的要求。受版面限制,筆者不再介紹此程序的優(yōu)化過(guò)程??傊?,利用MPLAB IDE 7.40 開(kāi)發(fā)環(huán)境進(jìn)行程序的SIM 模擬仿真,對(duì)初學(xué)C 語(yǔ)言是十分有用的,大家必須熟練掌握其操作方法。

c語(yǔ)言相關(guān)文章:c語(yǔ)言教程



上一頁(yè) 1 2 下一頁(yè)

評(píng)論


相關(guān)推薦

技術(shù)專(zhuān)區(qū)

關(guān)閉