找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4295|回復(fù): 17
打印 上一主題 下一主題
收起左側(cè)

新手關(guān)于延時子程序,再增加一個R4寫在什么地方

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:84745 發(fā)表于 2015-9-22 12:40 來自手機(jī) | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
看了教程,延時子程序里再增加一個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秒。
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:76227 發(fā)表于 2015-9-22 13:03 | 只看該作者
用定時器吧   時間控制的準(zhǔn)確些
回復(fù)

使用道具 舉報

板凳
ID:84745 發(fā)表于 2015-9-22 13:07 來自手機(jī) | 只看該作者
905377346 發(fā)表于 2015-9-22 13:03
用定時器吧   時間控制的準(zhǔn)確些

我在學(xué)習(xí)51單機(jī)片,這個子程序不明白,不是定時器的問題
回復(fù)

使用道具 舉報

地板
ID:72643 發(fā)表于 2015-9-22 15:30 | 只看該作者
這就是一個簡單的延時程序吧 不過怎么還用匯編寫呢
回復(fù)

使用道具 舉報

5#
ID:90795 發(fā)表于 2015-9-22 16:31 | 只看該作者
用定時器吧   時間控制的準(zhǔn)確些,也可以專門找一些寫好的延遲程序
回復(fù)

使用道具 舉報

6#
ID:84745 發(fā)表于 2015-9-22 17:49 來自手機(jī) | 只看該作者
我還沒學(xué)到定時器那步,現(xiàn)在只想搞懂R4是怎么加上去,排在那一排,加上去有多少次,加上去是怎么算次數(shù)的?
回復(fù)

使用道具 舉報

7#
ID:90719 發(fā)表于 2015-9-22 18:27 | 只看該作者
看不懂匯編,感覺c比較簡單一些
回復(fù)

使用道具 舉報

8#
ID:7485 發(fā)表于 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ù)。


回復(fù)

使用道具 舉報

9#
ID:90833 發(fā)表于 2015-9-22 23:25 | 只看該作者
可以計算出來的。有頻率,有循環(huán)次數(shù)
回復(fù)

使用道具 舉報

10#
ID:90794 發(fā)表于 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)
回復(fù)

使用道具 舉報

11#
ID:84745 發(fā)表于 2015-9-23 08:10 來自手機(jī) | 只看該作者
ahshmj 發(fā)表于 2015-9-22 20:46
DELAY:MOV R7,#250;
D1:MOV R6,#250   ;
D2:MOV R4,#250   ;

謝謝謝謝謝謝
回復(fù)

使用道具 舉報

12#
ID:90858 發(fā)表于 2015-9-23 12:37 來自手機(jī) | 只看該作者
250*(250+250)
回復(fù)

使用道具 舉報

13#
ID:84745 發(fā)表于 2015-9-23 15:57 來自手機(jī) | 只看該作者
本帖最后由 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的步驟,不知道這樣對不對。
回復(fù)

使用道具 舉報

14#
ID:7485 發(fā)表于 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周期指令。
回復(fù)

使用道具 舉報

15#
ID:84745 發(fā)表于 2015-9-26 11:32 來自手機(jī) | 只看該作者
ahshmj 發(fā)表于 2015-9-24 21:01
看不明白你的思路。但是,像“MOV R6,#250”這樣的語句是1周期指令。

我想D2既然能雙周期D1的步驟,那么D3也可以雙周期D2的步驟,不知道這樣對不對
回復(fù)

使用道具 舉報

16#
ID:19715 發(fā)表于 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   指令周期
回復(fù)

使用道具 舉報

17#
ID:7485 發(fā)表于 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)行一下看看??然后不就清楚了嗎??


回復(fù)

使用道具 舉報

18#
ID:19715 發(fā)表于 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)
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表