【C51】单片机定时器介绍

发布者:梦想启航最新更新时间:2020-05-17 来源: eefocus关键字:C51  单片机  定时器 手机看文章 扫描二维码
随时随地手机看文章

标准51架构的单片机有2个定时器 :T0  和  T1,他们2个的用法几乎一样。下面主要讲T0定时器的用法。


初步认知


定时器 和 计数器 都是单片机中同一个模块。他们的实质都是: 加法存储计数器。对于计数器很好理解,每来一个信号(信号从P3.4 或者P3.5输入),就加1,以此达到计数的目的。


对于定时器,每隔1个机器周期 加 1,假如(只是假如)一个机器周期为 1ms , 当加到1000时,我们就认为经过了1s,这就是定时器的原理。

 

加法存储寄存器THx & TLx

 

定时器依赖计数,需要把累计增加的那个量存储在某个地方,这就是THx和TLx(x 可以是 0 或者1)2个8位寄存器的的职责。

T0和T1都拥有一对加法存储寄存器。

T0 对应:TH0,TL0

T1 对应 : TH1 , TL1

 

在reg51.h头文件中我们发现这4个寄存器的定义:

 

sfr TL0  = 0x8A;              //  TL中的L是LOW的意思,代表低位,同理H代表HIGH高位。

sfr TL1  = 0x8B;

sfr TH0  = 0x8C;

sfr TH1  = 0x8D;

 


他们可以在程序中直接使用,复位值都是 0 。


当一直累加,使得他们保存不了太大的数据而发生溢出时,就会引发中断(后面讲中断)。并且对应的TFx溢出标志位会置为1,(没有溢出的情况下是0)。


如果不使用中断去处理溢出这个事件,那么我们就必须通过代码指令让TFx重置为 0 ,并让THx和TLx回归初始值,准备然后进入下一轮周期的计数。


....

if(TF0==1)    //如果T0 溢出了

{

     TF0=0;

     //重新初始化 TH0  和 TL0

     //说明过了一个溢出周期了

}

 

2个重要的寄存器:TMOD 和 TCON


复位时所有位全  为 0


TFx:溢出标志位。溢出时置1。正常为0。

 

TRx:计数器/定时器 启动停止控制位 。R是run的意思。  TR0 = 1  开启定时器0,为TR0 = 0 则停止。

 

低4位与外部中断相关,这里用不到,先不用看。


复位时所有位全  为 0


高4位是定时器T1相关的,低4位是T0 相关的。

以T0来说明。

 

GATE:门控制位

C/T:定时器/计数器切换位。 1为计数器模式, 0 为定时器模式。

 

②处 C/T = 0 表示为定时器模式,触发信号为①处的单片机内部时钟信号。(若②处CT = 1,则触发信号为Tn脚,信号从P3.4 或者P3.5输入单片机)

 

③处表明,信号能触发使加法计数器加1,还得受④处控制。不然时钟信号是不能让加法计数器累加的。 ④处这个是与门,TRn必须为1,表明我们要开启定时器。同时GATE为0,通过非门后为1,再通过或门,也是1,那么就让③处控制起来了。

 

(若GATE为1,那么,定时器的启动停止受 TRx和 INTx 共同控制。 )


于是我们需要:

TRn    为 1

GATE  为 0

INTn   为 X(X表示任意的意思,do not care)

 

加法存储寄存器的工作模式,是由M0和M1共同来决定的

M1 M0 模式

0 1 TH和TL2个组成16位计数存储器模式

1 0 TH负责初始化TL,TL计数。8位重装模式

0 0 THx的8位和TLx的位5组成13位加法计数器(很少用)

1 1 基本不用


时钟周期和机器周期

 

顺便提一下:标准C51的1个机器周期为12个时钟周期(增强型51单片机的机器周期会短一些,cc2530只有的机器周期只等于1个时钟周期)。


如果晶振的频率是11.0592MHz,那么时钟周期就是   1 / (11.0592x10^6) 秒   (1MHz = 10^6Hz)


那么,无论是定时器,还是计数器,每隔1个机器周期 ,加法存储器就1,代表时间经过了  12  x     1 / (11.0592x10^6) 秒。这就是我们衡量的基础依据。


为THx和TLx赋初始值

若TH0 和 TL0 以 16位 模式工作,那它的计数范围为   [0 , 65535 ]  ,  也就是累加 65536次发生溢出。 每累加一次是  12 / (11.0592x10^6) 秒。


那么从 0 累加到溢出 历时  ≈ 0.071s = 71ms 。


我们一般需要延时 10的整数倍ms,以便用倍数控制更长的延时时间。所以,我么要给 TH0 和  TL0赋一个初始值,使他们的溢出周期(TH0,TL0从初始值到溢出所用的时间)减少到 10ms,或者1ms。


就像一个瓶子,开始装了2/3,再来就只能装1/3就溢出了。

 

12 / (11.0592x10^6) s       -----     1   次



10x 10-3   s                        ------          x  次         (求出 x = 9216次 ,计数9216次后溢出)

 

65536 - 9216 = 56320  =  二进制( 11011100   00000000)

 

也就是  TH0 = 11011100 , TL0 = 00000000


代码例子验证


#include

typedef unsigned int uint; 


/**************函数声明******************/

void delay10ms(uint m) ;

void delay1ms(uint m) ;

/********************************/ 


/*****************************/

sbit LED = P0^0; 

/*****************************/


void main() 

     while(1)

     {

         LED = 1;

         delay10ms(100);   // delay1ms(1000)

         LED = 0;

         delay10ms(100);   // delay1ms(1000)

          

         

     }


void delay10ms(uint m)     //溢出周期为10ms

