推荐给好友 上一篇 | 下一篇

延时程序疑惑,欢迎大家来指教


我用的是keil和proteus联结构建的单片机实验系统,晶震是12MHz,根据网上流传的<<关于C51精确延时问题>>中的介绍,以及其他资料,延时程序的实际精度应该根根据其编译后的汇编码.但是我却发现我的汇编指令乘所花机器周期后的时间应该大于理论时间
以下是我编写的一个流水灯程序:
#include"reg51.h"
#include"INTRINS.H"
#define uchar unsigned char
#define uint unsigned int
void d1(unsigned int count )
{unsigned int i;
  
for(count;count>0;count--)
   for(i=0;i<124;i++)
   ;}
main()
  {
   unsigned char k=0xfe;
   while(1)
{
   P1=k;
   k=_crol_(k,1);
   d1(1000);
}
}
这个程序没有问题,提出其中的延时部分:
void d1(unsigned int count )
{unsigned int i;
  
for(count;count>0;count--)
   for(i=0;i<124;i++)
   ;}
其中for(i=0;i<124;i++)这个语句是个网上流传的经典语句,大家都知道其大约延时时间是1ms,可是我编译后有个疑问:我按下DEBUG后出来的汇编码如下:
C:0x0000    02003B   LJMP     STARTUP1(C:003B)
     6: void d1(unsigned int count )
     7: {unsigned int i;
     8:   
     9: for(count;count>0;count--)
C:0x0003    D3       SETB     C
C:0x0004    EF       MOV      A,R7
C:0x0005    9400     SUBB     A,#0x00
C:0x0007    EE       MOV      A,R6
C:0x0008    9400     SUBB     A,#0x00
C:0x000A    4015     JC       C:0021
    10:    for(i=0;i<124;i++)
C:0x000C    E4       CLR      A
C:0x000D    FD       MOV      R5,A
C:0x000E    FC       MOV      R4,A
C:0x000F    0D       INC      R5
C:0x0010    BD0001   CJNE     R5,#0x00,C:0014
C:0x0013    0C       INC      R4
C:0x0014    ED       MOV      A,R5
C:0x0015    647C     XRL      A,#0x7C
C:0x0017    4C       ORL      A,R4
C:0x0018    70F5     JNZ      C:000F
C:0x001A    EF       MOV      A,R7
C:0x001B    1F       DEC      R7
C:0x001C    70E5     JNZ      d1(C:0003)
C:0x001E    1E       DEC      R6
C:0x001F    80E2     SJMP     d1(C:0003)
    11:    ;}
C:0x0021    22       RET      
000C到0x001F中间有15条汇编指令,按照每条指令2个机器周期,那么是否执行124次所花的时间为2*15*124=3720us大于1ms,我想应该是我的理解有错误,又不知道错在什么地方,设count=1000,在用表测过,没个灯灭的时间大约为1ms,还请各位指教一下.谢谢.
有关精确延时请看我的转贴http://www.proteus.com.cn/thread-1628-1-1.html.

[本帖最后由 ceiwei 于 2007-2-22 18:14 编辑]


查看全部1条评论

最新评论

  • 删除 引用 Guest (2008-6-21 16:18:43, 评分: 0 )

    不是那样做的
 

评分:0

我来说两句

seccode