原创 延时子程序设计

2009-10-8 17:26 2986 1 1 分类: MCU/ 嵌入式

在单片机主程序设计中,我们常需要使用延时子程序。现在,就让我们来探讨下延时子程序的设计方法。


而延时子程序的设计中我们常利用循环程序、定时器/计数器来实现。


一、以循环程序为主体


循环程序顾名思义就是当满足一定条件时,程序反复执行。其主要构成为:



  1. 循环初始化    控制变量赋初值;
  2. 循环处理        循环程序反复执行的部分;
  3. 循环修改        控制变量加一或减一,从而使程序不止无休止的执行下去;
  4. 循环结束        设立循环结束条件,判断循环是否结束;

一般情况下单片机的时钟电路由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,同时发出中断申请信号。


这里简要说明下,定时器的三种工作方式:



  1. 方式0     TLX的低5位与THX的8位构成13位计数器                       X="2" 13 
  2. 方式1     TLX与THX构成16位计数器                                               X="2"16
  3. 方式2     自动重装8位计数器,TLX溢出,THX内容自动送TL     X="2"8
  4. 方式3     定时器T0分成两个8位定时器;T1停止工作                    X="256"

对计数器初值Y的计算公式:Y=X—计数值


对定时器初值Y的计算公式:Y=X—所需定时时间*(振动频率/12)


注意最大计数初值不是0FFFFH,而是0000H。


先写到这里......

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
1
关闭 站长推荐上一条 /3 下一条