分享

51单片机自学教程(5)

 梅竹修士 2012-07-18

51单片机自学教程(5)

[日期:2008-10-29 ] [来源:net 作者:佚名] [字体: (投递新闻)

定时/计数器
   在计算机实时应用时,如:在工业的自动化控制中,如要求在某一时刻打开某个设备,而在另一时刻关闭某个设备等操作,这时就要进行定时或计数。这些功能是由系统内的定时/计数器电路来实现的,而在MCS-51中已经集成在芯片内。
    89C51单片机中有两个可编程的定时/计数器,分别称之为T0T1,它有4种工作方式,其控制字、状态字均在特殊功能寄存器中,通过对它们的编程可方便地选择适当的工作方式;下面将详细地介绍:
    

   在单片机中有两个特殊功能寄存器与定时
/计数有关,这就是TMODTCON。在片内RAM区地址的高地址区,TMODTCON是名称,我们在写程序时就可以直接用这个名称来指定它们,当然也可以直接用它们的地址89H88H来指定它们。
特殊功能寄存器TMOD:定时器的工作方式控制寄存器,格式如下:

字节地址 B7 B6 B5 B4 B3 B2 B1 B0
GATE C/T M1 M0 GATE C/T M1 M0
88H
T1各工作方式控制字 T0各工作方式控制字


从上表我们可以看出,
TMOD被分成两部份,每部份4位。分别用于控制T1T0。具体工作方式下面介绍。
定时器控制寄存器TCON:格式如下


   从图
2中我们可以看出,TCON也被分成两部份,高4位用于定时/计数器,低4位则用于中断(我们暂不管)。主要介绍高4位的定时/计数器的作用;TF10是计数器溢出标志位,当T1或T0被允许计数以后,T1(T0)从初值开始加1计数,最高位产生溢出时,TF10)就由0变为1并向单片机的中央处理器CPU请求中断,当CPU响应时即转向相应中断子程序去执行,由CPU自身硬件清TF1(0)标志,当然也可由软件查询和清“0”标志。
    TR1(0)为计时计数的开停控制位,
计数脉冲要进入计数器还真不容易,看下图,就是TR1(0)要为1,且GATE要设置为“0”计数开关才能合上,脉冲才能过来。因此,TR1(0)称之为运行控制位,可用指令SETB来置位以启动计数器/定时器运行,用指令CLR来关闭定时/计数器的工作。
 

定时/计数器的四种工作方式

  1. 工作方式0

     

定时器/计数器的工作方式0称之为13位定时/计数方式。它由TL1/0)的低5位和TH0/1)的8位构成13位的计数器,此时TL1/0)的高3位未用。

  1. M1M0:定时/计数器一共有四种工作方式,就是用M1M0来控制的,2位正好是四种组合,对T0、T1要分别设定各控制字
    M1    M0 操作方式  功能描述
    0     0 方式0 13位定时器
    0     1 方式1 16位定时/计数器
    1     0 方式2 具有自动重装的8位定时/计数器
    1     1 方式3 定时0分2个8位定时器,

     

  2. C/T:前面我们说过,定时/计数器即可作定时用也可用计数用,到底作什么用,由我们根据需要自行决定,也说是决定权在我们。如果C/T0就是用作定时器(开关往上打),如果C/T1就是用作计数器(开关往下打)。顺便提一下:一个定时/计数器同一时刻要么作定时用,要么作计数用,不能同时用的初学者要注意。

     

  3. GATE:看上图,当我们选择了定时或计数工作方式后,定时/计数脉冲却不一定能到达计数器端,中间还有一个开关,显然这个开关不合上,计数脉冲就没法过去,那么开关什么时候过去呢?有两种情况:

     

    GATE=0,分析一下逻辑,GATE非后是1,进入或门,或门总是输出1,和或门的另一个输入端INT1无关,在这种情况下,开关的打开、合上只取决于TR1,只要TR11,开关就合上,计数脉冲得以畅通无阻,而如果TR1等于0则开关打开,计数脉冲无法通过,因此定时/计数是否工作,只取决于TR1

