keilc51精確延時程序執(zhí)行時間_第1頁
keilc51精確延時程序執(zhí)行時間_第2頁
keilc51精確延時程序執(zhí)行時間_第3頁
keilc51精確延時程序執(zhí)行時間_第4頁
keilc51精確延時程序執(zhí)行時間_第5頁
免費預(yù)覽已結(jié)束,剩余1頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、Keil C51 精確延時程序執(zhí)行時間引言單片機(jī)因具有體積小、 功能強(qiáng)、成本低以及便于實現(xiàn)分布式控制而有非常廣 泛的應(yīng)用領(lǐng)域 1 。單片機(jī)開發(fā)者在編制各種應(yīng)用程序時經(jīng)常會遇到實現(xiàn)精 確延 時的問題,比如按鍵去抖、數(shù)據(jù)傳輸?shù)炔僮鞫家诔绦蛑胁迦胍欢位驇锥窝訒r, 時間從幾十微秒到幾秒。 有時還要求有很高的精度, 如使用單總線芯片 DS18B20 時,允許誤差范圍在十幾微秒以內(nèi) 2 ,否則,芯片無法工作。用 51 匯編語言寫 程序時,這種問題很容易得到解決,而目前開發(fā)嵌入式系統(tǒng)軟件的主流工具為C語言,用C51寫延時程序時需要一些技巧3。因此,在多年單片機(jī)開發(fā)經(jīng)驗 的基礎(chǔ)上,介紹幾種實用的編制精確延時

2、程序和計算程序執(zhí)行時間 的方法。實現(xiàn)延時通常有兩種方法:一種是硬件延時,要用到定時器 / 計數(shù)器,這種 方法可以提高CPU的工作效率,也能做到精確延時;另一種是軟件延時,這種方 法主要采用循環(huán)體進(jìn)行。1 使用定時器 / 計數(shù)器實現(xiàn)精確延時單片機(jī)系統(tǒng)一般常選用2 MHz、12 MHz或6 MHz晶振。第一種更容易產(chǎn)生 各種標(biāo)準(zhǔn)的波特率,后兩種的一個機(jī)器周期分別為1 us和2卩S,便于精確延時。本程序中假設(shè)使用頻率為12 MHz的晶振。最長的延時時間可達(dá) 216=65 536 卩S。若定時器工作在方式2,則可實現(xiàn)極短時間的精確延時;如使用其他定時 方式,則要考慮重裝定時初值的時間(重裝定時器初值占

3、用 2 個機(jī)器周期)。在實際應(yīng)用中, 定時常采用中斷方式, 如進(jìn)行適當(dāng)?shù)难h(huán)可實現(xiàn)幾秒甚至更 長時間的延時。使用定時器 /計數(shù)器延時從程序的執(zhí)行效率和穩(wěn)定性兩方面考 都是最佳的方案。但應(yīng)該注意,C51編寫的中斷服務(wù)程序編譯后會自動加上 PUSH ACC PUSH PSWPOP PSV和 POP AC語句,執(zhí)行時占用了 4個機(jī)器周期;如程 序中還有計數(shù)值加 1 語句,則又會占用 1 個機(jī)器周期。 這些語句所消耗的時間在 計算定時初值時要考慮進(jìn)去,從初值 中減去以達(dá)到最小誤差的目的。2 軟件延時與時間計算在很多情況下,定時器 / 計數(shù)器經(jīng)常被用作其他用途,這時候就只能用軟件 方法延時。下面介紹幾種

4、軟件延時的方法。短暫延時10 US的延時函數(shù)可編寫如可以在C文件中通過使用帶_NOP_0語句的函數(shù)實現(xiàn),定義一系列不同的延 時函數(shù),如 Delay10us( ) 、Delay25us( ) 、Delay40us( ) 等存放在一個自定義 的C文件中,需要時在主程序中直接調(diào)用。如延時 下:void Delay10us( ) _NOP_( ); _NOP_( );_NOP_( ); _NOP_( );_NOP_( ); _NOP_( );Delay10us()函數(shù)中共用了 6個_NOP_0語句,每個語句執(zhí)行時間為1卩s。 主函數(shù)調(diào)用Delay10us()時,先執(zhí)行一個LCALL指令(2卩s),然后

5、執(zhí)行6個 _NOP_()語句(6卩s),最后執(zhí)行了一個RET指令(2卩s),所以執(zhí)行上述函 數(shù)時共需要10卩S。可以把這一函數(shù)當(dāng)作基本延時函數(shù),在其他函數(shù)中調(diào)用,即嵌套調(diào)用 4 ,以實現(xiàn)較長時間的延時; 但需要注意, 如在 Delay40us( ) 中直接調(diào)用4次Delay10us()函數(shù),得到的延時時間將是42卩s,而不是40卩s。 這是因為執(zhí)行Delay40us()時,先執(zhí)行了一次LCALL指令(2卩s),然后開始 執(zhí)行第一個 Delay10us( ) ,執(zhí)行完最后一個 Delay10us( ) 時,直接返回到主程 序。依此類推,如果是兩層嵌套調(diào)用,如在 Delay80us( ) 中兩次調(diào)

6、用 Delay40us(),則也要先執(zhí)行一次LCALL指令(2卩s),然后執(zhí)行兩次Delay40us() 函數(shù)(84卩s),所以,實際延時時間為 86卩S。簡言之,只有最內(nèi)層的函數(shù) 執(zhí)行RET指令。該指令直接返回到上級函數(shù)或主函數(shù)。如在Delay80卩s()中直接調(diào)用8次Delay10us(),此時的延時時間為82卩s。通過修改基本延時函數(shù) 和適當(dāng)?shù)慕M合調(diào)用,上述方法可以實現(xiàn)不同時間的延時。在 C51 中嵌套匯編程序段實現(xiàn)延時在C51中通過預(yù)處理指令#pragma asm和#pragma endasm可以嵌套匯編語言 語句。用戶編寫的匯編語言緊跟在 #pragma asm之后,在#pragma

7、endasm之前結(jié) 束。如: #pragma asm匯編語言程序段#pragma endasm延時函數(shù)可設(shè)置入口參數(shù),可將參數(shù)定義為 unsigned char 、 int 或 long 型。根據(jù)參數(shù)與返回值的傳遞規(guī)則, 這時參數(shù)和函數(shù)返回值位于 R7、R7R6、R7R6R5 中。在應(yīng)用時應(yīng)注意以下幾點: #pragma asm、#pragma endasm不允許嵌套使用;在程序的開頭應(yīng)加上預(yù)處理指令#pragmaasm,在該指令之前只能有注釋 或其他預(yù)處理指令;當(dāng)使用asm語句時,編譯系統(tǒng)并不輸出目標(biāo)模塊,而只輸出匯編源文件; asm只能用小寫字母,如果把a(bǔ)sm寫成大寫,編譯系統(tǒng)就把它作為普

8、通變量; #pragma asm、#pragma endasm和 asm 只能在函數(shù)內(nèi)使用。將匯編語言與C51結(jié)合起來,充分發(fā)揮各自的優(yōu)勢,無疑是單片機(jī)開發(fā)人員 的最佳選擇。使用示波器確定延時時間熟悉硬件的開發(fā)人員, 也可以利用示波器來測定延時程序執(zhí)行時間。 方法如 下:編寫一個實現(xiàn)延時的函數(shù),在該函數(shù)的開始置某個 I/O 口線如 為高電平, 在函數(shù)的最后清為低電平。 在主程序中循環(huán)調(diào)用該延時函數(shù), 通過示波器測量引 腳上的高電平時間即可確定延時函數(shù)的執(zhí)行時間。方法 如下:sbit T_poi nt = PMO;void Dly1ms(void) unsigned int i,j;while

9、(1) T_point = 1;for(i=0;i2;i+) for(j=0;j124;j+);T_point = 0;for(i=0;i1;i+) for(j=0;j124;j+);void main (void) Dly1ms();把接入示波器,運(yùn)行上面的程序,可以看到輸出的波形為周期是3ms的方波。其中,高電平為2 ms,低電平為1 ms,即for循環(huán)結(jié)構(gòu)“ for(j=0;jv124;j+) ; ”的執(zhí)行時間為1 ms。通過改變循環(huán)次數(shù),可得到不同時間的延時。當(dāng)然, 也可以不用 for 循環(huán)而用別的語句實現(xiàn)延時。這里討論的只是確定延時的方法。使用反匯編工具計算延時時間對于不熟悉示波器的

10、開發(fā)人員可用Keil C51中的反匯編工具計算延時時間,在反匯編窗口中可用源程序和匯編程序的混合代碼或匯編代碼顯示目標(biāo)應(yīng)用程 序。為了說明這種方法,還使用“ for (i=0;iDlyT;i+); ”。在程序中加入這一循環(huán)結(jié)構(gòu),首先選擇 build taget ,然后單擊 start/stop debug session 按鈕進(jìn)入程序調(diào)試窗口,最后打開 Disassembly window ,找出與這部分循環(huán)結(jié) 構(gòu)相對應(yīng)的匯編代碼,具體如下:C:0x000FE4CLRA/1TC:0x0010FEMOVR6,A/1TC:0x0011EEMOVA,R6/1TC:0x0012C3CLRC/1TC:0

11、x00139FSUBBA,DlyT /1TC:0x00145003JNCC:0019/2TC:0x00160E INCR6/1TC:0x001780F8SJMPC:0011/2T個機(jī)器周期,當(dāng)系統(tǒng)采用12 MHz時,精可以看出,0X000F0x0017 一共8條語句,分析語句可以發(fā)現(xiàn)并不是每條 語句都執(zhí)行 DIyT 次。核心循環(huán)只有 0x00110x0017 共 6條語句,總共 8 個機(jī)器 周期,第1次循環(huán)先執(zhí)行“ CLRA”和“ MOR6, A”兩條語句,需要2個機(jī)器周 期,每循環(huán) 1 次需要 8 個機(jī)器周期,但最后 1 次循環(huán)需要 5 個機(jī)器周期。 DIyT 次核心循環(huán)語句消耗 (2+DI

12、yTX 8+5) 度為 7 u S。當(dāng)采用 while (DlyT-) 循環(huán)體時, 碼如下:DlyT 的值存放在 R7 中。相對應(yīng)的匯編代C:0x000FAE07MOVR6, R7/1TC:0x00111F DECR7/1TC:0x0012EE MOVA,R6/1TC:0x001370FAJNZC:000F/2T循環(huán)語句執(zhí)行的時間為( DlyT+ 1 ) 精度為5卩S。X5個機(jī)器周期,即這種循環(huán)結(jié)構(gòu)的延時通過實驗發(fā)現(xiàn),如將 whiIe (DIyT-)改為 whiIe (-DIyT),經(jīng)過反匯編后得到如下代碼:C:0x0014DFFE DJNZR7,C:0014/2T可以看出,這時代碼只有1句,

13、共占用2個機(jī)器周期,精度達(dá)到2卩S,循 環(huán)體耗時DIyT X2個機(jī)器周期;但這時應(yīng)該注意,DIyT初始值不能為0。這 3 種循環(huán)結(jié)構(gòu)的延時與循環(huán)次數(shù)的關(guān)系如表 1 所列。表1 循環(huán)次數(shù)與延時時間關(guān)系單位:us注意:計算時間時還應(yīng)加上函數(shù)調(diào)用和函數(shù)返回各 2 個機(jī)器周期時間。使用性能分析器計算延時時間很多C程序員可能對匯編語言不太熟悉,特別是每個指令執(zhí)行的時間是很難 記憶的,因此,再給出一種使用 Keil C51的性能分析器計算延時時間的方法。 這里還以前面介紹的for (i=0;iv124;i+)結(jié)構(gòu)為例。使用這種方法時,必須先設(shè)置系統(tǒng)所用的晶振頻率,選擇 Options for target

14、中的target選項,在Xtal(MHz)中填入所用晶振的頻率。將程序編譯后,分別在_point = 1和T_point =0處設(shè)置兩個運(yùn)行斷點。選擇 start/stop debug session按鈕進(jìn)入程序調(diào)試窗口,分別打開 Performanee Analyzer window 和 Disassembly window。運(yùn)行 程序前,要首先將程序復(fù)位,計時器清零;然后按F5鍵運(yùn)行程序,從程序效率評估窗口的下部分可以看到程序到了第一個斷點,也就是所要算的程序段的開始處,用了 389卩s;再按F5鍵,程序到了第2個斷點處也就是所要算的程序 段的結(jié)束處,此時時間為1 386卩S。最后用結(jié)束處

15、的時間減去開始處時間,就 得到循環(huán)程序段所占用的時間為 997卩S。當(dāng)然也可以不用打開Performanee Analyzer window,這時觀察左邊工具欄 秒(SEC項。全速運(yùn)行時,時間不變,只有當(dāng)程序運(yùn)行到斷點處,才顯示運(yùn)行 所用的時間。3 總結(jié)本文介紹了多種實現(xiàn)并計算延時程序執(zhí)行時間的方法。使用定時器進(jìn)行延時 是最佳的選擇,可以提高 MCI工作效率,在無法使用定時器而又需要實現(xiàn)比 較 精確的延時時,后面介紹的幾種方法可以實現(xiàn)不等時間的延時: 使用自定義頭 文件的優(yōu)點是,可實現(xiàn)任意時間長短的延時,并減少主程序的代碼長度,便于對 程序的閱讀理解和維護(hù)。編寫延時程序是一項很麻煩的任務(wù),可能需要 多次修 改才能滿足要求。掌握延時程序的編寫,能夠使程序準(zhǔn)確得以執(zhí)行,這對項目開 發(fā)有著重要的意義。本文所討論的幾種方法,都是來源于實際項目的開發(fā)經(jīng) 驗, 有著很好的實用性和適應(yīng)性。精void Delay()un sig ned char a,b,e;for(a=0;a;a+)for(b=0;b;b+) for(e=0;e;e+);數(shù)據(jù)表延時時間a值b值e值11延時誤差10u11120u118030u1115+40u219050u1128060u1135+70u1142+180u1148090u1155+100u1161200u111280300u31

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論