找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3587|回复: 17
打印 上一主题 下一主题
收起左侧

新手关于延时子程序,再增加一个R4写在什么地方

[复制链接]
跳转到指定楼层
楼主
ID:84745 发表于 2015-9-22 12:40 来自手机 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
看了教程,延时子程序里再增加一个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空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:76227 发表于 2015-9-22 13:03 | 只看该作者
用定时器吧   时间控制的准确些
回复

使用道具 举报

板凳
ID:84745 发表于 2015-9-22 13:07 来自手机 | 只看该作者
905377346 发表于 2015-9-22 13:03
用定时器吧   时间控制的准确些

我在学习51单机片,这个子程序不明白,不是定时器的问题
回复

使用道具 举报

地板
ID:72643 发表于 2015-9-22 15:30 | 只看该作者
这就是一个简单的延时程序吧 不过怎么还用汇编写呢
回复

使用道具 举报

5#
ID:90795 发表于 2015-9-22 16:31 | 只看该作者
用定时器吧   时间控制的准确些,也可以专门找一些写好的延迟程序
回复

使用道具 举报

6#
ID:84745 发表于 2015-9-22 17:49 来自手机 | 只看该作者
我还没学到定时器那步,现在只想搞懂R4是怎么加上去,排在那一排,加上去有多少次,加上去是怎么算次数的?
回复

使用道具 举报

7#
ID:90719 发表于 2015-9-22 18:27 | 只看该作者
看不懂汇编,感觉c比较简单一些
回复

使用道具 举报

8#
ID:7485 发表于 2015-9-22 20:46 | 只看该作者
本帖最后由 ahshmj 于 2015-9-23 11:36 编辑

如果使用的是12M晶振,则:
DELAY:MOV R7,#250   ;本语句运行次数=1     机器周期数=1*1=1      (该指令每次执行周期数=1)
D1:MOV R6,#250        ;本语句运行次数=250  机器周期数=250*1=250  (该指令每次执行周期数=1)
D2:MOV R4,#250        ;本语句运行次数=250*250=62500   机器周期数=62500*1=62500  (该指令每次执行周期数=1)
D3:DJNZ R4,D3          ;本语句运行次数=250*250*250=15625000      机器周期数=15625000*2=31250000   (该指令每次执行周期数=2)
DJNZ R6,D2              ;本语句运行次数=250*250=62500      机器周期数=62500*2=125000     (该指令每次执行周期数=2)
DJNZ R7,D1              ;本语句运行次数=250    机器周期数=250*2=500      (该指令每次执行周期数=2)
RET                        ;本语句运行次数=1    机器周期数=1*2=2      (该指令每次执行周期数=2)
就这个来说,计算:1+250+62500+31250000+125000+500+2=31.43825100秒

作了修改,这个是极准确的机器周期数。


回复

使用道具 举报

9#
ID:90833 发表于 2015-9-22 23:25 | 只看该作者
可以计算出来的。有频率,有循环次数
回复

使用道具 举报

10#
ID:90794 发表于 2015-9-22 23:33 | 只看该作者
DELAY:         MOV R7,#250     ; D1:            MOV R6,#250     ;   执行需要1 D2:            DJNZ R6,D2      ;   若R6不等于0,则执行D2,R6=R6-1,直到R6=0,执行需要250         MOV R4,#250     ; D4:            DJNZ R4,D4      ;   若R4不等于0,则执行D4,R4=R4-1,直到R4=0,执行需要250         DJNZ R7,D1      ;   若R7不等于0,则执行D7,R4=R7-1,直到R7=0,执行需要250 RET 所以 D1=1,(D2=250 + D4=250)* (D7=250)
回复

使用道具 举报

11#
ID:84745 发表于 2015-9-23 08:10 来自手机 | 只看该作者
ahshmj 发表于 2015-9-22 20:46
DELAY:MOV R7,#250;
D1:MOV R6,#250   ;
D2:MOV R4,#250   ;

谢谢谢谢谢谢
回复

使用道具 举报

12#
ID:90858 发表于 2015-9-23 12:37 来自手机 | 只看该作者
250*(250+250)
回复

使用道具 举报

13#
ID:84745 发表于 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的步骤,不知道这样对不对。
回复

使用道具 举报

14#
ID:7485 发表于 2015-9-24 21:01 | 只看该作者
本帖最后由 ahshmj 于 2015-9-24 21:02 编辑
8imi8 发表于 2015-9-23 15:57
DELAY:MOV R7,#250;

D1:MOV R6,#250   ;

看不明白你的思路。但是,像“MOV R6,#250”这样的语句是1周期指令。
回复

使用道具 举报

15#
ID:84745 发表于 2015-9-26 11:32 来自手机 | 只看该作者
ahshmj 发表于 2015-9-24 21:01
看不明白你的思路。但是,像“MOV R6,#250”这样的语句是1周期指令。

我想D2既然能双周期D1的步骤,那么D3也可以双周期D2的步骤,不知道这样对不对
回复

使用道具 举报

16#
ID:19715 发表于 2015-9-26 12:08 | 只看该作者
本帖最后由 明白 于 2015-9-26 12:11 编辑

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


内循环由R6,R4分别递减完成,延时时间是先后的叠加:
  1+500+1+500=1002个机器周期,
外循环次数R7=250;
精确总共:1 + 1002*250 +2 =  250503   指令周期
回复

使用道具 举报

17#
ID:7485 发表于 2015-10-3 19:32 | 只看该作者
本帖最后由 ahshmj 于 2015-10-3 19:45 编辑
明白 发表于 2015-9-26 12:08
DELAY:MOV R7,#250 ;1指令周期x执行    1次 = 1  指令周期
D1:MOV R6,#250      ;1指令周期x执行     1次 = 1  指令周期,执行250次(R7的值)
D2:DJNZ R6,D2         ;2指令周期x执行250次 = 500指令周期,执行250次(R6的值)
D3:MOV R4,#250      ;1指令周期x执行     1次 = 1  指令周期,执行250次(R7的值)
D4:DJNZ R4,D4         ;2指令周期x执行250次 = 500指令周期,执行250次(R4的值)
DJNZ R7,D1               ;2指令周期x执行250次 = 500指令周期
RET                           ;2指令周期x执行     1次 = 2  指令周期

你的程序不是3层循环。你看一下上面的红色字体。我上面给出的是3层循环的程序,按3层循环应该是:
31.43825100s  ,这是Keil uVision3运行的结果,如果晶振设成12M,机器周期就是3143825100。
你何不在Keil uVision3运行一下看看??然后不就清楚了吗??


回复

使用道具 举报

18#
ID:19715 发表于 2015-10-3 22:31 | 只看该作者
本帖最后由 明白 于 2015-10-3 22:48 编辑

楼主原本程序,那样计算,有错
怎么看,看出3层循环?
先别看R7的外循环,单独看中间红色4行的指令是怎么执行!
认为是【1】还是【2】
【1】:   R6 、R4各自的循环有互相嵌套
【2】:   R6 、R4先后互不相关的各自循环
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表