您当前的位置:五五电子网电子知识单片机-工控设备51单片机C语言精确延时计算实例! 正文
C语言精确延时计算实例!

C语言精确延时计算实例!

点击数:7703 次   录入时间:03-04 12:03:42   整理:http://www.55dianzi.com   51单片机

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单片机