c語言for延時
Ⅰ 關於c語言for循環延時函數
for循環實現C語言精確延時
(晶振12MHz,一個機器周期1us.)
一. 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
在精確延時的計算當中,最容易讓人忽略的是計算循環外的那部分延時,在對時間要求不高的場合,這部分對程序不會造成影響.
Ⅱ 關於單片機的延時,c語言中for循環是怎麼計算的
C語言中的for語句一般的表達形式如下圖所示:
說明:表達式1為初值表達式,表達式2為循環條件表達式,表達式3為循環變數控製表達式。
Ⅲ C語言for延時計算方法
根據12m只能算出個大概的,不準確。用這個大概的到真機調試就行了。
具體演算法是一個空的for循環占幾個時鍾周期,然後乘以所有循環數,再根據自己的單片機頻率算出來就行了。頻率應該是那個晶振除以12吧,具體看型號。
Ⅳ 在c語言中如何實現延時功能
先加個 #include<windows.h>
然後延遲一秒就是 Sleep(1000); 就行了
1000代表1000毫秒 也就是一秒
#include<iostream.h>
#include<windows.h>
void main()
{
for(int i=0;i<50;++i)
cout<<"#";
cout<<endl;
Sleep(1000);
for(i=0;i<50;++i)
cout<<"#";
cout<<endl;
}
Ⅳ C語言for循環作延時程序用的問題…
我只記得在C語言里,有一個計時功能,大體思路如下: 在執行For循環之前,調用GetSystemTime一個類似的函數獲取當前系統時間,在執行For語句後,再次得到,利用兩個時間差計算for的執行時間。 還有一個就是調用Sleep函數可以使程序延遲執行,參數是毫秒。
採納哦
Ⅵ C語言for循環嵌套延時問題
這說明是你的延時時間不足,造成的錯誤。
這個延時函數是個指令延時,指令多了,延時時間就長。
for(x=0;x<120;x++) 這個循環里,每一次循環,都會有一個 加一 和 判斷跳轉指令。
X為char 時是單位元組,這些指令都是一條指令,當改為 int時 x就成了雙位元組了,這些操作就需要多幾條指令來完成。這就相當於,每次循環的時間加長了。
Ⅶ 51單片機C語言for循環延時程序時間計算
不可能的,是不是你的編譯有錯的啊
我改的晶振12M,在KEIL4.0裡面編譯的,為你得出的結果最大也就是40ms,這是軟體的原因,
不可能出現100ms那麼大的差距,是你的軟體的原因。
不信你實際編寫一個秒鍾,利用原理計算編寫一個燒進單片機和利用軟體測試的秒程序燒進單片機,你會發現原理計算的程序是正確的
Ⅷ c語言的延遲函數 編寫
C語言的延遲函數一般是利用無意義程序運行來控制時間從而達到延時的目的
舉個例子:
for(i=0;i<x;i++)
for(j=0;j<120;j++);
這是延時x毫秒的for循環語句。
值得注意的是記得最後的;一定得記得寫。
Ⅸ C語言for結構延時程序
voiddelay(uintxms)
{
uintx,y;
for(x=xms;x>0;x--)
for(y=110;y>0,y--)//改為for(y=110;y>0;y--);在y>0後面是;而不是,.另外,還要在後面再加個;,表示有受控語句,只不過是空.否則不符合語法
}