c語言循環延時
在單片機中,要延時程序盡量准確,可以:
-延時循環盡量簡單,盡量少開變數比如:
Delay(unsigned int uDelay) { while ( uDelay-- ); }
-在主程序中用一個GPIO測試,如:
SetGPIOHigh(); Delay(1000); SetGPIOLOW();
-用示波器測量該GPIO波形及頻率
-調整Delay函數的調用值,可以用變數,在調試時實時修改變數值,找到延時1毫秒的值,把Delay函數改名為Delay1ms,之後調用這個函數完成精確延時
-其他的延時函數也可以類似上述方法完成,但記住在調試和實際使用時要用同樣的CPU主頻。
-最精確的還是用定時器中斷程序計時
⑵ 用C語言編寫一段循環100次的延時程序。
#include<stdio.h>
intmain()
{
inti;
for(i=0;i<100;i++);
return0;
}
哈你想多了把
額,你如果是說sleep那種形式的延時,可以在頭上加#include <windows.h>
然後
#include<stdio.h>
#include<windows.h>
intmain()
{
inti,a=(1000);
for(i=0;i<100;i++)
{
sleep(a);
}
return0;
}
想看一下延時效果的話,可以這樣:
#include<stdio.h>
#include<windows.h>
intmain()
{
inti,a=(1000);
for(i=0;i<100;i++)
{
sleep(a);
printf("%d ",i);
}
return0;
}
⑶ C語言for循環作延時程序用的問題…
我只記得在C語言里,有一個計時功能,大體思路如下: 在執行For循環之前,調用GetSystemTime一個類似的函數獲取當前系統時間,在執行For語句後,再次得到,利用兩個時間差計算for的執行時間。 還有一個就是調用Sleep函數可以使程序延遲執行,參數是毫秒。
採納哦
⑷ C語言如何跳出「延時循環」
你增加一個keyscan1();或修改下
在執行延時程序時增加掃描鍵盤的步驟,判斷要不要終止延時;試試
void delayms(uint x)
{
uint a,b;
for(a=x;a>0;a--)
for(b=110;b>0;b--)
keyscan1();
}
⑸ 關於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語言延時1ms程序的循環次數如何算
#include<time.h>
#include<stdio.h>
void
main()
{
clock_t
start,finish;
double
rtion=0;
printf("計時開始\n");
start=clock();
while(1-rtion>0.00001)
{
finish=clock();
rtion=(double)(finish-start);
}
printf("1ms計時完畢\n");
}
原理:兩個時間差值是1ms就立即跳出while循環,c語言中時間分度值是ms
⑺ C語言for循環嵌套延時問題
這說明是你的延時時間不足,造成的錯誤。
這個延時函數是個指令延時,指令多了,延時時間就長。
for(x=0;x<120;x++) 這個循環里,每一次循環,都會有一個 加一 和 判斷跳轉指令。
X為char 時是單位元組,這些指令都是一條指令,當改為 int時 x就成了雙位元組了,這些操作就需要多幾條指令來完成。這就相當於,每次循環的時間加長了。
⑻ 單片機C語言中,怎麼通過循環次數計算延遲函數的延遲時間
首先你要知道一個指令周期是幾秒
演算法是1/(晶振頻率除以12)
然後你要知道循環究竟執行了幾個指令周期
你可以用keil里在線反匯編命令看看你的循環編譯成機器語言後到底是幾個指令周期
這樣就知道了延遲時間
當然你取近似值也可以的
比如
for(i=0,i<255,i++){x=2}
這里x=2是一個指令周期
而執行了255次
假如你的晶振是12MHZ的
則你執行一個指令周期是1us
255次是0.255ms
⑼ 關於單片機的延時,c語言中for循環是怎麼計算的
C語言中的for語句一般的表達形式如下圖所示:
說明:表達式1為初值表達式,表達式2為循環條件表達式,表達式3為循環變數控製表達式。
⑽ c語言循環延時的問題
有區別的,很多延時函數都可以通過nop來實現。多循環幾次nop就可以感覺到區別了