0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

51单片机定时器和计数器

汽车电子技术 来源:嵌入式悦翔园 作者:JamesBin 2023-02-17 14:51 次阅读

8051单片机内部有两个定时/计数器T0及T1,具有定时和计数两种功能。T0及T1在计数过程中不需要CPU参与,也不影响CPU的其他工作。当计数溢出后,定时/计数器给出中断信号,申请CPU停止当前的工作,去处理预先设定的中断事件。

一、T1内部结构

图片

定时器工作模式:对内部时钟信号计数。由于时钟频率是定值,所以可根据计数值计算出定时时间。

计数器工作模式:是对加在T1(P3.5)引脚上的外部脉冲进行计数。

二、计数功能

计数器用于统计从TO(P3.4)和Tl(P3.5)两个引脚输入脉冲的负跳变数量。负跳变是指前一个机器周期采样为高电平,后一个机器周期为低电平。每输入一个脉冲负跳变,计数器加1。

输入脉冲的高电平与低电平至少应保持一个机器周期时间,以确保正确采样,因此输入脉冲的频率最高为单片机内部脉冲频率的一半。如果内部脉冲频率为1 MHZ,则最高计数频率为0.5 MHz。

三、定时功能

定时功能是单片机通过对内部机器脉冲信号计数实现的,计数值乘以机器周期就是相应的时间。例如,如果单片机采用12 MHz的晶振,则机器内部脉冲频率为1 MHz,则机器周期为1us,若共计数1000,则用时为1ms时间。

图片

图片

四、工作方式

工作方式寄存器TMOD

工作方式寄存器TMOD用于控制定时/计数器的工作方式和工作模式,长度为一个字节,只能按字节整体赋值。

图片

(1)Ml和M0用于设置TO(T1)的工作方式。

图片

图片

(2)C/T用于设置TRO(TR1)是工作于计数器或定时器模式。

C/T—计数器模式和定时器模式选择位

0:定时器工作模式,对单片机的晶体振荡器12分频后的脉冲进行计数。

1:计数器工作模式,计数器对外部输入引脚T0(P3.4)或T1(P3.5)的外部脉冲(负跳变)计数。

图片

(3)GATE(门控制位)用于设置TO(T1)的启动方式。

GATE—门控位。

0:仅由运行控制位TRx(x =0,1)来控制定时器/计数器运行。

1:用外中断引脚INT0(或INT1 )上的电平与运行控制位TRx共同来控制定时器/计数器运行。

图片

例:设定时器1为定时工作方式,按方式2工作,定时器0为计数方式,按方式1工作,均由程序单独控制启动和停止,请给出TMOD控制字。

解:

定时器1做定时器使用则D6=0;按方式2工作则D5=1,D4=0;
由程序单独控制启停则D7=0 。
定时器0做计数器使用则D2=1;按方式1工作则D0=0,D1=1;
由程序单独控制启停则D3=0。
因此命令字TMOD的值应为00100101B,即25H

图片

定时器控制寄存器TCON (Timer controller)

TCON也是8位寄存器,与TMOD不同的是它可按位单独赋值,其各位的意义见下表。

图片

1、TF1、TF0—计数溢出标志位。

当计数器计数溢出时,该位置“1”。

使用中断方式时,此位作为中断请求标志位,标志位由硬件自动清“0”。使用查询方式时,应注意查询有效后使用软件及时将该位清“0”。

2、TR1、TR0—计数运行控制位。

TR1位(或TR0位)=1,启动定时器/计数器工作的必要条件。

TR1位(或TR0位)=0,停止定时器/计数器工作。

4.1、工作方式0

方式0是13位的定时/计数器,它由TL的低5位和TH的8位构成。

图片

4.2、工作方式1

方式1是16位的定时/计数器,由TH的8位和TL的8位构成。方式0和方式1的工作原理基本相同。

图片

方式0和方式1的特点:

T1启动后,在TL1和TH1中存储的计数初值基础上进行加“1”计数,直至溢出。溢出时T1寄存器被清零,TF1被置位,并申请中断。此后,若T1重新启动,则从零重新开始计数。若希望T1从某一数值开始计数,则应给计数器赋初值。

若所需计数长度为N,则计数初值X=2M-N(1≤N≤2M),其中当工作于方式0时,M=13,当工作于方式1时,M=16。在为计数器赋初值时,应将初值拆成高低两部分字节,分别送入TL1和TH1。

