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追问

没看懂 ?

51单片机使用汇编语言循环延迟时间怎么算?
第一步:在延时程序没行后边标注该指令执行的机器周期第二步:在机器周期后边乘以该指令循环的次数第三步:计算总共用的机器周期数第四步:计算总延时时间。 本回答由网友推荐 举报| 答案纠错 | 评论(4) 10 1 zhxiufan | 高级工程师 向TA咨询 擅长: IT 其他回答 ;===<延时子程序>===882usDELAY882: ;1...

单片机延时程序的延时时间怎么算的?
单片机的延时程序通过执行指令来达到延时效果,这个时间等于执行的指令需要的时间,而一个指令需要的时间叫做指令周期,这个时间等于若干个机器周期。

51单片机用汇编语言设计1S延时子程序,晶振为12MHz。 (麻烦附上详细计算...
如果单纯延时,可以用实验的办法,在keilc51里面仿真 void Delay1S(char n){ char i,j;n=n*4;for(;n;n--){ for(i=6;i;i++){ for(j=7;j;j++) \/\/ 一个循环约为1mS ;} } } 看编译后的汇编:C:0x0805 7D01 MOV R5,#0x06;j=1,1时钟 C:0x0807 0D INC ...

求单片机软件延时精确计算公式。C编程,for语句。好像与单片机、晶振有关...
}这个是用来微秒级延时的,他在不同的参数i下,延时时间分别为实际为(9*i+16)us,这些延时的实际时间一般可以通过开发环境keil C51中模拟一下,看下时钟就知道了。汇编好点的话也可以直接看汇编计算或者直接写汇编程序。 这时我们可以使用下面宏去调用上面的接口#define _delay_us(i) delay_us_fun...

一个51单片机软件延时问题
程序延时本来就是一个大概的数。这个也不是很准的。中间的for循环120次大约是962周期,加上每次循环前后的“准备工作”,再加上函数调用\/返回的时间,接近1Ms.实没为993个周期。如果把for循环次数改为121,则参数1的延时为1001个机器周期。

51单片机中,写个延时函数,延时1ms,该怎么写,为什么?
用汇编语言写可以精确计算,但有时想拼出整数的ms或10ms也不容易,计算方法如下图说明:而C语言靠经验和实验得来的,如下面程序 如果不准(与晶振频率有关),调K的值,,软件仿真查看,直到大致准确,想更精确用定时器 void delay(unsigned char i) \/\/延时程序{ unsigned char i,k;for(j=i;j...

请问51单片机定时器延时的调用是怎么调用的我有点不明白,谢谢
将汇编语言与C51结合起来,充分发挥各自的优势,无疑是单片机开发人员的最佳选择。 2.3 使用示波器确定延时时间 利用示波器来测定延时程序执行时间。方法如下:编写一个实现延时的函数,在该函数的开始置某个I\/O口线如P1.0为高电平,在函数的最后清P1.0为低电平。在主程序中循环调用该延时函数...

51单片机延时函数的问题。晶振是12MHz..需要延时1秒
很简单, for循环也是需要时间的.当你使用仿真的时候,通常可以在编译器里面查看这段代码的汇编指令.你可以看书它的用到了多少个汇编指令, 然后在你的芯片手册上查询,每一个汇编指令执行需要多少个最小指令周期. 最小指令周期才是你说的1um, 全部加起来, 你就知道你这句话用掉了多少个最小指令....

51单片机,求用汇编语言编写延时1小时的子程序,要精确到秒级别
共延时时间:3592.9s误差为7.1秒,如果再精确的话,再加一点延时就可以了。DELAY_20S: ;Total=19.960603s MOV R2,# ;1 DLY1:MOV R3,#200 ;1*200 DLY2:MOV R4,#248 ;1**200*200 DJNZ R4,$ ;2**248*200*200 DJNZ R3,DLY2 ;2*200*200 DJNZ R2,DLY1 ;2*...

单片机中的延时程序的延时时间怎样计算的?
允许误差范围在十几微秒以内[2],否则,芯片无法工作。用51汇编语言写程序时,这种问题很容易得到解决,而目前开发嵌入式系统软件的主流工具为C语言,用C51写延时程序时需要一些技巧[3]。因此,在多年单片机开发经验的基础上,介绍几种实用的编制精确延时程序和计算程序执行时间的方法 ...

相似回答