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 ...