实例:欲采用8051单片机控制8个LED同时以1s为周期闪烁,设计电路原理图并编写程序。

图片

设置定时/计数器的过程:

1)先初始化工作方式寄存器TMOD

2)为定时/计数器赋初值

3)通过控制寄存器TCON中的TRO或TRl实现启动或停止。

#include                  //  将8051单片机头文件包含到文件中
main(void )
{
    unsigned char counter;   //设置无符号字符型变量,存储定时器中断次数。
     TMOD=0x01; //设T0为定时模式,由TR0控制启动和停止,且工作于方式1
  TH0=(65536-46083)/256;         //初始化T0的高8位
  TL0=(65536-46083)%256;        //初始化T0的低8位
  TF0=0;                       //初始化定时器溢出标志
  P0=0xff;                      //关闭LED
    counter=0;                    //从0开始计数  
    TR0=1;                       //启动定时器0
   while(1)
    {
     while(TF0==1)              //如果定时器溢出
    {
          counter++;              //计时次数加1
          if(counter==20)          //计时时间达到1s
           {
             P0=~P0;                // P0所有位取反,使LED闪烁              
             counter=0;              //重新从0开始计数
           }
            TH0=(65536-46083)/256;  //重新初始化T0的高8位
            TL0=(65536-46083)%256; //重新初始化T0的低8位
            TF0=0;                 //重新初始化定时器溢出标志
       }
    }
}

方式0和方式1的特点:

T1启动后,在TL1和TH1中存储的计数初值基础上进行加“1”计数,直至溢出。溢出时T1寄存器被清零,TF1被置位,并申请中断。此后,若T1重新启动,则从零重新开始计数。若希望T1从某一数值开始计数,则应给计数器赋初值。

若所需计数长度为N,则计数初值X=2M-N(1≤N≤2M),其中当工作于方式0时,M=13,当工作于方式1时,M=16。在为计数器赋初值时,应将初值拆成高低两部分字节,分别送入TL1和TH1。

实例:欲采用8051单片机控制8个LED同时以1s为周期闪烁,设计电路原理图并编写程序。

图片

设置定时/计数器的过程:

1)先初始化工作方式寄存器TMOD

2)为定时/计数器赋初值

3)通过控制寄存器TCON中的TRO或TRl实现启动或停止。

