c語言延遲時間
1. 標准C如何延時
假設一個延時函數如下:
void delay()
{
uint i;
for(i=0;i<20000;i++);
}
我們怎麼來算呢,先將20000轉成16進制,得到4E20,然後將高位元組4E乘以6得到468D,再將468+2=470,然後將470D*20HEX(即32D)=15040;所心這個延時函數總共要執行15040個周期,假設所用的晶振為12MHZ,則該段函數總延時:15.04ms。
有了這個公式我們如果想要設定指定的延時長度就可以用它的己知公式確定。即:總時間=[(6*i值的高8位)+2]*i的低8位。
例如:設要延時125ms。
我們將低位元組先賦值200D*(即:C8),然後再算高低節的定值,由式中可知125ms=200*((i值的高位元組*6)+2),又可推算出(高低節*6)+2的總延遲時間應等於625us,將625/6=104.1666,取整數得到104,將104轉成16進製得到68H,再將高位元組和低位元組組合起來即得到了定值,即:68C8HEX,代入函數即如下:
void delay()
{
uint i;
for(i=0;i<0x68C8;i++);
}
如果寫直進行就要將68C8轉成10進制,即:26824,代入後得到:
void delay()
{
uint i;
for(i=0;i<0x26824;i++);
在c語言中嵌入一段匯編的延時程序呀,你自己看看書,很簡單的
用在單片機里的可以C和匯編混合使用,因為用匯編編寫延時要准確些,所以你不妨寫一個匯編程序,然後再調用它好了,要用C來編精確的延時確實是比較難的哦.呵呵
誰說C語言不能精確延時,用51單片機的定時/計數器一或者用定時/計數器2的工作方式2,自動再裝入8位計數器,就可以精確延時,別說1MS了就是100um也能精確做到。
其實很簡單,採用定時器,將需要定時時間算好後寫入單片機中斷程序中即可,這種方法可以實現精確定時,最終的誤差僅由晶振來確定了。
不錯,用定時器最准確。但是定時器數量有限,有時候不見得能夠用。比如溫度檢測(尤其是變化比較大、快的),一個定時器就得一直不停檢測。這個時候如果另外一個定時器有正好分配的其他任務,就只有用其他方法延時了。
空循環就行了
如while(i--);根據i的不同決定了延時長短
不過C的延時不是非常准確,你得根據反匯編,看匯編語句的數量和指令周期來計算時間
也可以是
void mDelay(unsigned int Delay) //Delay = 1000 時間為1S
{
unsigned int i;
for(;Delay>0;Delay--)
{
for(i=0;i<124;i++)
{;}
}
}
2. 用C語言編程如何計算延時時間
那樣子你的調用系統的API來獲得調用此函數之前的系統時間,還有調用此函數返回之後的系統時間進行比較。
#include <windows.h>
#include <stdio.h>
voidmain()
{
SYSTEMTIME sys;
GetLocalTime( &sys );
int start=sys.wMilliseconds;//獲取開始時的毫秒數
//下面調用你的函數
delay(uint型變數);//這裡面的參數你必須自己看著辦
GetLocalTime( &sys );
int end=sys.wMilliseconds;//獲取調用delay函數之後的秒數
printf("調用delay函數消耗了%d毫秒!\n",end-start);
printf("注意:此程序只能處理1秒以內的延遲毫秒數!");
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=125;y>0;y--);
}
3. C語言延遲時間,我的是12M晶振,這個程序的延遲時間到底是多少
12M就是每秒
12000000HZ
也就是說
循環12次的話是1微秒,循環12000次的話是1毫秒。
所以你的這個循環執行了
ms
*
10微秒
如果你要延遲1毫秒,那麼ms就應該是100
4. C語言延時函數
C語言的延遲函數一般是利用無意義程序運行來控制時間從而達到延時的目的
舉個例子:
for(i=0;i<x;i++)
for(j=0;j<120;j++);
這是延時x毫秒的for循環語句。
值得注意的是記得最後的;一定得記得寫。
5. 請問下面的C語言延時函數是如何計算延時時間的for循環中的四個nop是否可以省略
一個nop為1個指令周期,通過nop指令可以產生一定的延遲,但是對於快速的CPU來說效果不明顯,因此可以多寫幾個,便可以多延遲幾個時鍾(具體應該說是一個指令佔用了3個時鍾脈沖);所以,一個for循環會執行4*250個指令周期,那麼總共延時4*250*ms個指令周期~~
6. 在C語言程序中,延時函數的時間是怎麼算的
這個是和你機器的運算速度有關的
你要計算出這個函數用了多少時間就要用時間函數,我很久沒用了。
#include "stdlib.h"
void delay()
{
time_t start,end;
start=time(null);
unchar i;
while(z--)
{
for(i=0;i<121;i++);
}
end=time(null);
printf("%f",difftime(end,start));
}
//time_t是在頭文件中定義的,可能是個結構體類型裡面的成員定義了一些時間的單位,如年、月、日。在這里調用這個結構體定義2個變數;
//start=time(null);
將其中一個變數賦值。它的值等於當前的系統時間
//end=time(null);
在程序結束的時候再給另一個變數賦值,值等於當前的系統時間。
//difftime(end,start)
函數difftime();是double類型,用來計算運行的時間,用第一個參數的時間減去第二個參數的時間,得到的值就是運行用了多少時間。單位為秒
7. 單片機C語言如何讓一個數組內的元素延遲時間
這個很簡單,用軟體延時和定時器中斷延時都可以,具體說就是在數組循環送顯環節中加入延時程序就OK。
8. C語言中控制時間延遲的函數是什麼 用法是什麼 舉個
sleep函數,在windows中是以毫秒為單位延遲,如Sleep(1000)就是延遲1000ms,也就是1秒。
9. 單片機C語言中while的延時時間
用KEIL軟體可以計算時間,將while的起始位置和終止位置加紅點(雙擊即可);
然後左側的SEC後面的就是執行的時間。
再給你幾個延時程序做參考:
軟體延時:(asm)
晶振12MHZ,延時1秒
程序如下:
DELAY:MOV72H,#100
LOOP3:MOV71H,#100
LOOP1:MOV70H,#47
LOOP0:DJNZ70H,LOOP0
NOP
DJNZ71H,LOOP1
MOV70H,#46
LOOP2:DJNZ70H,LOOP2
NOP
DJNZ72H,LOOP3
MOV70H,#48
LOOP4:DJNZ70H,LOOP4
定時器延時:
晶振12MHZ,延時1s,定時器0工作方式為方式1
DELAY1:MOVR7,#0AH;;晶振12MHZ,延時0.5秒
AJMPDELAY
DELAY2:MOVR7,#14H;;晶振12MHZ,延時1秒
DELAY:CLREX0
MOVTMOD,#01H;設置定時器的工作方式為方式1
MOVTL0,#0B0H;給定時器設置計數初始值
MOVTH0,#3CH
SETBTR0;開啟定時器
HERE:JBCTF0,NEXT1
SJMPHERE
NEXT1:MOVTL0,#0B0H
MOVTH0,#3CH
DJNZR7,HERE
CLRTR0;定時器要軟體清零
SETBEX0
RET
C語言延時程序:
10ms延時子程序(12MHZ)
voiddelay10ms(void)
{
unsignedchari,j,k;
for(i=5;i>0;i--)
for(j=4;j>0;j--)
for(k=248;k>0;k--);
}
1s延時子程序(12MHZ)
voiddelay1s(void)
{
unsignedcharh,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--);
}
200ms延時子程序(12MHZ)
voiddelay200ms(void)
{
unsignedchari,j,k;
for(i=5;i>0;i--)
for(j=132;j>0;j--)
for(k=150;k>0;k--);
}
500ms延時子程序程序:(12MHZ)
voiddelay500ms(void)
{
unsignedchari,j,k;
for(i=15;i>0;i--)
for(j=202;j>0;j--)
for(k=81;k>0;k--);
}
不過實際得到的延時會存在差異,所以最好用實驗的方法調整延時參數。
10. 在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;
}