for迴圈實現C語言精確延時

2021-06-16 23:11:51 字數 3201 閱讀 6369

for迴圈實現c語言精確延時

(晶振12mhz,乙個機器週期1us.)

一. 500ms延時子程式

程式:

void delay500ms(void)

產生的彙編:

c:0x0800     7f0f      mov       r7,#0x0f

c:0x0802     7eca      mov       r6,#0xca

c:0x0804     7d51      mov       r5,#0x51

c:0x0806     ddfe      djnz      r5,c:0806

c:0x0808     defa      djnz      r6,c:0804

c:0x080a     dff6      djnz      r7,c:0802

c:0x080c     22        ret      

計算分析:

程式共有三層迴圈

一層迴圈n:r5*2 = 81*2 = 162us                   djnz   2us

二層迴圈m:r6*(n+3) = 202*165 = 33330us          djnz   2us + r5賦值 1us = 3us

三層迴圈: r7*(m+3) = 15*33333 = 499995us        djnz   2us + r6賦值 1us = 3us

迴圈外:    5us             子程式呼叫 2us + 子程式返回 2us + r7賦值 1us = 5us

延時總時間 = 三層迴圈 + 迴圈外 = 499995+5 = 500000us =500ms

計算公式:延時時間=[(2*r5+3)*r6+3]*r7+5

二. 200ms延時子程式

程式:void delay200ms(void)

產生的彙編

c:0x0800     7f05      mov       r7,#0x05

c:0x0802     7e84      mov       r6,#0x84

c:0x0804     7d96      mov       r5,#0x96

c:0x0806     ddfe      djnz      r5,c:0806

c:0x0808     defa      djnz      r6,c:0804

c:0x080a     dff6      djnz      r7,c:0802

c:0x080c     22        ret

三. 10ms延時子程式

程式:void delay10ms(void)

產生的彙編

c:0x0800     7f05      mov       r7,#0x05

c:0x0802     7e04      mov       r6,#0x04

c:0x0804     7df8      mov       r5,#0xf8

c:0x0806     ddfe      djnz      r5,c:0806

c:0x0808     defa      djnz      r6,c:0804

c:0x080a     dff6      djnz      r7,c:0802

c:0x080c     22        ret      

四. 1s延時子程式

程式:void delay1s(void)

產生的彙編

c:0x0800     7f05      mov       r7,#0x05

c:0x0802     7e04      mov       r6,#0x04

c:0x0804     7d74      mov       r5,#0x74

c:0x0806     7cd6      mov       r4,#0xd6

c:0x0808     dcfe      djnz      r4,c:0808

c:0x080a     ddfa      djnz      r5,c:0806

c:0x080c     def6      djnz      r6,c:0804

c:0x080e     dff2      djnz      r7,c:0802

c:0x0810     22        ret

在精確延時的計算當中,最容易讓人忽略的是計算迴圈外的那部分延時,在對時間要求不高的場合,這部分對程式不會造成影響.

時鐘週期

時鐘週期也稱為振盪週期,定義為時鐘脈衝的倒數(可以這樣來理解,時鐘週期就是微控制器外接晶振的倒數,例如12m的晶振,它的時間週期就是1/12 us),是計算機中最基本的、最小的時間單位。

在乙個時鐘週期內,cpu僅完成乙個最基本的動作。對於某種微控制器,若採用了1mhz的時鐘頻率,則時鐘週期為1us;若採用4mhz的時鐘頻率,則時鐘週期為250us。由於時鐘脈衝是計算機的基本工作脈衝,它控制著計算機的工作節奏(使計算機的每一步都統一到它的步調上來)。顯然,對同一種機型的計算機,時鐘頻率越高,計算機的工作速度就越快。但是,由於不同的計算機硬體電路和器件的不完全相同,所以其所需要的時鐘周頻率範圍也不一定相同。我們學習的8051微控制器的時鐘範圍是1.2mhz-12mhz。

在8051微控制器中把乙個時鐘週期定義為乙個節拍(用p表示),二個節拍定義為乙個狀態週期(用s表示)。

機器週期

在計算機中,為了便於管理,常把一條指令的執行過程劃分為若干個階段,每一階段完成一項工作。例如,取指令、儲存器讀、儲存器寫等,這每一項工作稱為乙個基本操作。完成乙個基本操作所需要的時間稱為機器週期。一般情況下,乙個機器週期由若干個s週期(狀態週期)組成。8051系列微控制器的乙個機器週期同6個s週期(狀態週期)組成。前面已說過乙個時鐘週期定義為乙個節拍(用p表示),二個節拍定義為乙個狀態週期(用s表示),8051微控制器的機器週期由6個狀態週期組成,也就是說乙個機器週期=6個狀態週期=12個時鐘週期。

指令週期

指令週期是執行一條指令所需要的時間,一般由若干個機器週期組成。指令不同,所需的機器週期數也不同。對於一些簡單的的單位元組指令,在取指令週期中,指令取出到指令暫存器後,立即解碼執行,不再需要其它的機器週期。對於一些比較複雜的指令,例如轉移指令、乘法指令,則需要兩個或者兩個以上的機器週期。

通常含乙個機器週期的指令稱為單週期指令,包含兩個機器週期的指令稱為雙週期指令。答:1.時鐘週期為晶振頻率的倒數:1/12微秒;

2.機器週期為12個時鐘週期:1微秒;

精確延時的實現

大家平時寫練習程式,包括 上的範例程式,很多延時都直接用的 sleep 實現。這個延時有個缺點,那就是無法統計 執行的時間。請看下圖 由圖可以看到,使用 api 函式 sleep 的問題,就是會忽略掉程式的執行時間。很多時候,程式的執行時間是不固定的,所以這就導致使用 sleep 的延時並不精確,即...

MATLAB中如何用迴圈實現精確延時

前面在用matlab控制硬體的時候,在每次採集的過程中需要等一段固定的時間再採集訊號。所以這裡就會需要用到延時函式來精確延時,首先想到的就是函式pause time 但執行時發現錯誤,後來弄清楚了,pause的作用是暫停,而不是延時。在執行pause時,程式各個系統都暫停了,也要把我的採集硬體部分暫...

利用for迴圈實現程式的延時

程式中延時的方法很多,如直接呼叫sleep函式 也可用for迴圈來實現乙個延時,例如 int m 0 for int x 0 x 20000 x 也可用下面這個函式 功能 帶windows訊息處理的毫秒界別延時 引數 ms 延遲時間 單位 毫秒 bool ctools delaymsmessage ...