18luck网站

18luck网站電子設計 | 18luck网站Rss 2.0 會員中心 會員注冊
搜索: 您現在的位置: 18luck网站 >> 18luck平台 >> 單片機 >> 正文

用單片機C語言精確延時(定時)的方法

作者:佚名    文章來源:本站原創    點擊數:    更新時間:2017-5-20

  最近在忙著單片機的項目,偶爾停下來小結了一下最近的收獲,還是有不少可貴的收益的。

  本人在閑暇的時候對單片機C語言下的各類延時程序做了下總結。由於(yu) 單片機C語言下利用軟件延時不容易做到精確的定時,所以很多人在編寫(xie) 延時子程序的時候不能好好的把握延時的具體(ti) 時間。C語言下,延時程序主要有以下幾種:

一:

void delay(unsigned char k)
{

 unsigned char i,k;  //定義(yi) 變量
 for(i=0;i<k;i++);      //for循環語句

}

該程序在Keil環境下,會(hui) 先將C語言轉化成匯編語言,那麽(me) 我們(men) 就可以根據匯編語言來計算出精確的時間,轉化具體(ti) 步驟如下:

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

這裏,指令1,指令2和指令3各消耗1個(ge) 機器周期,指令4消耗兩(liang) 個(ge) 機器周期(可查此表得知:https://www.51hei.com/mcuteach/1312.html),而在12M的晶振下一個(ge) 機器周期是1us,在這個(ge) 過程中,指令1和指令2分別執行1次,即消耗1+1us,而指令3和指令4分別執行了k次,那麽(me) 這樣加起來,這個(ge) 延時子程序所消耗的具體(ti) 時間就是t=1+1+(1+2)*k=3k+2us。

嗬嗬,這樣說來,如果我們(men) 定義(yi) 的k為(wei) 100的話,這個(ge) 延時子程序的精確時間就是302us。  

二:

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

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

該語句消耗2us,一共執行i次,所以總共消耗時間t=i*2us。

三:

下麵的將形參換為(wei) 整形int,這樣的話,反匯編所執行的語句完全不同,用個(ge) 具體(ti) 的數字做例子:

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

具體(ti) 計算如下

1.R7經過10H(16)次循環減為(wei) 0:
t1=10H*(1+1+2+1+1+2)
2.R6經過27H*256次循環減為(wei) 0:
t2=27H*256*(1+1+2+1+1+2)+27H*1
3.最後R7的是變為(wei) 255,因此還要多出255次的循環:
t3=255*(1+1+2+1+1+2)
4.加上之前消耗的2us,總消耗時間:
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
大約為(wei) 72ms吧
如果定義(yi) 一個(ge) unsigned int i,那麽(me) 延時計算公式為(wei) T=2+(i%256)*7+(i/256)*256*7+i/256+255*7

關(guan) 於(yu) 其他類型的延時程序都可以按照這個(ge) 方法對時間進行較為(wei) 精確的計算。

如果你懶得計算我還給大家推薦一個(ge) 簡單的方法:就是用keil的軟件仿真功能來仿真出C語句執行的時間,具體(ti) 方法可以看這裏:/Article/danpianji/1956.html

昨天熬夜整理的,從(cong) 這個(ge) 程序中可以看出單片機C語言和匯編語言的一些區別,希望對大家有幫助!

Tags:單片機C語言精確延時,單片機,延時  
責任編輯:admin
請文明參與討論,禁止漫罵攻擊,不要惡意評論、違禁詞語。 昵稱:
1分 2分 3分 4分 5分

還可以輸入 200 個字
[ 查看全部 ] 網友評論
關於我們 - 聯係我們 - 廣告服務 - 友情鏈接 - 網站地圖 - 版權聲明 - 在線幫助 - 文章列表
返回頂部
刷新頁麵
下到頁底
晶體管查詢