導航:首頁 > 操作系統 > 51單片機延時計算

51單片機延時計算

發布時間:2023-10-07 11:53:44

Ⅰ 怎樣用51單片機實現小時級延時

51單片機的機器周期是晶振的12分頻的倒數。所以你24Mhz的機器周期是T=12/12M=0.5us。
假設你要定時的數是M,則初值等於M/機器周期(表示執行多少個機器周期)。
若初值小於65536
TH0=(65536-初值)%256
TL0=(65536-初值)/256
51在24MHZ的最大定時是65536*T=0.032768s,遠小於一小時。
所以為了方便計算,我們假設定時0.01s,然後執行3600/0.01次。
M=0.01/T=20000
TH0=(65536-初值)%256=0xB1
TL0=(65536-初值)/256=0x7F
用這個數一次定時精確值是0.0100485s。執行360000次精確值是3617.46s。

中斷程序是:
timer0() interrupt 1
{
TR0=0;
ET0=0;
TH0=0xB1;
TL0=0x7F;
if(delay_1hour)
{
if(j) //如果j大於0
{
TR0=1;j--; //說明還沒到3600次
}
else
{
if(i) 就算j等於0了,i大於0,說明還沒到100次
{
TR=1;j=3600;
}
else
{
flag_1hour=0; //循環了3600000次10ms,關閉延時標志位。。
}
}
}
ET0=1;
}

調用程序:
void delay1hour()
{
delay_1hour=1;i=100;j=3600;TR0=1;
}//在任意你想開始延時一小時的地方加這個函數。

在延時期間,單片機還可以干其他指令。

Ⅱ 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

Ⅲ 51單片機使用匯編語言循環延遲時間怎麼算

時間精確的延時程序要用匯編語言來編寫。
計算延遲時間要查詢每一條程序的執行周期數,然後加起來就是了。
在12m晶振的系統中,每個機器周期是1微秒
借用一下:
舉例來說明吧:
delay:
mov r0,#10 ;1(周期)
delay1:
mov r1,#100 ;1
djnz r1,$ ;2
djnz r0,delay1 ;2
ret ;2
周期數=1+((1+(2*100)+2)*10)+2=2033
延遲時間=2033周期*1微秒=2033微秒
從到這個程序開始到返回到調用的那個程序用了2033微秒

Ⅳ 求解51單片機延時程序計算

呵呵:一樓錯在時鍾周期和頻率的關系沒弄對;
二樓錯在內循環沒算DJNZ的兩個周期
=======================================
正解:
1)首先要知道單片機時鍾晶振頻率為多少?設fosc=6MHz。
2)時鍾周期T是計算機基本時間單位,同單片機使用的晶振頻率有關。
那麼T =1/fosc=1/6M=166.7ns。
3)機器周期T1是指CPU完成一個基本操作所需要的時間,如取指操作、讀數據操作等,機器周期=12 T =166.7ns X 12=2µs。
4)指令周期是指執行一條指令所需要的時間,因此指令周期沒有確定值,一般為1~4個T機器周期。
5)本題各指令的機器周期為:
程序 機器周期數 一次用的時間µs
ORG 0050H 0
DELAY:MOV R0,#0AH 1 2
DL2:MOV R1,#7DH 1 2
DL1:NOP 1 2
NOP 1 2
DJNE R1,DL1 2 4
DJNZ R0,DL2 2 4
RET 2 4
6)延時時間:
(1)內循環: 時間
DL1:NOP 2
NOP 2
DJNE R1,DL1 4
內循環的循環次數為125(07DH),延時時間為:125 X (2+2+4)=1000µs=1ms
(2)外循環:外循環的循環次數為10(0AH),
總循環:10 x 1000µs=10000µs=10ms
(3)精確計算:
MOV R0,#0AH 運行了1次用 2µs
DL2:MOV R1,#7DH 運行了10次用2x10µs
DL2:MOV R1,#7DH 運行了10次用4x10µs
RET 運行了1次用4µs
所以精確計算為:10000+2+20+40+4=10066 µs
一般情況下回答延時10000µs即10ms即可
(4)說明若選用的晶振fosc=12MHz 那麼以上的計算周期數不變,時間減半,即為10066/2=5033µs,或粗略答為:5000µs(5ms)。

