EM78系列单片机--延迟子程序的编写
扫描二维码
随时随地手机看文章
在許多程序设计的場合,我們時常会利用到时间延迟子程序,接下来就介紹一个可以控制延迟时间的延迟子程序。
开下面是利用发工具E8-ICE来演示的一个精确的控制延迟时间的程序,选择使用石英振荡器,可以精确的算准延迟时间,时间可以到nanosecond(十亿分之一秒),很神奇。
LP_CNT0==0X20;定义。
LP_CNT1==0X21
MOV A,@2;A=2。
MOV LP_CNT0,A;设定延迟寄存器0(LP_CNT0)=2
CALLP0_DLY;呼叫时间延迟子程序。
P0_DLY:
NOP;调节延迟时间。
MOV A,@200;设定A=200。
MOV LP_CNT1,A;设定寄存器LP_CNT1=200。
P0_LP:
NOP;调节延迟时间。
NOP;调节延迟时间。
NOP;调节延迟时间。
DJZLP_CNT1;递減LP_CNT1,为0就跳过下一行
JMPP0_LP;循环。
DJZLP_CNT0;递減LP_CNT0,为0就跳过下一行
JMPP0_DLY;循环。
RET;返回主程序。
假设用户所使用的开发工具是E8-ICE,而且所采用的振荡器为石英振荡(4MHz),並选择指令执行周期为1Cycle,2CLOCk。这時每执行一个指令的时间为0.5uS.
用户可以看出在程序中用了两个寄存器来计数(LP_CNT0、LPCNT1),另外也使用了两个循环(P0_DLY、P0_LP),其中在P0_LP中有5个指令,所以在P0_LP这个循环中,执行了有1000个指令。
5X200=1000P0_LP循环总共执行指令数目。
5+1000=1005P0_DLY循环总共执行指令数目。
1005X2=2010
2010+1+1=2012延迟程序总共执行指令数目
在整个P0_DLY循环中就有2012个指令,每个指令的执行时间为0.5us。
2012(instructions)x0.5(us/instruction)=1.006ms
所以用户可以精确的计算出延迟的时间,用户可以在LP_CNT0设定不同的值,如此可以有各种不同的延迟时间。
l例:设计一个延迟时间为2ms的程序。
只要在上述程序中在呼叫P0_DEL延迟子程序之前,將LP_CNT0设成4就可以了。
MOV A,@4
MOV LP_CNT0,A
CALLP0_DLY
其余不变。
1005X4=4020。
4020+1+1=4022。
4022(instructions)X0.5(us)=2.011ms