众所周知,在编程时很难掌握程序运行的时间,所以编写时很难做到很精确,解决的方式有插入汇编语句,但总觉得汇编用起来不是那么顺手,还可以用定时器来做,但只是一个很小的延时程序而已,不必小题大作。其实办法还是有的,下面介绍一下常用的几种延时程序。
1、us级延时程序
常用的一个函数如下:
void delayus(unsigned char x)
{ while(--x) ;
}
生成的汇编代码为:
C:0x001C 7F0A MOV R7,#0x0A //2us
C:0x001E 12003E LCALL delayus(C:003E) // 2us
C:0x003E DFFE DJNZ R7,delayus(C:003E) //2x us
C:0x0040 22 RET // 1us
所以调用一次函数延时时间为 ( 2x+5 )us ,可以用来延时大于5us的时间。
注意的是x要是unsigned char 类型,且 --x 不能写成x-- ,否则汇编代码会有一大串:C:0x001C 7F02 MOV R7,#0x02
C:0x001E 120032 LCALL delayus(C:0032)
C:0x0032 AE07 MOV R6,0x07
C:0x0034 1F DEC R7
C:0x0035 EE MOV A,R6
C:0x0036 70FA JNZ delayus(C:0032)
C:0x0038 22 RET
因为汇编中的DJNZ 语句是先减一再判断的,和-xx的算法一致,所以--x和x--相差了很多。上述函数只适合x的范围是0&#