標(biāo)題: 新手關(guān)于延時子程序,再增加一個R4寫在什么地方 [打印本頁]

作者: 8imi8    時間: 2015-9-22 12:40
標(biāo)題: 新手關(guān)于延時子程序,再增加一個R4寫在什么地方
看了教程,延時子程序里再增加一個R4寫在什么地方,是這樣加還是怎樣加
DELAY:MOV R7,#250;
D1:MOV R6,#250   ;
D2:DJNZ R6,D2     ;
D3:MOV R4,#250   ;
D4:DJNZ R4,D4     ;
DJNZ R7,D1   ;
RET         算法又是怎么算的,如教程總 計:1+250+125000+500=1257501次,乘以1微秒,換算約為0.13秒。
作者: 木木de    時間: 2015-9-22 13:03
用定時器吧   時間控制的準(zhǔn)確些
作者: 8imi8    時間: 2015-9-22 13:07
905377346 發(fā)表于 2015-9-22 13:03
用定時器吧   時間控制的準(zhǔn)確些

我在學(xué)習(xí)51單機(jī)片,這個子程序不明白,不是定時器的問題
作者: superjiangzhen    時間: 2015-9-22 15:30
這就是一個簡單的延時程序吧 不過怎么還用匯編寫呢
作者: shuaiqi    時間: 2015-9-22 16:31
用定時器吧   時間控制的準(zhǔn)確些,也可以專門找一些寫好的延遲程序
作者: 8imi8    時間: 2015-9-22 17:49
我還沒學(xué)到定時器那步,現(xiàn)在只想搞懂R4是怎么加上去,排在那一排,加上去有多少次,加上去是怎么算次數(shù)的?
作者: 鄭楊哇哇    時間: 2015-9-22 18:27
看不懂匯編,感覺c比較簡單一些
作者: ahshmj    時間: 2015-9-22 20:46
本帖最后由 ahshmj 于 2015-9-23 11:36 編輯

如果使用的是12M晶振,則:
DELAY:MOV R7,#250   ;本語句運(yùn)行次數(shù)=1     機(jī)器周期數(shù)=1*1=1      (該指令每次執(zhí)行周期數(shù)=1)
D1:MOV R6,#250        ;本語句運(yùn)行次數(shù)=250  機(jī)器周期數(shù)=250*1=250  (該指令每次執(zhí)行周期數(shù)=1)
D2:MOV R4,#250        ;本語句運(yùn)行次數(shù)=250*250=62500   機(jī)器周期數(shù)=62500*1=62500  (該指令每次執(zhí)行周期數(shù)=1)
D3:DJNZ R4,D3          ;本語句運(yùn)行次數(shù)=250*250*250=15625000      機(jī)器周期數(shù)=15625000*2=31250000   (該指令每次執(zhí)行周期數(shù)=2)
DJNZ R6,D2              ;本語句運(yùn)行次數(shù)=250*250=62500      機(jī)器周期數(shù)=62500*2=125000     (該指令每次執(zhí)行周期數(shù)=2)
DJNZ R7,D1              ;本語句運(yùn)行次數(shù)=250    機(jī)器周期數(shù)=250*2=500      (該指令每次執(zhí)行周期數(shù)=2)
RET                        ;本語句運(yùn)行次數(shù)=1    機(jī)器周期數(shù)=1*2=2      (該指令每次執(zhí)行周期數(shù)=2)
就這個來說,計算:1+250+62500+31250000+125000+500+2=31.43825100秒

作了修改,這個是極準(zhǔn)確的機(jī)器周期數(shù)。



作者: llccww    時間: 2015-9-22 23:25
可以計算出來的。有頻率,有循環(huán)次數(shù)
作者: wq2414745457    時間: 2015-9-22 23:33
DELAY:         MOV R7,#250     ; D1:            MOV R6,#250     ;   執(zhí)行需要1 D2:            DJNZ R6,D2      ;   若R6不等于0,則執(zhí)行D2,R6=R6-1,直到R6=0,執(zhí)行需要250         MOV R4,#250     ; D4:            DJNZ R4,D4      ;   若R4不等于0,則執(zhí)行D4,R4=R4-1,直到R4=0,執(zhí)行需要250         DJNZ R7,D1      ;   若R7不等于0,則執(zhí)行D7,R4=R7-1,直到R7=0,執(zhí)行需要250 RET 所以 D1=1,(D2=250 + D4=250)* (D7=250)
作者: 8imi8    時間: 2015-9-23 08:10
ahshmj 發(fā)表于 2015-9-22 20:46
DELAY:MOV R7,#250;
D1:MOV R6,#250   ;
D2:MOV R4,#250   ;