以上答案希望有所幫助,並祝學習進步!

Ⅳ 51單片機延時程序時間是怎麼計算的

51單片機延時時間計算需要考慮以下兩種因素:
1、指令執行時間
2、指令循環次數

Ⅵ 如何算51單片機延時時間

用KEIL軟體可以計算時間,將while的起始位置和終止位置加紅點(雙擊即可);
然後左側的SEC後面的就是執行的時間。
再給你幾個延時程序做參考:
軟體延時:(asm)
晶振12MHZ,延時1秒
程序如下:
DELAY:MOV
72H,#100
LOOP3:MOV
71H,#100
LOOP1:MOV
70H,#47
LOOP0:DJNZ
70H,LOOP0
NOP
DJNZ
71H,LOOP1
MOV
70H,#46
LOOP2:DJNZ
70H,LOOP2
NOP
DJNZ
72H,LOOP3
MOV
70H,#48
LOOP4:DJNZ
70H,LOOP4
定時器延時:
晶振12MHZ,延時1s,定時器0工作方式為方式1
DELAY1:MOV
R7,#0AH
;;晶振12MHZ,延時0.5秒
AJMP
DELAY
DELAY2:MOV
R7,#14H
;;晶振12MHZ,延時1秒
DELAY:CLR
EX0
MOV
TMOD,#01H
;設置定時器的工作方式為方式1
MOV
TL0,#0B0H
;給定時器設置計數初始值
MOV
TH0,#3CH
SETB
TR0
;開啟定時器
HERE:JBC
TF0,NEXT1
SJMP
HERE
NEXT1:MOV
TL0,#0B0H
MOV
TH0,#3CH
DJNZ
R7,HERE
CLR
TR0
;定時器要軟體清零
SETB
EX0
RET
C語言延時程序:
10ms延時子程序(12MHZ)
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--);
}
1s延時子程序(12MHZ)
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--);
}
200ms延時子程序(12MHZ)
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--);
}
500ms延時子程序程序:
(12MHZ)
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--);
}
不過實際得到的延時會存在差異,所以最好用實驗的方法調整延時參數。

Ⅶ 51單片機中的延時應該怎麼計算

for(a=2;a>0;a--) // 2微秒, 執行2次(a+2)是4微秒;

for(b=142;b>0;b--) // 2微秒, 執行142次,for(a=2;a>0;a--)是4微秒,即2*(142*4);
for(c=1;c>0;c--) // 2微秒, 執行1次,即2*(142*4)=1136微秒;
b=125,1000/8=125,再減去其它調用時間,應該b取值不大於125。

Ⅷ 51單片機中延時程序

1. sleep()是以毫秒計算的,延時5秒是sleep(5*1000);,延時5分是sleep(5*1000*60);

2.包含的頭文件看你用的什麼編輯軟體。

3.我用的VC++是用包含在#include<windows.h>頭文件中。

#include<stdio.h>#include<windows.h>//Sleep()的頭文件 main() { int i;

int n=10;for(i=1;i<=n;i++) {printf("%d",i);Sleep(5*1000*60);} //

這里修改延時時間,

有些人說是用#include<dos.h>做頭文件你自己試下吧。

還用Sleep的S是大寫的,不是小寫的。

Ⅸ 51單片機中怎麼得到精確延時

51單片機的幾種精確延時實現延時通常有兩種方法:一種是硬體延時,要用到定時器/計數器,這種方法可以提高CPU的工作效率,也能做到精確延時;另一種是軟體延時,這種方法主要採用循環體進行。

1 使用定時器/計數器實現精確延時

單片機系統一般常選用11.059 2 MHz、12 MHz或6 MHz晶振。第一種更容易產生各種標準的波特率,後兩種的一個機器周期分別為1 μs和2 μs,便於精確延時。本程序中假設使用頻率為12 MHz的晶振。最長的延時時間可達216=65 536 μs。若定時器工作在方式2,則可實現極短時間的精確延時;如使用其他定時方式,則要考慮重裝定時初值的時間(重裝定時器初值佔用2個機器周期)。

