c語言延時函式的理解

2021-08-20 04:39:23 字數 2238 閱讀 4817

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