单片机延时时间程序怎么编程

单片机延时时间程序怎么编程,第1张

举一个例子来说明吧.比如你要编一个延时50毫知毁秒的子程序,那么步骤如下:

1、查看一下你的硬件环境,比如晶振燃差大小,CPU型号,不用CPU指令机器周期是不一样的。

2、计算延时需要的机器搭段备周期。比如采用12M晶振,CPU采用通用8051,那么一个机器周期为1US,50毫秒为50*1000=50000US,需要的机器周期=50000/1=50000。

3、试编程,如下:

程序代码指令时间 总共时间

DELAY50MS: 2 2

MOV R7,#A 1 1

DELAY1:

MOV R6,#B 1 1*A

DJNZ R6,$ 2 2*B*A

DJNZ R7,DELAY1 2 2*A

RET 2 2

所以总时间=2+1+A+2*A*B+2*A+2=5+3A+2AB

4、凑数求A、B

根据2、3得到如下式子:

50000=5+3A+2AB

可以有很多种结果,不过最好是以A尽可能小,B尽可能大为原则,当然不能大于255.

我现在凑出A=110,B=225;那么总延时时间=5+3*110+2*110*225=49835。还差165US

5、补齐不够时间

再加一个小循环就OK了,呵呵如下:

MOV R6,#C

DJNZ R6,$

会算了吧,2*C+1=165;所以C=82。

现在完整的延时程序出来了,如下:

DELAY50MS: 2 2

MOV R7,#110 1 1

DELAY1:

MOV R6,#225 1 1*110

DJNZ R6,$ 2 2*225*110

DJNZ R7,DELAY1 2 2*110

MOV R6,#821 1

DJNZ R6,$22*82

RET 2 2

很圆满:总的时间50000微妙,也就是50毫秒。这种方式编程,在该硬件环境下可以保证最大误差为1微妙。

在单片机中,要延时程序尽量准确,可以:

-延时循环尽量简单,尽量少开变量比如:

Delay(unsigned int uDelay) { while ( uDelay-- )}

-在主程序中用一个GPIO测试,如:

SetGPIOHigh()Delay(1000)SetGPIOLOW()

-用示波器测量该GPIO波形及频率

-调整Delay函数的调用值,大迹基可滚谨以用变量,在调试时实时修改变量值,找到延时1毫秒的值,把Delay函数改名为Delay1ms,之后调用这个函数完成精确延时

-其他的延时州慧函数也可以类似上述方法完成,但记住在调试和实际使用时要用同样的CPU主频。

-最精确的还是用定时器中断程序计时

延时方法很多,用定时/计数比较方便也比较精确。如果用软件延时,则可以用循环(多重、嵌套都行)。根据时间长短确定循环次数,力求精确。时间计算以机器的晶振频率为基准,算出各指令的运行时间(每条指令运行时间乘所循环的次数就是该指令的全部运行时间),所有指令运行时间的和就是延时的时间。

比如:设晶振频率为薯丛12MHz 则每机器周期为1us

513us延时程序为

DL513: MOV R7,#0FFH ;1us

DJNZ R7,$;2us *255=510us

RET ;2us

延时时间为1+510+2=513us

延时时间较长则可以用多重循环(以四重枯或循环为例),如:

KKKK0:MOV R2,#XX ;1us

KKKK1:MOV R3,#LL ;1us*XX

KKKK2:MOV R4,#NN ;没手伍1us*XX*LL

KKKK3:MOV R5,#MM ;1us*XX*LL*NN

DJNZ R5,$ ;2us *XX*LL*NN*MM

DJNZ R4,KKKK3 ;2us *XX*LL*NN

DJNZ R3,KKKK2 ;2us *XX*LL

DJNZ R2,KKKK1 ;2us *XX

RET ;2us

延时时间为1us+1us*XX+1us*XX*LL+1us*XX*LL*NN+2us *XX*LL*NN*MM+2us *XX*LL*NN+2us *XX*LL+2us *XX+2us

适当确定四个循环次数XX、LL、NN、MM就能得到准确的延时时间。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8230186.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-14
下一篇 2023-04-14

发表评论

登录后才能评论

评论列表(0条)

保存