打印

[51]Delay延时的计算问题

[复制链接]
2511|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
pinggougou|  楼主 | 2012-8-17 14:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
void DelayUsx2(unsigned int t)
{
while(--t);
}

这是我写的代码,可是仿真时候把KEIL的频率设成12Mhz以后,t每减少1,消耗时间为8us,查它的汇编为
 
C:0x001B EF MOV A,R7
C:0x001C 1F DEC R7
C:0x001D 7001 JNZ C:0020
C:0x001F 1E DEC R6
C:0x0020 14 DEC A
C:0x0021 4E ORL A,R6
C:0x0022 70F7 JNZ DelayUsx2(C:001B)
15: }


可是,我用别人写的例子,程序一样,仿真时12Mhz下,t每减少一,消耗时间却为2us,查其汇编却是:
 
C:0x003F DFFE DJNZ R7,DelayUs2x(C:003F)
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

粉丝