C:0x0802 9400 SUBB A,#0x00
C:0x0804 400B JC C:0811
C:0x0806 7ECA MOV R6,#0xCA
C:0x0808 7D51 MOV R5,#0x51
C:0x080A DDFE DJNZ R5,C:080A
C:0x080C DEFA DJNZ R6,C:0808
C:0x080E 1F DEC R7
C:0x080F 80EF SJMP delay(C:0800)
C:0x0811 22 RET
我们看看,R7的值是多少呢?在下面,主函数里面,赋值为0x0F,就是15。通过上面这段汇编程序段,我们用同样的方法来计算一下它的延时时间为(机器周期数请自己查阅书籍):
Td=[2×202×81+3×202+8]×15+3
=[32724+614]×15+3
=33338×15+3
=500073us=500.073ms
由此,我们可以得出一个公式为:
Td=[2×j×k+3×j+8]×i+3.....................②
下面是调用了void delay(unsigned char i)延时函数的main()函数机器汇编代码。
11: void main(void)
12: {
13: p10=1;
14: while(1)
15: {
16: p10=~p10;
17: delay(15);
18: }
C:0x081E D290 SETB p10(0x90.0)
C:0x0820 B290 CPL p10(0x90.0)
C:0x0822 7F0F MOV R7,#0x0F
C:0x0824 120800 LCALL delay(C:0800)
C:0x0827 80F7 SJMP C:0820
两种不同的写法,公式①、②造成的时间误差有1个毫秒多,在许多要求
精确延时的地方,我们就不得不注意这1个毫秒会造成什么样的后果。大家有兴趣,可以用同样的方式去验证和计算unsigned int型以及使用while语句和for语句组合起来的精确延时时间的计算。注意,其中for语句里面的循环控制语句,i>0,j>0,k>0,如果你把他们改写成i>=0,j>=0,k>=0,效果就不一样了,延时时间变的更长。
上一页 [1] [2]
本文关键字:C语言 51单片机,单片机-工控设备 - 51单片机