{


  /********************

   使用到的寄存器(位)

   

   TH0   TL0


   TCON:  TR0    TF0

   TMOD:


  ***********************/




    uint count =0;

    TMOD = 1;        //GATE = 0    C/T =0    M1 = 0  M0 = 1;  16位计数器

    TL0 = 0 ;

    TH0 =220 ;


    TR0 = 1;


    for(;count    {

         if(TF0 == 1)

         {

              TF0 = 0;

              TL0 = 0;

              TH0 = 220;


              ++count;


         }

    }


    TR0   =  0;   //关闭定时器

    

}


void delay1ms(uint m)       //溢出周期为1ms

{

     uint count=0;

     TMOD = 1;   //计时器0以16为存储计时器工作

     TH0 = 252 ;

     TL0 = 102;

     TR0 = 1;


         for(;count         {


          if(TF0==1)        //发生一次溢出,也就是过了1ms          

          {

               TF0=0;       //溢出位清零,取消警报

               TH0 = 252 ;  //重新配置初始值

               TL0 = 102;

               count++;     //溢出次数加1 ,溢出1次是1ms,溢出t次就是t ms          

           }



        }

      

     TR0 = 0;


}


8位重装模式


8位重装模式是:只有TL0计数,TH0不变,他只为TL0提供初始值。当TL计数溢出后,TF0就为1,如果继续工作,TH0就把自己的值赋给TL0,再开始计数,如此循环下去。


上面些写了一个毫秒级的delay函数,下面用8位重装模式写一个控制微秒级别的函数。并控制P0.0的LED实现呼吸灯。


计算方法和上面一样,大家可以自己算


#include

typedef unsigned int uint;


# define TRUE 1

# define FALSE 0


/**************函数声明******************/

void delay1ms(uint t);

/********************************/


sbit LED = P0^0;


void main()

{


    int step = 0;

    int again  = FALSE;


    while(1)

    {

        

        LED = again?0:1;

        delay1ms(step);


        LED = again?1:0;;

        delay1ms((500-step));


        step+=1;


        if(step>500)

        {

             step =0;

             again = !again;

        }


     }


}


void delay1ms(uint m)        //延时t微秒

{

     int count=0;

     TMOD = 2;     

     TH0= 255 ;    

     TL0= 255; 

     TR0=1;


     for(;count!=m;)

     {

        

        if(TF0==1)

        {

             TF0=0;  //自动重装

             count++;

        }

          

     }

     TR0=0;

    

}


值得注意的地方

我们应该尽量让溢出周期 越长越好。溢出周期为10ms 的优于 1ms 的。因为,在同样的延时时间下,如100ms,溢出周期为10ms 的 只需要溢出10次,为TH0 和 TL0重新赋值10次,而溢出周期为1ms的要溢出100次,为TH0 和 TL0重新赋值100次。减少溢出次数和赋值次数,可以减轻单片机的负担,提高定时的准确性。

关键字:C51  单片机  定时器 引用地址:【C51】单片机定时器介绍

上一篇:C51联盟 —— 外部中断+定时器中断
下一篇:【51单片机实验】INT0中断计数

推荐阅读最新更新时间:2024-11-08 12:49

Microchip全新PIC和AVR MCU,提高闭环控制性能
从水池水泵到空气净化装置,闭环控制都是嵌入式系统最基本的任务之一。通过改进架构,PIC和AVR 8位单片机(MCU) 针对闭环控制进行了优化,让系统能够降低中央处理器 (CPU) 的负载,从而管理更多任务并实现节能。为了帮助设计师最大限度提高系统的性能和效率,Microchip Technology Inc.(美国微芯科技公司)日前推出了全新的PIC18 Q10和ATtiny1607系列产品,可提供多个独立于内核的智能外设 (CIP),简化开发过程,并迅速响应系统事件。 PIC18 Q10 和 ATtiny1607 MCU非常适用于使用闭环控制的应用,其主要优势是CIP能够独立管理任务,降低CPU的处理量。借助基于硬件的CIP
[半导体设计/制造]
基于HX711数显称重仪的设计
本文设计的数显称重仪是基于电阻应变式传感器、以单片机为控制核心的称重控制显示系统,测量范围为0-10kg,测量精度±2g,液晶屏显示测量数据,同时可将多次测量数据通过串口送计算机显示。该系统具有精度高、性能稳定、操作简便等特点。称重仪设计框图如下图1所示: 图1 称重仪设计框图 1、硬件电路设计 1.1、称重传感器 电阻应变式称重传感器由电阻应变片、弹性体和检测电路等几个主要部分组成。弹性体在外力作用下产生弹性变形,使粘贴在他表面的电阻应变片也随同产生变形,电阻应变片变形后,它的阻值将发生变化(增大或减小),再经相应的测量电路把这一电阻变化转换为电信号(电压或电流),从而完成了将外力变换为电信号的过程。 检测电路如图2
[单片机]
基于HX711数显称重仪的设计
采用C51与插拔式FLASH闪存设计无纸记录仪
ATMEL公司推出的带有看门狗功能的单片机AT89C55WD带有20K的程序存储器,是8051系列中一款较为先进的产品,其看门狗功能可以大大提高产品的稳定性,大容量的内部程序存储器可以容纳功能丰富的软件。   以往的许多无纸记录仪均采用3.5英寸软盘作为数据存贮介质,但软盘存贮的可靠性差、存储容量有限、成本较高等诸多缺点实在难以克服。   作为一种高科技的非易失性存储设备,FLASH闪存首先在数码相机、PDA、移动电话等数字产品当中得到了应用,随着工艺的进步和价格的下降,逐步向其他应用领域扩展,其容量大、功耗低、速度快、不易受损等优点正受到人们越来越多的青睐,而且最大的好处是,随着技术水平的进步,FLASH闪存的容量也在不断
[测试测量]
STM32单片机中C语言操作寄存器的原理
映射的概念 存储器本身不具有地址信息,它的地址是由芯片厂商或用户分配,给存储器分配地址的过程就称为存储器映射,如下图所示的4GB空间(从block0-block7每个block512M)。在梳理STM32芯片的内部架构中提到的被控单元FLASH、RAM、FSMC和APB等功能部件共同排列在这4GB的地址空间内。在编程的时候,可以通过他们的地址找到他们,然后通过C语言对它们进行数据的读和写操作。 存储器映射 在这 4GB 的地址空间中,ARM 已经粗线条的平均分成了 8 个块,每块 512MB,每个块也都规定了用途,具体分类见如下表格。在这 8 个 Block 里面,有 3 个块非常重要,也是我们最关心的三个块。Block0
[单片机]
STM32中定时器的时钟源
STM32中有多达8个定时器,其中TIM1和TIM8是能够产生三对PWM互补输出的高级定时器,常用于三相电机的驱动,它们的时钟由APB2的输出产生。其它6个为普通定时器,时钟由APB1的输出产生。 下图是STM32参考手册上时钟分配图中,有关定时器时钟部分的截图: 从图中可以看出,定时器的时钟不是直接来自APB1或APB2,而是来自于输入为APB1或APB2的一个倍频器,图中的蓝色部分。 下面以定时器2~7的时钟说明这个倍频器的作用:当APB1的预分频系数为1时,这个倍频器不起作用,定时器的时钟频率等于APB1的频率;当 APB1的预分频系数为其它数值(即预分频系数为2、4、8或16)时,这个倍频器起作用,定时器
[单片机]
STM32中<font color='red'>定时器</font>的时钟源
STM32f4---定时器中断实验代码
我们来看看我们的time.c文件。timer.c文件代码如下: //通用定时器 3中断初始化 //arr:自动重装值。 psc:时钟预分频数 //定时器溢出时间计算方法:Tout=((arr+1)*(psc+1))/Ft us. //Ft=定时器工作频率,单位:Mhz //这里使用的是定时器 3! void TIM3_Int_Init(u16 arr,u16 psc) { TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TI
[单片机]
16位Σ-Δ A/D转换器AD7705与微控制器的接口设计
   AD7705是 AD公司新推出的16位Σ-ΔA/D转换器。器件包括由缓冲器和增益可编程放大器(PGA)组成的前端模拟调节电路,Σ-Δ调制器,可编程数字滤波器等部件。能直接将传感器测量到的多路微小信号进行A/D转换。这种器件还具有高分辨率、宽动态范围、自校准、优良的抗噪声性能以及低电压低功耗等特点,非常适合仪表测量、工业控制等领域的应用。它采用三线串行接口,有两个全差分输入通道,能达到0.003%非线性的16位无误码数据输出,其增益和数据输出更新率均可编程设定,还可选择输入模拟缓冲器,以及自校准和系统校准方式。工作电压3 V或5 V。3 V电压时,最大功耗为1 mW,等待模式下电源电流仅为8 μA。    1 内部结构
[模拟电子]
XMEGA为8位MCU重新定义系统性能
  爱特梅尔现已推出AVR® XMEGA™ 微控制器系列,这是其AVR微控制器系列的重要新成员。AVR XMEGA的系统性能扩展了8位微控制器的市场领域。XMEGA采用了第二代picoPower™ 技术,是唯一真正使用1.6V工作电压的闪存微控制器。该系列器件的功耗超低,并具有快速12位模拟功能、一个DMA控制器、一个创新的事件系统,以及一个加密引擎,全部都无需占用CPU资源,能够最大限度地减少功耗和提高系统性能。   爱特梅尔AVR产品市场总监Ingar Fredriksen称:“通过先进的AVR CPU,爱特梅尔能够同时服务于8位和16位微控制器市场。由于旧式8位和16位CPU无法满足客户的要求,许多竞争对手被迫提供32位产
[新品]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved