日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

用单片机C语言精确延时(定时)的方法

發布時間:2023/12/10 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 用单片机C语言精确延时(定时)的方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

作者:51hei???來源:原創???點擊數:…??更新時間:2009年09月29日?? 【字體:大?中?小】

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

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

一:

void delay(unsigned char k)
{

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

}

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

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

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

呵呵,這樣說來,如果我們定義的k為100的話,這個延時子程序的精確時間就是302us。  

二:

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

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

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

三:

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

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

具體計算如下

1.R7經過10H(16)次循環減為0:
t1=10H*(1+1+2+1+1+2)
2.R6經過27H*256次循環減為0:
t2=27H*256*(1+1+2+1+1+2)+27H*1
3.最后R7的是變為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
大約為72ms吧
如果定義一個unsigned int i,那么延時計算公式為T=2+(i%256)*7+(i/256)*256*7+i/256+255*7

關于其他類型的延時程序都可以按照這個方法對時間進行較為精確的計算。

如果你懶得計算我還給大家推薦一個簡單的方法:就是用keil的軟件仿真功能來仿真出C語句執行的時間,具體方法可以看這里:http://www.51hei.com/bbs/dpj-4711-1.html

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

總結

以上是生活随笔為你收集整理的用单片机C语言精确延时(定时)的方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。