
单片机延时子程序
DELAY:MOVR7,#200L1:MOVR6,#250L2:MOVR5,#10L3:DJNZR5,L3DJNZR6,L2DJNZR7,L1RET它是如何实现延时一秒的...
DELAY:MOV R7,#200
L1:MOV R6,#250
L2:MOV R5,#10
L3:DJNZ R5,L3
DJNZ R6,L2
DJNZ R7,L1
RET
它是如何实现延时一秒的?DJNZ Rn,*为两个机器周期,MOV Rn,#*为一个机器周期。晶振为12MHz。这些都知道,不过就是想不通为什么要200*250*10。望高手指点迷津!Thanks! 展开
L1:MOV R6,#250
L2:MOV R5,#10
L3:DJNZ R5,L3
DJNZ R6,L2
DJNZ R7,L1
RET
它是如何实现延时一秒的?DJNZ Rn,*为两个机器周期,MOV Rn,#*为一个机器周期。晶振为12MHz。这些都知道,不过就是想不通为什么要200*250*10。望高手指点迷津!Thanks! 展开
5个回答
展开全部
你可以粗略这样看,在上面的指令中,执行次数最多的是DJNZ rn,那么可以延时就是DJNZ指令执行时间。这里运用了嵌套,所以要×。
它的顺序是先执行DJNZ R5,L3 ;10次,执行DJNZ R6,L2 250次
但是当R6减1那么就赋予R5初值10,所以R5又得运行10次,而每减一次1都要重复10次。同理,执行R7减一要重复前面的DJNZ指令10×250次,所以就有了
10×250×200×2us=1s
它的顺序是先执行DJNZ R5,L3 ;10次,执行DJNZ R6,L2 250次
但是当R6减1那么就赋予R5初值10,所以R5又得运行10次,而每减一次1都要重复10次。同理,执行R7减一要重复前面的DJNZ指令10×250次,所以就有了
10×250×200×2us=1s

2025-08-04 广告
联系方式:13671592388上海实邦电子科技有限公司是一家专业电子产品开发与ODM/OEM/电子制造服务(EMS)企业,具有多年基于消费电子产品、工业自动化产品、机电控制产品的PCBA开发与生产经验,更有多年的单片机开发及工业控制电路设...
点击进入详情页
本回答由上海实邦电子科技提供
展开全部
这个其实不是实现200*250*10的 这个是实现200*250*10*2的 因为一条指令执行的时间是2纳秒 程序刚开始给R7副职200 R6副职 250 R5副职10 等到L3那条指令的时候是循环R5的 R5副职10 所以R5循环10次 然后顺序执行 循环R6 执行R6的时候跳到L2 重新给R5副职 然后再次R5循环10次 执行 DJNZ R6,L2 这句 因为已经减一了 所以R6 变成了 249 再次减一循环 R7也是这样 所以最后的时间就是200*250*10*2 也就是十秒的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
执行上面的指令要用(1+(1+R5)*R6)*R7=(1+(1+10)*250)*200个机械周期,
一个机械周期=12/晶振频率=1us
注意:DJNZ Rn,#data ;寄存器Rn减1,不为零则转移。
例:DJNZ R6,L2
每执行一次这条指令R6就减一,如果减一后R6不为零,则跳转到L2(即L2:MOV R5,#10 )处开始往下顺序执行
首先执行L2:MOV R5,#10
然后执行L3:DJNZ R5,L3
最后又遇到DJNZ R6,L2
又减一判断R6是否为零,不为零则跳转到L2:MOV R5,#10 继续往下执行。
这就是循环的原理
一个机械周期=12/晶振频率=1us
注意:DJNZ Rn,#data ;寄存器Rn减1,不为零则转移。
例:DJNZ R6,L2
每执行一次这条指令R6就减一,如果减一后R6不为零,则跳转到L2(即L2:MOV R5,#10 )处开始往下顺序执行
首先执行L2:MOV R5,#10
然后执行L3:DJNZ R5,L3
最后又遇到DJNZ R6,L2
又减一判断R6是否为零,不为零则跳转到L2:MOV R5,#10 继续往下执行。
这就是循环的原理
参考资料: 单片机原理与应用
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
主要是200*250*10是最简单的数字,另外需要说明的是,这只是一个近似值,实际延时时间大于1秒(约1.1秒)。如果要更精确的话,肯定不是这三个数字。
当R5=10,R6=202,R7=225,可以精确到0.35毫秒,精确度提高3个数量级。
当R5=10,R6=202,R7=225,可以精确到0.35毫秒,精确度提高3个数量级。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
DJNZ Rn,*为两个机器周期 12M的晶振执行一次就是2微秒,L3:DJNZ R5,L3
这个指令指行10次就是20微秒,这个延时程序所延的时间最后计算方法应该是200*250*20=1000000微秒,也就是1秒(应该是把MOV Rn,#*为一个机器周期忽略不计了)
这个指令指行10次就是20微秒,这个延时程序所延的时间最后计算方法应该是200*250*20=1000000微秒,也就是1秒(应该是把MOV Rn,#*为一个机器周期忽略不计了)
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询