在實際應用中,定時常採用中斷方式,如進行適當的循環可實現幾秒甚至更長時間的延時。使用定時器/計數器延時從程序的執行效率和穩定性兩方面考慮都是最佳的方案。但應該注意,C51編寫的中斷服務程序編譯後會自動加上PUSH ACC、PUSH PSW、POP PSW和POP ACC語句,執行時佔用了4個機器周期;如程序中還有計數值加1語句,則又會佔用1個機器周期。這些語句所消耗的時間在計算定時初值時要考慮進去,從初值中減去以達到最小誤差的目的。

2 軟體延時與時間計算

在很多情況下,定時器/計數器經常被用作其他用途,這時候就只能用軟體方法延時。下面介紹幾種軟體延時的方法。

2.1 短暫延時

可以在C文件中通過使用帶_NOP_( )語句的函數實現,定義一系列不同的延時函數,如Delay10us( )、Delay25us( )、Delay40us( )等存放在一個自定義的C文件中,需要時在主程序中直接調用。如延時10 μs的延時函數可編寫如下:

void Delay10us( ) {
_NOP_( );
_NOP_( );
_NOP_( );
_NOP_( );
_NOP_( );
_NOP_( );
}

Delay10us( )函數中共用了6個_NOP_( )語句,每個語句執行時間為1 μs。主函數調用Delay10us( )時,先執行一個LCALL指令(2 μs),然後執行6個_NOP_( )語句(6 μs),最後執行了一個RET指令(2 μs),所以執行上述函數時共需要10 μs。 可以把這一函數當作基本延時函數,在其他函數中調用,即嵌套調用\[4\],以實現較長時間的延時;但需要注意,如在Delay40us( )中直接調用4次Delay10us( )函數,得到的延時時間將是42 μs,而不是40 μs。這是因為執行Delay40us( )時,先執行了一次LCALL指令(2 μs),然後開始執行第一個Delay10us( ),執行完最後一個Delay10us( )時,直接返回到主程序。依此類推,如果是兩層嵌套調用,如在Delay80us( )中兩次調用Delay40us( ),則也要先執行一次LCALL指令(2 μs),然後執行兩次Delay40us( )函數(84 μs),所以,實際延時時間為86 μs。簡言之,只有最內層的函數執行RET指令。該指令直接返回到上級函數或主函數。如在Delay80μs( )中直接調用8次Delay10us( ),此時的延時時間為82 μs。通過修改基本延時函數和適當的組合調用,上述方法可以實現不同時間的延時。

2.2 在C51中嵌套匯編程序段實現延時

在C51中通過預處理指令#pragma asm和#pragma endasm可以嵌套匯編語言語句。用戶編寫的匯編語言緊跟在#pragma asm之後,在#pragma endasm之前結束。

如:#pragma asm

匯編語言程序段

#pragma endasm

延時函數可設置入口參數,可將參數定義為unsigned char、int或long型。根據參數與返回值的傳遞規則,這時參數和函數返回值位於R7、R7R6、R7R6R5中。在應用時應注意以下幾點:

◆ #pragma asm、#pragma endasm不允許嵌套使用;
◆ 在程序的開頭應加上預處理指令#pragma asm,在該指令之前只能有注釋或其他預處理指令;
◆ 當使用asm語句時,編譯系統並不輸出目標模塊,而只輸出匯編源文件;
◆ asm只能用小寫字母,如果把asm寫成大寫,編譯系統就把它作為普通變數;
◆ #pragma asm、#pragma endasm和 asm只能在函數內使用。

將匯編語言與C51結合起來,充分發揮各自的優勢,無疑是單片機開發人員的最佳選擇。

2.3 使用示波器確定延時時間

利用示波器來測定延時程序執行時間。方法如下:編寫一個實現延時的函數,在該函數的開始置某個I/O口線如P1.0為高電平,在函數的最後清P1.0為低電平。在主程序中循環調用該延時函數,通過示波器測量P1.0引腳上的高電平時間即可確定延時函數的執行時間。方法如下:

sbit T_point = P1^0;
void Dly1ms(void) {
unsigned int i,j;
while (1) {
T_point = 1;
for(i=0;i<2;i++){
for(j=0;j<124;j++){;}
}
T_point = 0;
for(i=0;i<1;i++){
for(j=0;j<124;j++){;}
}
}
}
void main (void) {
Dly1ms();
}

把P1.0接入示波器,運行上面的程序,可以看到P1.0輸出的波形為周期是3 ms的方波。其中,高電平為2 ms,低電平為1 ms,即for循環結構「for(j=0;j<124;j++) {;}」的執行時間為1 ms。通過改變循環次數,可得到不同時間的延時。當然,也可以不用for循環而用別的語句實現延時。這里討論的只是確定延時的方法。

2.4 使用反匯編工具計算延時時間

用Keil C51中的反匯編工具計算延時時間,在反匯編窗口中可用源程序和匯編程序的混合代碼或匯編代碼顯示目標應用程序。為了說明這種方法,還使用「for (i=0;i<DlyT;i++) {;}」。在程序中加入這一循環結構,首先選擇build taget,然後單擊start/stop debug session按鈕進入程序調試窗口,最後打開Disassembly window,找出與這部分循環結構相對應的匯編代碼,具體如下:

C:0x000FE4CLRA//1T
C:0x0010FEMOVR6,A//1T
C:0x0011EEMOVA,R6//1T
C:0x0012C3CLRC//1T
C:0x00139FSUBBA,DlyT //1T
C:0x00145003JNCC:0019//2T
C:0x00160E INCR6//1T
C:0x001780F8SJMPC:0011//2T

可以看出,0x000F~0x0017一共8條語句,分析語句可以發現並不是每條語句都執行DlyT次。核心循環只有0x0011~0x0017共6條語句,總共8個機器周期,第1次循環先執行「CLR A」和「MOV R6,A」兩條語句,需要2個機器周期,每循環1次需要8個機器周期,但最後1次循環需要5個機器周期。DlyT次核心循環語句消耗(2+DlyT×8+5)個機器周期,當系統採用12 MHz時,精度為7 μs。

當採用while (DlyT--)循環體時,DlyT的值存放在R7中。相對應的匯編代碼如下:

C:0x000FAE07MOVR6, R7//1T
C:0x00111F DECR7//1T
C:0x0012EE MOVA,R6//1T
C:0x001370FAJNZC:000F//2T

循環語句執行的時間為(DlyT+1)×5個機器周期,即這種循環結構的延時精度為5 μs。

通過實驗發現,如將while (DlyT--)改為while (--DlyT),經過反匯編後得到如下代碼:

C:0x0014DFFE DJNZR7,C:0014//2T

可以看出,這時代碼只有1句,共佔用2個機器周期,精度達到2 μs,循環體耗時DlyT×2個機器周期;但這時應該注意,DlyT初始值不能為0。

注意:計算時間時還應加上函數調用和函數返回各2個機器周期時間。

閱讀全文

與51單片機延時計算相關的資料

熱點內容
無理的命令 瀏覽:506
問道手游解壓失敗是什麼原因 瀏覽:772
mysql命令提示 瀏覽:369
apachephp中文亂碼 瀏覽:335
pythonimportpylab 瀏覽:236
阿里雲app伺服器價格表 瀏覽:978
appstore怎麼搶手機 瀏覽:843
列印伺服器是什麼列印隊列 瀏覽:357
網上怎麼用app辦理營業執照 瀏覽:859
sql如何查看伺服器地址 瀏覽:777
編譯速度和系統有關嗎 瀏覽:56
復盛製冷壓縮機 瀏覽:982
雲伺服器共享手機流量 瀏覽:842
星界邊境像素壓縮 瀏覽:459
演算法分析與設計二手 瀏覽:983
學編程如何配電腦 瀏覽:971
怎麼看特徵找卡密的加密方式 瀏覽:526
方舟非官方伺服器怎麼賺錢 瀏覽:516
明日之後伺服器無效是怎麼回事 瀏覽:272
蛋殼公寓app如何查水電表 瀏覽:718