打印

前两天遇到的一个很简单的问题,已解决,跟大家分享下。

[复制链接]
1790|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gyjdk0601|  楼主 | 2009-12-6 21:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  我是一名单片机初学者,最近单片机课程设计做一个多通道温度检测,用的温度传感器是DS18B20,前几天编的程序一直都调不出来。原来是延时有问题。DS18B20对延时有较严格的要求,否则就会用不起来。
  单片机精确延时我是用for循环写的,比如:
           for(j=6;j>0;j--);
Keil uVision翻译成的汇编语言如下:
C:0x0800    7F06     MOV      R7,#0x06 
C:0x0802    DFFE     DJNZ     R7,C:0802
由汇编语言可以算出它的延时时间。
但是我想当然的以为 for(j=0;j<6;j++);跟上面的for语言延时是一样的,结果却怎么也用不起来。后来看了一下反汇编,
       for(j=0;j<6;j++);      
C:0x0804    E4       CLR      A
C:0x0805    FF       MOV      R7,A
C:0x0806    0F       INC      R7
C:0x0807    BF06FC   CJNE     R7,#0x06,C:0806
原来C语言功能相同的语句,汇编成汇编语言的时候却完全不同,所以延长的时间也不同。
这些对于这里的牛人是很简单的问题,但是对于初学者来说可能稍不注意就可能犯错误。发贴出来只是希望跟我一样的初学者不要再犯我这个错误了,也希望在学习的过程中大家能把自己的经验共享出来,这样可以少走弯路,共同进步。

相关帖子

沙发
xwj| | 2009-12-6 22:32 | 只看该作者
呵呵,这个是早就该知道的。

恭喜LZ自己分析出问题的原因:)

使用特权

评论回复
板凳
yazhi68| | 2009-12-6 23:09 | 只看该作者
这应该恰恰是那么多的“水牯”们顶礼膜拜keil的重要原因之一吧。

使用特权

评论回复
地板
icecut| | 2009-12-6 23:10 | 只看该作者
while(--i)

使用特权

评论回复
5
hotpower| | 2009-12-7 06:55 | 只看该作者

单总线控制器

使用特权

评论回复
6
xlsbz| | 2009-12-7 12:20 | 只看该作者
这个问题简单么?

笑话!!当然是很难的!!..........

for(j=6;j>0;j--);
KEIL 这个函数在不同的优化级别下 延时时间不一定一样!尤其是哪个loop rotation

还有 在不同的cpu下也 不一定一样!

你找个arm 再找个单片机的试试看! 找个单片机的AT89C51和别的公司的单片机看看!试试看!

简单简单.......

知道了 什么都简单 不知道.........那可是真难......

使用特权

评论回复
7
gyjdk0601|  楼主 | 2009-12-7 15:46 | 只看该作者
谢谢6楼的回贴,让我又长见识了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

70

帖子

0

粉丝