C在KEIL編譯中能精確定時的幾個延時程式

2022-09-04 05:21:11 字數 3080 閱讀 1461

本文出處:

一. 500ms延時子程式

程式:void delay500ms(void)

unsigned char i,j,k;

for(i=15;i>0;i--)

for(j=202;j>0;j--)

for(k=81;k>0;k--);

產生的彙編:

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)

unsigned char i,j,k;

for(i=5;i>0;i--)

for(j=132;j>0;j--)

for(k=150;k>0;k--);

產生的彙編

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)

unsigned char i,j,k;

for(i=5;i>0;i--)

for(j=4;j>0;j--)

for(k=248;k>0;k--);

產生的彙編

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)

unsigned char h,i,j,k;

for(h=5;h>0;h--)

for(i=4;i>0;i--)

for(j=116;j>0;j--)

for(k=214;k>0;k--);

產生的彙編

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秒=1000毫秒(ms)

1毫秒=1/1,000秒(s)

1秒=1,000,000 微秒(μs)

1微秒=1/1,000,000秒(s)

1秒=1,000,000,000 納秒(ns)

1納秒=1/1,000,000,000秒(s)

1秒=1,000,000,000,000 皮秒(ps)

1皮秒=1/1,000,000,000,000秒(s)

60秒 = 1分鐘

60分鐘 = 1小時

24小時 = 1天

7天 = 1星期

365.25天 = 1年

100年 = 1世紀

1平太陽日 = 24小時3分56.555秒

1恆星日 = 23小時56分4.091秒

1太陽年(回歸年) = 365.2422天

(= 365天5小時48分46秒)

1恆星年 = 365.2564天

(= 365天6小時9分9.5秒)

1朔望月 = 29.5306天

1恆星月 = 27.3712天

1太陽年 = 12個朔望日 = 354.36天

VC中基於 Windows 的精確定時

vc中基於 windows 的精確定時中國科學院光電技術研究所 遊志宇 coledatetime start time coledatetime getcurrenttime coledatetimespan end time coledatetime getcurrenttime start ti...

在keil中編譯ucos時要注意的問題

程式編譯好後 program size data 112.0 xdata 164 code 3930 也就是說只要51有 126位元組的片內ram data 256位元組的外部ram xdata 4k以上的flash就可以執行了 還有個問題要注意的 51系列的微控制器片內ram最多只有256位元組,...

C 萬能庫標頭檔案在vs中的安裝

c 萬能庫標頭檔案在vs2019中的安裝 1 c 萬能庫的定義 簡而言之,就是一條語句代替了多條語句,包含了目前c 所包含的所有標頭檔案 2 c 萬能庫的寫法 include 如下是bits stdc h所包含的c 所有庫函式標頭檔案 ifndef glibcxx no assert include...