2008年7月23日星期三

C51 精细控制延时(非定时器方式)

参考了一些文章,自己又实验了下,做了C与keil生成汇编的对比,算是有了初步了解:
最根本的问题还是在于C的循环语句在keil中不同的编译处理。从keil的汇编处理来看,最终的选择仍然是 while 语句,包括 do...while,其实不建议使用 for 循环的主要原因还是多了个变量,导致需要反复操作寄存器、累加器。不过前者while并不适合循环体内包含其他语句,最佳的选择是后者: do...while

#include
#include <intrins.h> //用于 NOP

例一:适用于最小的延迟,
void delayus(unsigned char us){
while(--us);
C:0x00CF DFFE DJNZ R7,delayus(C:00CF)
}
例二:在循环中加入 NOP 指令,获得稍长的延时。
void delayus(unsigned char us){
do{
_nop_();
C:0x00CF 00 NOP
}while(--us);
C:0x00D0 DFFD DJNZ R7,delayus(C:00CF)
}

基本就是这样,需要注意的就是循环次数的数据类型。尤其是较长的延迟。

没有评论: