機(jī)電之家資源網(wǎng)
單片機(jī)首頁(yè)|單片機(jī)基礎(chǔ)|單片機(jī)應(yīng)用|單片機(jī)開(kāi)發(fā)|單片機(jī)文案|軟件資料下載|音響制作|電路圖下載 |嵌入式開(kāi)發(fā)
培訓(xùn)信息
贊助商
用單片機(jī)C語(yǔ)言精確延時(shí)(定時(shí))的方法
用單片機(jī)C語(yǔ)言精確延時(shí)(定時(shí))的方法
 更新時(shí)間:2009-10-27 14:55:53  點(diǎn)擊數(shù):0
【字體: 字體顏色
本人在閑暇的時(shí)候?qū)纹瑱C(jī)C語(yǔ)言下的各類(lèi)延時(shí)程序做了下總結(jié)。由于單片機(jī)C語(yǔ)言下利用軟件延時(shí)不容易做到精確的定時(shí),所以很多人在編寫(xiě)延時(shí)子程序的時(shí)候不能好好的把握延時(shí)的具體時(shí)間。C語(yǔ)言下,延時(shí)程序主要有以下幾種:

一:

void delay(unsigned char k)
{

 unsigned char i,k;
 for(i=0;i<k;i++);

}

該程序在Keil環(huán)境下,會(huì)先將C語(yǔ)言轉(zhuǎn)化成匯編語(yǔ)言,那么我們就可以根據(jù)匯編語(yǔ)言來(lái)計(jì)算出精確的時(shí)間,轉(zhuǎn)化具體步驟如下:

 CLR A  ;指令1
 MOV R7,A。恢噶2  
LOOP:
   INC R7 ;指令3
   CJNE  R7,k,LOOP    ;指令4

這里,指令1,指令2和指令3各消耗1個(gè)機(jī)器周期,指令4消耗兩個(gè)機(jī)器周期,而一個(gè)機(jī)器周期是1us,在這個(gè)過(guò)程中,指令1和指令2分別執(zhí)行1次,即消耗1+1us,而指令3和指令4分別執(zhí)行了k次,那么這樣加起來(lái),這個(gè)延時(shí)子程序所消耗的具體時(shí)間就是t=1+1+(1+2)*k=3k+2us。

呵呵,這樣說(shuō)來(lái),如果我們定義的k為100的話,這個(gè)延時(shí)子程序的精確時(shí)間就是302us。  

二:

void delay(unsigned char i)
{
while(--i)
{;}
} 

同樣的道理,將其反匯編,可以看到,只有一條語(yǔ)句:DJNZ  i,$;

該語(yǔ)句消耗2us,一共執(zhí)行i次,所以總共消耗時(shí)間t=i*2us。

三:

下面的將形參換為整形int,這樣的話,反匯編所執(zhí)行的語(yǔ)句完全不同,用個(gè)具體的數(shù)字做例子:

void delay()
{
 unsigned int i=10000;
 while(--i)
;
}

反匯編后:

     4:         unsigned int i=10000;

C:0x0003    7F10     MOV      R7,#0x10
C:0x0005    7E27     MOV      R6,#0x27

     5:         while(--i)
     6: ;
C:0x0007    EF       MOV      A,R7
C:0x0008    1F       DEC      R7
C:0x0009    7001     JNZ      C:000C
C:0x000B    1E       DEC      R6
C:0x000C    14       DEC      A
C:0x000D    4E       ORL      A,R6
C:0x000E    70F7     JNZ      C:0007

具體計(jì)算如下

1.R7經(jīng)過(guò)10H(16)次循環(huán)減為0:
t1=10H*(1+1+2+1+1+2)
2.R6經(jīng)過(guò)27H*256次循環(huán)減為0:
t2=27H*256*(1+1+2+1+1+2)+27H*1
3.最后R7的是變?yōu)?55,因此還要多出255次的循環(huán):
t3=255*(1+1+2+1+1+2)
4.加上之前消耗的2us,總消耗時(shí)間:
T=2+10H*(1+1+2+1+1+2)+27H*256*(1+1+2+1+1+2)+27H*1+255*(1+1+2+1+1+2)
=2+16*7+39*256*7+39*1+255*7
=71826us
大約為72ms吧
如果定義一個(gè)unsigned int i,那么延時(shí)計(jì)算公式為T(mén)=2+(i%256)*7+(i/256)*256*7+i/256+255*7

關(guān)于其他類(lèi)型的延時(shí)程序都可以按照這個(gè)方法對(duì)時(shí)間進(jìn)行較為精確的計(jì)算。

昨天熬夜整理的,從這個(gè)程序中可以看出單片機(jī)C語(yǔ)言和匯編語(yǔ)言的一些區(qū)別,希望對(duì)大家有幫助!

  • 上一篇: 單片機(jī)系統(tǒng)軟件抗干擾方法
  • 下一篇: 沒(méi)有了
  • 發(fā)表評(píng)論   告訴好友   打印此文  收藏此頁(yè)  關(guān)閉窗口  返回頂部
    熱點(diǎn)文章
     
    推薦文章
     
    相關(guān)文章
    網(wǎng)友評(píng)論:(只顯示最新5條。)
    關(guān)于我們 | 聯(lián)系我們 | 廣告合作 | 付款方式 | 使用幫助 | 機(jī)電之家 | 會(huì)員助手 | 免費(fèi)鏈接

    點(diǎn)擊這里給我發(fā)消息66821730(技術(shù)支持)點(diǎn)擊這里給我發(fā)消息66821730(廣告投放) 點(diǎn)擊這里給我發(fā)消息41031197(編輯) 點(diǎn)擊這里給我發(fā)消息58733127(審核)
    本站提供的機(jī)電設(shè)備,機(jī)電供求等信息由機(jī)電企業(yè)自行提供,該企業(yè)負(fù)責(zé)信息內(nèi)容的真實(shí)性、準(zhǔn)確性和合法性。
    機(jī)電之家對(duì)此不承擔(dān)任何保證責(zé)任,有侵犯您利益的地方請(qǐng)聯(lián)系機(jī)電之家,機(jī)電之家將及時(shí)作出處理。
    Copyright 2007 機(jī)電之家 Inc All Rights Reserved.機(jī)電之家-由機(jī)電一體化網(wǎng)更名-聲明
    電話:0571-87774297 傳真:0571-87774298
    杭州濱興科技有限公司提供技術(shù)支持

    主辦:杭州市高新區(qū)(濱江)機(jī)電一體化學(xué)會(huì)
    中國(guó)行業(yè)電子商務(wù)100強(qiáng)網(wǎng)站

    網(wǎng)站經(jīng)營(yíng)許可證:浙B2-20080178-1