GATE=1,在此种情况下,计数脉冲通路上的开关不仅要由TR1来控制,而且还要受到INT1引脚的控制,只有TR11,且INT1引脚也是高电平,开关才合上,计数脉冲才得以通过。这个特性可以用来测量一个信号的高电平的宽度,想想看,怎么测?

  1. 工作方式1

     

    工作方式116位的定时/计数方式,将M1M0设为01即可,其它特性与工作方式0相同。

  2. 工作方式2

     

    在介绍这种式方式之前先让我们思考一个问题:比如我要计1000个数,可是16位的计数器要计到65536才满,怎么办呢?办法是用预置数,先在计数器里放上64536,再来1000个脉冲,不就行了吗?是的,但是计满了之后我们又该怎么办呢?要知道,计数总是不断重复的,当计满并溢出后,计数器里面的值变成了0(为什么,这时硬件自动清零),因此下一次将要计满65536后才会溢出,这可不符合要求,怎么办?当然办法很简单,就是每次一溢出时执行一段程序(要不然要溢出干吗?)可以在这段程序中做把预置数64536送入计数器中的事情。所以采用工作方式01都要在溢出后做一个重置预置数的工作,做工作当然就得要时间,一般来说这点时间不算什么,可是有一些场合我们还是要计较的(如串口通信等),所以就有了第三种工作方式自动再装入预置数的工作方式。此时M1M0=10。

    自动重装时TH0(1)赋初值(预置数)

    通常这种式作方式常用于波特率发生器(我们将在串行接口中讲解),用于这种用途时,定时器就是为了提供一个时间基准。计数溢出后不需要做事情,要做的仅仅只有一件,就是重新装入预置数,再开始计数,而且中间不要任何延迟,可见这个任务用工作方式2来完成是最好的了。

  3. 工作方式3

     

   这种式作方式之下,定时/计数器0被拆成2个独立的定时/计数器来用。其中,TL0可以构成8位的定时器或计数器的工作方式,而TH0则只能作为定时器来用。我们知道作定时、计数器来用,需要控制,计满后溢出需要有溢出标记,T0被分成两个来用,那就要两套控制及、溢出标记了,从何而来呢?TL0还是用原来的T0的标记,而TH0则借用T1的标记。如此T1不是无标记、控制可用了吗?是的。

一般情况处,只有在T1以工作方式2运行(当波特率发生器用)时,才让T0工作于方式3的。

定时器/计数器的定时/计数范围

工作方式013位定时/计数方式,因此,最多可以计到213次方,也就是8192次。

工作方式116位定时/计数方式,因此,最多可以计到216次方,也就是65536次。

工作方式2和工作方式3,都是8位的定时/计数方式,因此,最多可以计到28次方,也说是256次。

预置值计算:用最大计数量减去需要的计数次数即可。

例:流水线上一个包装是60盒,要求每到12盒就产生一个动作,用单片机的工作方式0来控制,应当预置多大的值呢?对了,就是8192-60=8132。当然设为计数时,需将C/T=1。

以上是计数,明白了这个道理,定时也是一样。
   

  初学者应多看相关书籍中的定时/中断部分,对个标志位的处理与应用要能理解,对你的应用开发有很大帮助的!!!,特别是在按键的消抖、延时等方面。

下面给出一个实验,网友只要烧写进89C51,放到实验板即可看到效果,然后在想????

 
定时器方式0的应用:
    应用定时器T1产生1MS的定时,并使P1。0输出周期的2MS方波,设晶震6MHZ。
    首先要计算T0的初始值,以定时器方式工作时,每一机器周期计数器加1,6MHZ晶震时的机器周期T=12/F=12/6*10的6次方,设初值为X,则:
      -X/2*=    X=7692

  以13位二进制数表示为:X=1111000001100B(从前算8位为F0H;)
  计算得:TH0初值为0F0H,TL0初值为0CH;

   因复位以后,TMOD、TCON初值为0,因此以定时器方式0工作时,初始化程序不必对TMOD重置0,我们查询TF0的状态来控制P1。0输出。在P1。0端得到周期为2MS的方波。

    程序清单:
    START:MOV TL0,#0CH;初值写入T0
         MOV TH0,#0F0H;
         SETB TR0;启动T0计数
    LOOP:JBC TF0,PTF0
          AJMP LOOP

    PTF0:MOV TL0,#0CH;计数初值重装
          MOV TH0,#0F0H;
          CPL  P1。0;P1。0求反
          AJMPN  LOOP

    您可以改变定时初值来改变方波的宽度。。。。。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多