在单片机主程序设计中,我们常需要使用延时子程序。现在,就让我们来探讨下延时子程序的设计方法。
而延时子程序的设计中我们常利用循环程序、定时器/计数器来实现。
一、以循环程序为主体
循环程序顾名思义就是当满足一定条件时,程序反复执行。其主要构成为:
一般情况下单片机的时钟电路由XTAL1、XTAL2接石英晶体和电容构成。单片机的基本操作周期为机器周期(Tm),Tm=12/振荡频率。比如采用6MHz晶体振荡器,Tm=2us。
例:延时1ms
MOV R7,#250 ;赋初值 1Tm
LOOP:DJNZ R7,LOOP ;循环处理及控制 2Tm
RET ;程序返回 2Tm
注:DJNZ指令,R7先减一后不为零,跳到LOOP继续执行。故250*2*Tm=1000us=1ms,此Tm为2us。
类似的还有:
MOV R7,#50
LOOP: MUL AB
MUL AB
DJNZ R7,LOOP
RET
此程序也为延时1ms,读者自行验证。讲到这里不知大家是否发现以上计算的时间有问题。如例程序执行总共花了多少个Tm,实际为503个Tm,那么实际延时应为1.006ms。下面我们对程序进行改进:
MOV R7,#124 ;1Tm
LOOP: NOP ;1Tm
NOP ;1Tm
DJNZ R7,LOOP ;2Tm
NOP ;1Tm
RET ;2Tm
共124*(1+1+2)Tm+1Tm+1Tm+2Tm=500Tm。
当需要延时较长时间如100ms,我们则可以利用循环嵌套的方法实现。也就延时100ms,我们就调用99次延时1ms子程序。关于具体程序读者自行设计。
二、定时器/计数器为主体
51单片机内有两个16位定时器/计数器T0/T1,它们都有定时和对外部事件计数的功能。
定时器:对单片机的机器周期进行计数,计数器计满溢出时,发出中断申请信号。注意,定时时间的长短与系统时钟以及定时器初值有关。
计数器:通过P3.4/P3.5对外部输入脉冲计数,计数器计满溢出时,TF0/TF1置1,同时发出中断申请信号。
这里简要说明下,定时器的三种工作方式:
对计数器初值Y的计算公式:Y=X—计数值
对定时器初值Y的计算公式:Y=X—所需定时时间*(振动频率/12)
注意最大计数初值不是0FFFFH,而是0000H。
先写到这里......
文章评论(0条评论)
登录后参与讨论