延遲編程
㈠ C語言延時程序編程
在單片機中,要延時程序盡量准確,可以:
-延時循環盡量簡單,盡量少開變數比如:
Delay(unsigned int uDelay) { while ( uDelay-- ); }
-在主程序中用一個GPIO測試,如:
SetGPIOHigh(); Delay(1000); SetGPIOLOW();
-用示波器測量該GPIO波形及頻率
-調整Delay函數的調用值,可以用變數,在調試時實時修改變數值,找到延時1毫秒的值,把Delay函數改名為Delay1ms,之後調用這個函數完成精確延時
-其他的延時函數也可以類似上述方法完成,但記住在調試和實際使用時要用同樣的CPU主頻。
-最精確的還是用定時器中斷程序計時
㈡ 請問在單片機C語言編程中,用delay延遲的話,1秒程序是什麼單片機晶振為12MHZ
在Keil里模擬的話,在配置里把晶振調成12MHz,然後在調用delay函數的地方設置一個斷點,開始調試程序,運行到斷點處,注意程序左邊有一個記錄當前寄存器和一些狀態的窗口,其中,裡面有一個是專門記錄當前運行了多少時間的變數,記下當前時間T1,然後按F10(不進入子函數)調試,再記錄當前時間T2,則延時=T2-T1。多試幾個A,差不多調到1s就夠了。我一般都這么調。
你要想明白其中原理,想自己算的話,你就看看delay的匯編代碼段自己算吧。
㈢ 延時怎麼編程
C語言嗎,delay(時間)
sleep(時間)
㈣ plc延時10秒鍾編程
你可能用PLC的時鍾脈沖來實現,如可以用M8014分鍾這個時鍾繼電器。梯形圖如下:
LD M8014
OUT C0 K59 累計後是1小時
LD C0
OUT C1 K24 累計後就是24小時了,
RST C0 復位C0以便讓它重新計數
你如果要重使用時用程序讓它們復位。
㈤ 51單片機延時編程
延時流水燈吧。
ORG0000H
LJMPMAIN
ORG0030H
MAIN:
MOVA,#0FEH
MOVR2,#8
LOOP:
MOVP0,A
LCALLDELAY
RLA
DJNZR2,OOP
SJMPMAIN
DELAY:
MOVR3,#200
DLY:
MOVR4,#250
DJNZR4,$
DJNZR3,DLY
RET
END
㈥ C語言編程中的延時
如果你指的是嵌入式方面的,這樣的延遲是有作用的,也是一種非精確計時器的一個實現方法。
我以12M的晶振為例,給你講一下:
12M的晶振的機器周期是1/12M*12,就是1us
不同的單片機執行語句的機器周期也不一定一樣(比如:Atmel 51系列及大多數51的一個機器周期是12個時鍾周期,華邦的只需要4個時鍾周期)。不過大體來說,一條for循環大概8個機器周期,在12M晶振下,通常用以下代碼實現1ms的延時:
void delayms(unsigned int ms)
{
unsigned char i;
while(ms--)
{
for(i = 0; i < 120; i++);
}
}
大概算一下,120*8*1us=1ms,如果需要精確的定時,還是得用基於Tick定時器。
如果是
void delay(int d)
{
for(; d; --d);
}
d=1000的話,
那麼
大概算一下,1000*8*1us=8ms
所以,這可以實現一個大體8ms的延遲
㈦ 單片機軟體延時編程
;==========<延時子程序>=========882us
DELAY882: ;1.085x((202x4)+5)=882
MOV R7,#202
DELAY882_A:
NOP
NOP
DJNZ R7,DELAY882_A
RET
;==========<延時子程序>========1000us
DELAY1000: ;1.085x((229x4)+5)=999.285
MOV R7,#229
DELAY1000_A:
NOP
NOP
DJNZ R7,DELAY1000_A
RET
;==========<延時子程序>========2400us
DELAY2400: ;1.085x((245x9)+5)=2397.85
MOV R7,#245
DELAY2400_A:
NOP
NOP
NOP
NOP
NOP
NOP
NOP
DJNZ R7,DELAY2400_A
RET
㈧ 用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--);
}
㈨ 單片機延時時間程序怎麼編程
舉一個例子來說明吧.比如你要編一個延時50毫秒的子程序,那麼步驟如下:
1、查看一下你的硬體環境,比如晶振大小,CPU型號,不用CPU指令的機器周期是不一樣的。
2、計算延時需要的機器周期。比如採用12M晶振,CPU採用通用8051,那麼一個機器周期為1US,50毫秒為50*1000=50000US,需要的機器周期=50000/1=50000。
3、試編程,如下:
程序代碼 指令時間 總共時間
DELAY50MS: ;2 2
MOV R7,#A ;1 1
DELAY1:
MOV R6,#B ;1 1*A
DJNZ R6,$ ;2 2*B*A
DJNZ R7,DELAY1 ;2 2*A
RET ;2 2
所以總時間=2+1+A+2*A*B+2*A+2=5+3A+2AB
4、湊數求A、B
根據2、3得到如下式子:
50000=5+3A+2AB
可以有很多種結果,不過最好是以A盡可能小,B盡可能大為原則,當然不能大於255.
我現在湊出A=110,B=225;那麼總延時時間=5+3*110+2*110*225=49835。還差165US
5、補齊不夠時間
再加一個小循環就OK了,呵呵如下:
MOV R6,#C
DJNZ R6,$
會算了吧,2*C+1=165;所以C=82。
現在完整的延時程序出來了,如下:
DELAY50MS: ;2 2
MOV R7,#110 ;1 1
DELAY1:
MOV R6,#225 ;1 1*110
DJNZ R6,$ ;2 2*225*110
DJNZ R7,DELAY1 ;2 2*110
MOV R6,#82 ;1 1
DJNZ R6,$ ;2 2*82
RET ;2 2
很圓滿:總的時間50000微妙,也就是50毫秒。這種方式編程,在該硬體環境下可以保證最大誤差為1微妙。