我是一名单片机初学者,最近单片机课程设计做一个多通道温度检测,用的温度传感器是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语言功能相同的语句,汇编成汇编语言的时候却完全不同,所以延长的时间也不同。
这些对于这里的牛人是很简单的问题,但是对于初学者来说可能稍不注意就可能犯错误。发贴出来只是希望跟我一样的初学者不要再犯我这个错误了,也希望在学习的过程中大家能把自己的经验共享出来,这样可以少走弯路,共同进步。 |