快捷搜索:

C51单片机的几种常用延时程序设计

众所周知,c51在编程时很难掌握法度榜样运行的光阴,以是编写延时法度榜样时很难做到很正确,办理的要领有插入汇编语句,但总感觉汇编用起来不是那么顺手,还可以用准时器来做,但只是一个很小的延时法度榜样而已,不必小题大年夜作。着实法子照样有的,下面先容一下常用的几种延时法度榜样。

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-255,假如必要延时大年夜于255*2+5us,则可以继续调用几回函数。

2、ms的延时法度榜样

常用的一个函数:

void delayms(unsigned int x)

{

unsigned char i;

while(x--)

{

for(i=0;i《125;i++){;}

}

}

我们来看一下它的精度若何

x us

1 1024

5 5076

10 10141

50 50661

100 101311

可见,精度不“精”,跟着x值的增大年夜,延时偏差越大年夜,只得当在延时不要求很准确的地方应用。于是想到对法度榜样进行一些改动,想到125是不是取的太大年夜了,要是把它变为可变,不合的x值取值不合,就可以对延韶光阴进行一些修正,把法度榜样改为如下:

void delayms(unsigned int x,unsigned char y)

{

unsigned char j;

while(x--)

{

for(j=0;j }

}

对不合的延韶光阴取不合的y值,发明一个“怪”征象,当取y=123时,延韶光阴的偏差是一个固定值:

x us

1 1017

2 2016

5 5016

10 10016

50 50016

100 100016

除了x=1外,另外的偏差都为16us, 即不管x为多大年夜都只有16us的偏差,精度大年夜幅度前进,可以满意大年夜多半的必要!

滥觞;21ic

您可能还会对下面的文章感兴趣: