[51]Delay延时的计算问题

[复制链接]
 楼主| pinggougou 发表于 2012-8-17 14:03 | 显示全部楼层 |阅读模式
  1. void DelayUsx2(unsigned int t)
  2. {
  3. while(--t);
  4. }

这是我写的代码,可是仿真时候把KEIL的频率设成12Mhz以后,t每减少1,消耗时间为8us,查它的汇编为

  1. C:0x001B EF MOV A,R7
  2. C:0x001C 1F DEC R7
  3. C:0x001D 7001 JNZ C:0020
  4. C:0x001F 1E DEC R6
  5. C:0x0020 14 DEC A
  6. C:0x0021 4E ORL A,R6
  7. C:0x0022 70F7 JNZ DelayUsx2(C:001B)
  8. 15: }


可是,我用别人写的例子,程序一样,仿真时12Mhz下,t每减少一,消耗时间却为2us,查其汇编却是:

  1. C:0x003F DFFE DJNZ R7,DelayUs2x(C:003F)
  2. 54: }


这是为什么呢?
同样的语句,汇编结果为什么不一样呢?这样导致了延时时间的计算也不一样啊!
求助原理解释!
 楼主| pinggougou 发表于 2012-8-17 14:49 | 显示全部楼层
你用的参数是“unsigned int” ,(整型,双字节 无符号)
人家用的参数是“unsigned char”  (字符型 单字节 无符号)
怎么能会一样呢!!你再仔细看看!!

c语言处理双字节时编译后生成的汇编语言:
1.低字节送ACC。
2.判断低字节(ACC)是否为0,
3.ACC不为0低字节减1。 若ACC为0,高字节减1、低字节减1。(2个指令)
4.判断高字节、低字节是否都为0,?(ORL   A,  R6)
5.不同时为0,转回(循环),若同时为0退出。(2个指令)
一共7个指令,8个周期。

c语言处理单字节时编译后生成的汇编语言只有一个指令:“djnz    r7,  $”, 2个周期

从这上面可以看出一点:不管你是学那种51单片机语言,汇编还是要懂一点的。
lwyjw 发表于 2012-8-17 18:17 | 显示全部楼层
有空必来,有来必言,有言必留,有留必看”理论的伟大旗帜
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

13

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部

2

主题

13

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部