推荐给好友 上一篇 | 下一篇
延时程序疑惑,欢迎大家来指教
字号: 小 中 大 | 打印 发布: 2007-3-07 10:17 作者: ceiwei 来源: 本站原创 查看: 165次
我用的是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 编辑]

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