哪位单片机高手详细的告诉我一下:单片机中的延时程序的延时时间怎样计算的?比如,延迟 1S,2S等等

越详细越好

如果FOSC=12MHZ单片机,那么一个机器周期为12/12M=1us
如果是汇编语言的话:
L1:MOV R7,#100
L2:MOV R6,#100
L3:MOV R5,#50
DJNZ R5,$;此句两个机器周期也就是2T
DJNZ R6,L3
DJNZ R7,L2
RET
2T*50*100*100=1,000,000us(共一秒),这是粗略算法,有误差,但不是太大。追问

1、前三行我我明白,“DJNZ R5,$;此句两个机器周期也就是2T”这句为什么是两个机器周期啊?
2、DJNZ R6,L3此句表示的是不是这个意思:只要R6不为0就执行L3那行,为0 的话执行下一行,但是要是执行L3的话,不又是给R5赋值50吗?
麻烦大仙帮忙再解释一下,万分感谢

追答

1:两个机器周期是因为硬件就这么设计的,完成这条指令需要2个机器周期,同样,下面的两句DJNZ也是要用两个机器周期,但为了计算方便就舍去了,包括别的指令。
2:这个程序实现了三层循环,最内层的循环变量为R5,第二层是R6,最外层是R7.
循环的嵌套就是这样的,R6每减一次,R5就执行50次。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-11-26
比如
c51单片机的定时器1 是16位定时器
那么就是最大是65536
如果晶振频率是12MHZ
那么 最大定时时间是65.536毫秒
你定时一秒 就可以把定时器装初值 是15536
15536加到65536 正好是50毫秒
经过20次50毫秒 那么就是1s 了
第2个回答  2013-11-26
要看你用的是什么单片机,如果51单片机用汇编语言编写的话,延时可以算的很精确,如果是C语言的话,也不好算,是通过软件仿真的方式调试出来的。如果是AVR或者MSP430单片机的话IAR编译器有延时的子函数,把晶振频率在宏定义里面修改了,调用就可以了。而且也可以很精确。