#include                  //  将8051单片机头文件包含到文件中
main(void )
{
    unsigned char counter;   //设置无符号字符型变量,存储定时器中断次数。
     TMOD=0x01; //设T0为定时模式,由TR0控制启动和停止,且工作于方式1
  TH0=(65536-46083)/256;         //初始化T0的高8位
  TL0=(65536-46083)%256;        //初始化T0的低8位
  TF0=0;                       //初始化定时器溢出标志
  P0=0xff;                      //关闭LED
    counter=0;                    //从0开始计数  
    TR0=1;                       //启动定时器0
   while(1)
    {
     while(TF0==1)              //如果定时器溢出
    {
          counter++;              //计时次数加1
          if(counter==20)          //计时时间达到1s
           {
             P0=~P0;                // P0所有位取反,使LED闪烁              
             counter=0;              //重新从0开始计数
           }
            TH0=(65536-46083)/256;  //重新初始化T0的高8位
            TL0=(65536-46083)%256; //重新初始化T0的低8位
            TF0=0;                 //重新初始化定时器溢出标志
       }
    }

4.3、工作方式2

方式2的特点是能自动加载计数初值。16位计数器被分为两部分,以TL0作为计数器,以TH0作为存储器。初始化时把计数初值分别加载至TL0和TH0中,当计数溢出时,由存储器TH0自动给计数器TL0加载计数初值。若所需计数长度为N,则计数初值X=28-N(1≤N≤256)。

图片

实例:下图是产品包装生产线的计数系统,每个产品经过计数装置时由机械杆碰合按键S1一次。当第一次计满一包(5个)则D1亮,计满第二包则D2亮…,计满第八包则D1~D8全亮,八包包装成一箱,此后重复以上过程。编写程序实现此功能。

图片

#include            //  包含51单片机寄存器定义的头文件
unsigned char counter;      //计数初值
main(void )
{     
   TMOD=0x60;                //使用T1的工作方式2
  TH1=256-5;              // T1的高8位赋初值
  TL1=256-5;              // T1的低8位赋初值  
  counter=0;  
  TR1=1;                    //启动T1
  while(1)               
    {
     while(TF1==1)           //如果计满
        {
            TF1=0;             //计数器溢出后,将TF1清0
            counter++;         //计数加1
    switch (counter)  //检查中断计数值
      {
                case 1: P0=0xfe; break;  //则第1个灯亮
                case 2: P0=0xfd; break;  //第2个灯亮
                case 3: P0=0xfb; break;  //第3个灯亮
                case 4: P0=0xf7; break;  //第4个灯亮
                case 5: P0=0xef; break; //第5个灯亮
                case 6: P0=0xdf; break; //第6个灯亮
                case 7: P0=0xbf; break; //第7个灯亮
                case 8: P0=0x00; counter=0; break; //8个灯全亮
             }                             
          }          
   }
 }

4.4、工作模式3

TO被拆成两个独立的8位计数器TLO和THO,TL0独占T0的各控制位、引脚和中断源,既可以用作定时器也可作计数器。TH0只能作为定时器使用,且需要占用T1的控制位TR1和TF1实现启停和中断。

图片

两个定时/计数器的使用方法与方式0或1相似。工作方式3只适用于T0,不适用于T1。若将T1强行设置为模式3,将使T1立即停止计时或计数,相当于使TR1=0。

当T0作方式3时,T1仍可以设置为除工作方式3外的其它工作方式,但由于它的TR1和TF1已被T0占用,因此无法按正常计时/计数器工作,常用于串行通信时的波特率发生器,以控制传输数据的速度。

单片机的P0口接了8个发光二极管,要求使用定时器T0中断实现流水灯操作,流水频率为每0.5秒钟更替一次(假设单片机外接11.0592MHz的晶振)。

图片

#include
unsigned char cnt=0;    //用于中断次数计数
unsigned char led =0xfe;  //初始化流水灯
int main(void)
{
  TMOD=0x01;       //16位定时方式
  TH0=(65536-46083)/256;   //初始化T0的高8位
  TL0=(65536-46083)%256;   //初始化T0的低8位
  EA=1;
  ET0=1;      //开中断
  TR0=1;      //启动T0工作
   while(1);
}
void T0_int(void)  interrupt 1   
{
  cnt++;
  if( cnt==10 )    //0.5秒钟的时间到了
  {
    cnt=0;      //清除次数统计
    led =(led <<1)|1;    //更新流水灯数据
    if(led ==0xff)
    {
      led =0xfe;
    }
    P0=led;      //显示流水灯
  }
   TH0=(65536-46083)/256;       //初始化T0的高8位
  TL0=(65536-46083)%256;       //初始化T0的低8位
}
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 计数器
    +关注

    关注

    32

    文章

    2121

    浏览量

    92976
  • 定时器
    +关注

    关注

    23

    文章

    3147

    浏览量

    112036
  • 8051单片机
    +关注

    关注

    5

    文章

    153

    浏览量

    25334
收藏 人收藏

    评论

    相关推荐

    80C51单片机定时器/计数器详解(含工作方式)

    80C51单片机要实现定时功能,比较方便的办法是利用单片机内部的定时/计数器。下面我们将对80C
    发表于 11-09 20:10 5.6w次阅读
    80C<b class='flag-5'>51</b><b class='flag-5'>单片机</b><b class='flag-5'>定时器</b>/<b class='flag-5'>计数器</b>详解(含工作方式)

    51单片机定时器计数器的原理及应用实例详细资料说明

    本文档的主要内容详细介绍的是51单片机定时器计数器的原理及应用实例详细资料说明。
    发表于 08-13 17:32 1次下载
    <b class='flag-5'>51</b><b class='flag-5'>单片机</b>的<b class='flag-5'>定时器</b>和<b class='flag-5'>计数器</b>的原理及应用实例详细资料说明

    51单片机定时器计数器详细资料介绍和应用程序免费下载

    51单片机定时器/计数器有2个分别是T1和T0,52系列的单片机有3个定时器/
    发表于 07-16 17:39 4次下载
    <b class='flag-5'>51</b><b class='flag-5'>单片机</b>的<b class='flag-5'>定时器</b>和<b class='flag-5'>计数器</b>详细资料介绍和应用程序免费下载

    使用51单片机定时器计数器实现定时的实例说明

    本文档的主要内容详细介绍的是使用51单片机定时器计数器实现定时的实例说明。
    发表于 07-12 17:39 7次下载
    使用<b class='flag-5'>51</b><b class='flag-5'>单片机</b><b class='flag-5'>定时器</b>和<b class='flag-5'>计数器</b>实现<b class='flag-5'>定时</b>的实例说明

    51单片机定时器计数器的使用资料详细说明

    本文档的主要内容详细介绍的是51单片机定时器计数器的使用资料详细说明。
    发表于 07-09 17:40 1次下载
    <b class='flag-5'>51</b><b class='flag-5'>单片机</b>的<b class='flag-5'>定时器</b>和<b class='flag-5'>计数器</b>的使用资料详细说明

    51单片机定时器计数器的功能实现资料说明

    本文档的主要内容详细介绍的是51单片机定时器计数器的功能实现资料说明。
    发表于 06-19 17:44 0次下载
    <b class='flag-5'>51</b><b class='flag-5'>单片机</b>的<b class='flag-5'>定时器</b>和<b class='flag-5'>计数器</b>的功能实现资料说明

    基于51单片机定时器计数器硬件设计

    基于51单片机定时器计数器硬件设计
    发表于 09-06 15:05 4次下载

    51单片机定时器/计数器的工作原理和结构(一)

    51单片机定时器/计数器的工作原理和结构回看下单片机中断系统内部结构:分析内部中断触发:先看图TCON:和外部中断相比少了IT位设置触发
    发表于 11-11 09:21 11次下载
    【<b class='flag-5'>51</b><b class='flag-5'>单片机</b>】<b class='flag-5'>定时器</b>/<b class='flag-5'>计数器</b>的工作原理和结构(一)

    51单片机定时器计数器配置

    一、51单片机定时/计数器的工作原理在了解了单片机的时钟频率、时钟周期、机器周期之后,显然我们可以知道
    发表于 11-11 13:51 17次下载
    <b class='flag-5'>51</b><b class='flag-5'>单片机</b><b class='flag-5'>定时器</b>、<b class='flag-5'>计数器</b>配置

    51单片机定时器计数器

    难的东西学不会是因为简单的知识没学好基础不牢,地动山摇1.01.0.1定时器(1)51单片机定时器是一个内部外设。(2)定时器相当于CPU
    发表于 11-11 20:06 11次下载
    <b class='flag-5'>51</b><b class='flag-5'>单片机</b>的<b class='flag-5'>定时器</b>与<b class='flag-5'>计数器</b>

    51单片机定时器/计数器

    一、课前须知:1、51单片机有两组定时器/计数器,因为既可以定时,也可以计数,所以称之为
    发表于 11-20 20:06 46次下载
    <b class='flag-5'>51</b><b class='flag-5'>单片机</b><b class='flag-5'>定时器</b>/<b class='flag-5'>计数器</b>

    51单片机——定时器/计数器

    本文主要对定时功能、计数功能、定时器/计时器结构和定时器/计数器的四种工作方式进行介绍
    发表于 11-22 15:06 12次下载
    <b class='flag-5'>51</b><b class='flag-5'>单片机</b>——<b class='flag-5'>定时器</b>/<b class='flag-5'>计数器</b>

    51单片机定时器/计数器接口

    51单片机定时器/计数器接口定时器/计数器0和1T0由特殊功能寄存器TH0(T0高8位)、TL
    发表于 11-22 15:51 0次下载
    <b class='flag-5'>51</b><b class='flag-5'>单片机</b>的<b class='flag-5'>定时器</b>/<b class='flag-5'>计数器</b>接口

    51单片机——定时器计数器

    一 TMOD寄存器(定时/计数器的工作方式寄存器)1.GATE(门控位):GATE=0——定时器受外部信号源影响GATE=1——用软件使TR0/TR1=1同时使INT0/INT1为高电平2.C
    发表于 11-22 16:36 8次下载
    <b class='flag-5'>51</b><b class='flag-5'>单片机</b>——<b class='flag-5'>定时器</b>和<b class='flag-5'>计数器</b>

    51单片机定时器/计数器的编程

    定时器/计数器的结构定时器/计数器最核心的部分就是两个16位加法计数器,每个16位加法计数器又有
    发表于 11-23 16:20 14次下载
    <b class='flag-5'>51</b><b class='flag-5'>单片机</b><b class='flag-5'>定时器</b>/<b class='flag-5'>计数器</b>的编程