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微秒
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-12-16
举例来说明吧:
delay:
mov r0,#10 ;1
delay1:
mov r1,#100 ;1*10
djnz r1,$ ;2*100*10
djnz r0,delay1 ;2*10
ret ;2
total=1+1*10+2*100*10+2*10+2=2033
time=total*1/(focse/12)
总结:
第一步:在延时程序没行后边标注该指令执行的机器周期
第二步:在机器周期后边乘以该指令循环的次数
第三步:计算总共用的机器周期数
第四步:计算总延时时间。本回答被网友采纳
第2个回答  2012-06-29
第一步:在延时程序没行后边标注该指令执行的机器周期
第二步:在机器周期后边乘以该指令循环的次数第三步:计算总共用的机器周期数第四步:计算总延时时间。 有的软件也能算、、、、追问

第三部和第四部能不能详细点?

追答

?????什么?

第3个回答  2012-06-28
;==========<延时子程序>=========882usDELAY882: ;1.085x((202x4)+5)=882MOV R7,#202DELAY882_A:NOPNOPDJNZ R7,DELAY882_ARET
;==========<延时子程序>========1000usDELAY1000: ;1.085x((229x4)+5)=999.285MOV R7,#229DELAY1000_A:NOPNOPDJNZ R7,DELAY1000_ARET
;==========<延时子程序>========2400usDELAY2400: ;1.085x((245x9)+5)=2397.85MOV R7,#245DELAY2400_A:NOPNOPNOPNOPNOPNOPNOPDJNZ R7,DELAY2400_ARET追问

没看懂 ?