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
在精確延時的計算當中,最容易讓人忽略的是計算迴圈外的那部分延時,在對時間要求不高的場合,這部分對程式不會造成影響.
C 的延時函式
原博文鏈結在我的官方 是 在linux下,我們這樣使用 include include int main void return 0 我們使用 include標頭檔案裡面的sleep 函式,給這個函式傳入的形參是以秒為單位的正整數。上面的程式執行的效果應該是 以一秒為單位列印hello world ...
C語言生成隨機數的函式 延時函式
下面c語言 使用了生成隨機數的函式 延時函式。請大家仔細觀察其顯示效果。從以下 我們可以得出乙個重要的結論 當上述兩類函式被放入迴圈時,應作出一定修改。同時還應關注其引數的定義位置 子函式外?子函式內?全域性變數?區域性變數?另外大家要注意 scanf在輸入double型時,應該使用 lf,而在pr...
51微控制器C語言延時函式
c程式中可使用不同型別的變數來進行延時設計。經實驗測試,使用unsigned char型別具有比unsigned int更優化的 在使用時應該使用unsigned char作為延時變數。以某晶振為12mhz的微控制器為例,晶振為12mhz即乙個機器週期為1us。一.500ms延時子程式 程式 voi...