謝謝謝謝謝謝
作者: Sparkman    時間: 2015-9-23 12:37
250*(250+250)
作者: 8imi8    時間: 2015-9-23 15:57
本帖最后由 8imi8 于 2015-9-26 11:34 編輯

DELAY:MOV R7,#250;

D1:MOV R6,#250   ;

D2:DJNZ R6,D2     ;

D3:DJNZ R6,D3     ;

DJNZ R7,D1   ;

RET    我這樣寫是對的還是錯的, 計算:1+250+(250*250)*2+{[(250*250)*2]*[(250*250)*2]}*2+250*2。算法正確嗎?我想D2既然能雙周期D1的步驟,那么D3也可以雙周期D2的步驟,不知道這樣對不對。
作者: ahshmj    時間: 2015-9-24 21:01
本帖最后由 ahshmj 于 2015-9-24 21:02 編輯
8imi8 發(fā)表于 2015-9-23 15:57
DELAY:MOV R7,#250;

D1:MOV R6,#250   ;

看不明白你的思路。但是,像“MOV R6,#250”這樣的語句是1周期指令。
作者: 8imi8    時間: 2015-9-26 11:32
ahshmj 發(fā)表于 2015-9-24 21:01
看不明白你的思路。但是,像“MOV R6,#250”這樣的語句是1周期指令。

我想D2既然能雙周期D1的步驟,那么D3也可以雙周期D2的步驟,不知道這樣對不對
作者: 明白    時間: 2015-9-26 12:08
本帖最后由 明白 于 2015-9-26 12:11 編輯

DELAY:MOV R7,#250 ;1指令周期x執(zhí)行    1次 = 1  指令周期
D1:MOV R6,#250      ;1指令周期x執(zhí)行     1次 = 1  指令周期
D2:DJNZ R6,D2         ;2指令周期x執(zhí)行250次 = 500指令周期
D3:MOV R4,#250      ;1指令周期x執(zhí)行     1次 = 1  指令周期
D4:DJNZ R4,D4         ;2指令周期x執(zhí)行250次 = 500指令周期
DJNZ R7,D1               ;2指令周期x執(zhí)行250次 = 500指令周期
RET                           ;2指令周期x執(zhí)行     1次 = 2  指令周期


內(nèi)循環(huán)由R6,R4分別遞減完成,延時時間是先后的疊加:
  1+500+1+500=1002個機(jī)器周期,
外循環(huán)次數(shù)R7=250;
精確總共:1 + 1002*250 +2 =  250503   指令周期
作者: ahshmj    時間: 2015-10-3 19:32
本帖最后由 ahshmj 于 2015-10-3 19:45 編輯
明白 發(fā)表于 2015-9-26 12:08
DELAY:MOV R7,#250 ;1指令周期x執(zhí)行    1次 = 1  指令周期
D1:MOV R6,#250      ;1指令周期x執(zhí)行     1次 = 1  指令周期,執(zhí)行250次(R7的值)
D2:DJNZ R6,D2         ;2指令周期x執(zhí)行250次 = 500指令周期,執(zhí)行250次(R6的值)
D3:MOV R4,#250      ;1指令周期x執(zhí)行     1次 = 1  指令周期,執(zhí)行250次(R7的值)
D4:DJNZ R4,D4         ;2指令周期x執(zhí)行250次 = 500指令周期,執(zhí)行250次(R4的值)
DJNZ R7,D1               ;2指令周期x執(zhí)行250次 = 500指令周期
RET                           ;2指令周期x執(zhí)行     1次 = 2  指令周期

你的程序不是3層循環(huán)。你看一下上面的紅色字體。我上面給出的是3層循環(huán)的程序,按3層循環(huán)應(yīng)該是:
31.43825100s  ,這是Keil uVision3運(yùn)行的結(jié)果,如果晶振設(shè)成12M,機(jī)器周期就是3143825100。
你何不在Keil uVision3運(yùn)行一下看看??然后不就清楚了嗎??



作者: 明白    時間: 2015-10-3 22:31
本帖最后由 明白 于 2015-10-3 22:48 編輯

樓主原本程序,那樣計算,有錯
怎么看,看出3層循環(huán)?
先別看R7的外循環(huán),單獨(dú)看中間紅色4行的指令是怎么執(zhí)行!
認(rèn)為是【1】還是【2】
【1】:   R6 、R4各自的循環(huán)有互相嵌套
【2】:   R6 、R4先后互不相關(guān)的各自循環(huán)





歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1