單片機延時編程
A. 51單片機用c語言怎麼寫延時函數
延時時間的計算與單片機的晶振頻率有關。若晶振頻率為12Mhz,那麼單片機每震動一次所需要的時間是1/12M s。那麼再來看看單片機執行一次自減所需要的振動次數是96次,假如我們對時間要求不是特別精確的話,可以約等於100來計算。現在通過上面兩個數據可以得出:單片機每執行一次自減所需要的時間是1/12M *100(s),即1/120000 s,逆向計算一下,每1ms需要自減多少次?120次對吧。所以一個簡單的延時功能就誕生了,我們只需要自減120次,就可以延時1ms,如果我們要延時50ms呢,那就自減50*120=6000次。那麼在程序上如何表達呢?我們可以用兩套for循環
void delay(int i){
int x,y;
for(x=i;x>0;x--){
for(y=120;y>0;y--)
}
}
參數 i 代表該函數延時多少ms
B. 51單片機中,編程怎麼計算延時的
單片機延時,有兩種延時。
第一種: 軟體延時。 根本不準確
軟體延時意思就單片機在執行指令時,執行一條空指令,具體如下:
Void Delay (unsigned char i)
{
while( i != 0)i--;
}
Delay(100);
以上無法計算出延時時間,只能通過Keil軟體模擬,來查看具體延時之間。
第二種: 定時器延時。精準延時
C. 單片機有哪些延時方法詳細介紹
據我所知,單片機延時的方法有:
1。空操作延時(12MHz)
voiddelay10us()
{
_NOP_();
_NOP_();
_NOP_();
_NOP_();
_NOP_();
_NOP_();
}
2。循環延時(12MHz)
Voiddelay500ms()
{
unsignedchari,j,k;
for(i=15;i>0;i--)
for(j=202;j>0;j--)
for(k=81;k>0;k--);
}
延時總時間=[(k*2+3)*j+3]*i+5
k*2+3=165 us
165*j+3=33333 us
33333*i+5=500000 us=500 ms
3。計時器中斷延時(工作方式2) (12MHz)
#include<reg52.h>
sbitled=P1^0;
unsignedintnum=0;
voidmain()
{
TMOD=0x02;
TH0=6;
TL0=6;
EA=1;
ET0=1;
TR0=1;
while(1)
{
if(num==4000)
{
num=0;
led=~led;
}
}
}
voidT0_time()interrupt1
{
num++;
}
4。C程序嵌入組合語言延時
D. 單片機延時控製程序
#include<reg51.h>
#defineucharunsignedchar
ucharcnt=0,sec=0;
sbitAsgn=P1^0;
sbitBsng=P1^1;
sbitOut=P1^4;
bitflag=0;
voidt0isr()interrupt1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
cnt++;
if(cnt>=20)
{
cnt=0;
sec++;
}
}
main()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
ET0=1;
EA=1;
sec1=0;
sec2=0;
while(1)
{
sec=0;
cnt=0;
TR0=0;
while(Bsng==1);//死等B信號
TR0=1;
cnt=0;
sec=0;
while(sec1<1)//1秒內等待A信號
{
if(Asng==0)
{
sec=0;
cnt=0;
flag=1;
}
}
if(flag)//如果出現有效信號
{
while(sec<3);//等待3秒
out=0;
flag=0;
}
}
}
E. 如何用單片機的delay實現延時
單片機中的delay()的單位時間不是系統提供的,而是用戶自己編制的。
如果用循環語句實現的循環,沒法計算,但是可以通過軟體模擬看到具體時間,但是一般精精確延時是沒法用循環語句實現的。
如果想精確延時,一般需要用到定時器,延時時間與晶振有關系,單片機系統一般常選用11.059 2 MHz、12 MHz或6 MHz晶振。第一種更容易產生各種標準的波特率,後兩種的一個機器周期分別為1 μs和2 μs,便於精確延時。本程序中假設使用頻率為12 MHz的晶振。
最長的延時時間可達216=65 536 μs。若定時器工作在方式2,則可實現極短時間的精確延時;如使用其他定時方式,則要考慮重裝定時初值的時間(重裝定時器初值佔用2個機器周期)。
(5)單片機延時編程擴展閱讀
單片機C語言程序中延時函數delay的原理是:僅僅執行一些,沒有實質性影響的所謂「無意義指令」,比如做比大小啊,做某個int的自加運算啊之類的。
單片機的有些程序需要調用延時程序,合理的安排循環次數以及空操作的個數方法:用匯編的話就根據你的當前晶振頻率去推算你的指令周期,然後結合需要延遲的時間。
編寫延遲程序,用C的話還是要看最後生成的匯編碼是什麼樣的了。最簡單的方法就是寫好程序以後再編譯器里軟模擬看時間。
單片機C語言延時需注意的問題:
標準的C語言中沒有空語句。但在單片機的C語言編程中,經常需要用幾個空指令產生短延時的效果。這在匯編語言中很容易實現,寫幾個nop就行了。
在keil C51中,直接調用庫函數:
#include // 聲明了void _nop_(void);
_nop_(); // 產生一條NOP指令
作用:對於延時很短的,要求在us級的,採用「_nop_」函數,這個函數相當匯編NOP指令,延時幾微秒。NOP指令為單周期指令,可由晶振頻率算出延時時間,對於12M晶振,延時1uS。對於延時比較長的,要求在大於10us,採用C51中的循環語句來實現。
F. 單片機延時程序的延時時間怎麼算的
單片機的延時程序通過執行指令來達到延時效果,這個時間等於執行的指令需要的時間,而一個指令需要的時間叫做指令周期,這個時間等於若干個機器周期。
(6)單片機延時編程擴展閱讀:
1丶指令周期,是每種運算需要的時間,如加法、邏輯等,是每一步進行這種指令運算需要的時間,是機器周期的整數倍,這種周期不定。
2丶51單片機12M晶振,晶振周期1/12微妙,一個機器周期包含12個晶振周期,所以12M晶振時機器周期=12x(1/12)微妙=1微妙。
3丶1個毫秒延時子程序如下:
void delay1ms(uint ms)
{
uint i,j;
for(i=0;i<ms;i++)
{
for(j=0;j<110;j++);
}
}
G. 單片機匯編程序延時0.3秒和0.5秒怎麼寫
延時0.3秒程序(12M):
DELAY3:
MOVR2,#200
DL1:
MOVR3,#250
DJNZR3,$
MOVR3,#250
DJNZR3,$
MOVR3,#250
DJNZR3,$
DJNZR2,DL1
RET
延時0.5秒程序:
DELAY5:
MOVR2,#5
DLY1:
MOVR3,#200
DLY2:
MOVR4,#250
DJNZR4,$
DJNZR3,DLY2
DJNZR2,DLY1
RET
H. 51 單片機延時程序
我以2ms為例說明一下:
單片機的晶振周期為12hz,則執行一條代碼為一個機器周期,為1微妙(ua),所以2ms=10*200(ua),
對r2賦值200(4位二進制數最大值為256,所以只能取到200)即#c8h。再對r2循環20次就實現了2ms延時。至於100ms、
200ms、
1s等等方法類似,只是調整相應的初值。多設置幾次循環就行。
程序代碼如下:
delay:
mov
r1,#0ah
;賦值r1為10次
delay1:
mov
r2,#c8h
;賦值r2為200次
delay2:
djnz
r2,$
;r2自減到0,不到0繼續等待
djnz
r1,delay1
;r2減到0後r1自減1,重新給r2賦初值後繼續循環,直到r1到0為止,延時結束
ret
I. 單片機C語言延遲程序
下面的延時的基本程序(中斷加計數器)
********
void
T0_int(void)
interrupt
1
{
TH0
=
0x4C;
//重新裝載,50MS定時器初值
TL0
=
0x00;
T0_count++;
if(T0_count==20)
//1S到
{
T0_count
=
0;
//在這寫程序
}
}
main()
{
TMOD
=
0x01;//定時器0,工作方式1,16位計數
TH0
=
0x4C;
//50MS定時器初值
TL0
=
0x00;
IE
=
0x82;
//開總中斷,開T0中斷
EA
=
1;
ET0
=
1;
TR0
=
1;
T0_count
=
0;
i
=
0;
loop:
goto
loop;
}
還有:
for(us=0;us<60;us++);
/*延時500us*/
for(us=0;us<1;us++);
/*
延時15微秒*/
for(us=0;us<5;us++);
/*
延時51微秒*/