Loading

定时计数器

一、学习定时器之前需要明白:

1、51单片机有两组定时器/计数器,因为既可以定时,又可以计数,故称之为定时器/计数器。

2、定时器/计数器和单片机的CPU是相互独立的。定时器/计数器工作的过程是自动完成的,不需要CPU的参与。

3、51单片机中的定时器/计数器是根据机器内部的时钟或者是外部脉冲信号对寄存器中的数据加1

4、有了定时器/计数器之后,可以增加单片机的效率,一些简单的重复加1的工作可以交给定时器/计数器处理。CPU转而处理一些复杂的事情。 同时可以实现精确定时作用

二、定时计数器 工作原理

  定时计数器实质上是一个加1计数器。它随着计数器的输入脉冲进行自加1,也就是每来一个脉冲,计数器就自动加1,,当加到计数器为全1时,再输入一个脉冲就使计数器回零,且计数器的溢出相 应的中断标志位置1,向CPU发出中断请求(定时/数器中断允许时)

  如果定时计数器工作于定时模式,则表示定时时间已到;如果工作于计数模式,则表示计数值已满。可见,由溢出时计数器的值减去计数初值才是加1计数器的计数值。

三、定时计数器的结构:

由 加1计数器(16位,即2个字节),由高8位和低8位两个寄存器 THx 和 TLx 组成。

TMOD是定时/计数器的工作方式寄存器,确定工作方式和功能;

TCON是控制寄存器,控制T0、T1的启动和停止及设置溢出标志

四、定时计数器的控制

51单片机定时/计数器的工作由两个特殊功能寄存器控制。TMOD用于设置其工作方式;TCON用于控制其启动和中断申请。

【1】工作方式寄存器  TMOD

工作方式寄存器TMOD用于设置定时计数器的工作方式,低四位用于T0,高四位用于T1。其格式如下

 

 

 1、GATE是门控位

Δ 当GATE=0时,用于控制定时器的启动是否受外部中断源信号的影响。只要用软件使 TCON 中的 TR0 或 TR1 为1,就可以启动定时计数器工作; (常用此方法)

Δ当GATA=1时,要用软件使 TR0 或 TR1 为1,同时外部中断引脚 INT0/1 (如下图 中断系统部分图 )也为高电平时,才能启动定时/计数器工作。即此时定时器的启动条件,加上了 INT0/1 引脚为高电平这一条件

 

2、 C/T :  定时/计数模式选择位( C/T=0为定时模式; C/T=1为计数模式)

3、M1M0 :工作方式设置位 ,定时/计数器有四种工作方式(如下图):

[通常用 方式1(16位定时计数器)和方式2(8位自动重装定时计数器,常用于计算频率和串口通信使用)]

【2】控制寄存器 TCON

TCON的低4位用于控制外部中断(在中断系统已介绍),TCON的高4位用于控制 定时计数器的启动和中断中请。其格式如下

 

 

 1、TF1(TCON.7) : T1溢出中断请求标志位.

T1 计数溢出时由硬件自动置 TF1 为1。CPU响应中断后 TF1 由硬件自动清0。

T1工作时,CPU可随时查询 TF1 的状态(TF1可用作查询测试的标志).

TF1 也可以用软件置1或清0,同硬件置1或清0的效果一样。

2、TR 1(TCON6): T1 运行控制位.

TR1 置1时,T1开始工作;TR置0时T1停止工作

TR1 由软件置1或清0 (所以,用软件可控制定时计数器的启动与停止)

3、TF0 (TCON5): T0 溢出中断请求标志位,其功能与 TF1 类同。

4、TR0 (TCON4): T0运行控制位,其功能与 TR 1类同。

五、定时计数器的工作方式

【1】方式 0 (13位计数)

1、若为定时器 T1:由TL0 的低5位(高3位未用)和 TH0 的8位组成 ;
TL0的低5位溢出时,向 TH0 进位;TH0溢出时,置位 TCON 中的 TF0 标志(置1),向CPU发出中断请求。

2、若为定时器 T2:TH1 溢出时,置位 TCON 中的 TF1 ( 与定时器 T1类同)

 

♦定时器模式

Δ  计算公式:N=t/Tcy  ;计数初值计算的公式为:X=2^13-N.(定时器为 13 位)

定时器的初值还可以采用计数个数直接取补法获得。

Δ  计数模式时,计数脉冲是T0(单片机 P3 口的T0引脚)上的外部脉冲。

Δ  门控位GATE(有特殊的作用):

当GATE=0时,经反相后使或门输出为1,此时仅由TRO控制与门的开启,与门输出 1时,控制开关接通,计数开始;

当GATE=1时,由外中断引脚信号控制或门的输出,此时控制与门的开启由外中断引脚信号和TRO共同控制。当TRO=1时,外中断引脚信号 引脚的高电平启动计数,外中断引脚信号 引脚的低电平停止计数。(此方式常用

来测量外中断引脚上正脉冲的宽度)→看下图

 

【2】方式 1(计数位数是16位)

定时器T1:由TL0作为低8位,TH0 作为高8位,组成了16位加1计数器(定时器T2 类同)

 

计数个数与计数初值的关系:X=2^16-N

【3】方式 2 (自动重装初值的8位计数方式)

 

计数个数与计数初值的关系: X=2^8- N . (该方式适合用作较精确的脉冲信号发生器)

【4】方式 3 (只适用于定时计数器 T0)

定时器 T1 处于方式3时,相当于 TR1=0,停止计数

 

 

工作方式3 将 T0 分成为两个独立的 8位计数器 TL0 和 TH0

 六、使用定时器的程序

初始化程序应完成:

1、对TMOD赋值,以确定 T0 和 T1 的工作方式(以及方式 0、1、2、3?定时器还是计数器模式?)

2、计算初值,并将其写入TH0、TL0 或TH1、 TL1

3、中断方式时,则对总中断 EA 赋值,开放定时器中断

4、使 TR0 或 TR1 置位,启动定时计数器 定时或计数

七、与CPU 时序有关的知识

振荡周期:为单片机提供定时信号的振荡源的周期( 晶振周期或外加振荡周期)→T(振荡) =1/ f= 1/12MHZ 

状态周期:2个振荡周期为1个状态周期,用S表示。振荡周期又称S周期或时钟周期 .→T(状态)=1/6MHZ

机器周期:1个机器周期含6个状态周期,12个振荡周期。 → T(机器)=12/12MHZ = 1 us (微秒)

指令周期:完成1条指令所占用的全部时间,它以机器周期为单位

八、计数器初值的计算

1、机器周期也就是CPU完成一个基本操作所需要的时间

2、机器周期=1/单片机的时钟频率

3、51单片机内部时钟频率是外部时钟的12分频。也就 是说当外部晶振的频率输入到单片机里面的时候要进行12分频。比如说你用的是12MHZ的晶振,那么 单片机内部的时钟频率就是12/12MHZ,当你使用 12MHZ的外部晶振的时候。机器周期=1/1M=1us.

4、定时1ms的初值是多少呢,1ms/1us=1000.也就是要计数1000个数,初值=65535-1000+1(因为实际上计数器计数到66636才溢出)=64536(十进制)=FC18H (十六进制)

                                                                      单片机工作方式为1   由公式X=2^16-NN = 1000)得 X= 65536 - 1000=64536

九、程序示例(定时器 0 实现功能:D1小灯循环点亮1秒,熄灭1秒)

 
#include "reg52.h"    //此文件中定义了单片机的一些特殊功能寄存器
typedef unsigned int u16;   //对数据类型进行声明定义
typedef unsigned char u8;
sbit led=P2^0;  //定义P20口是led

 

 

  GATE =0;  C/T=0 为定时模式;  M1M0为01 即工作方式1(16位定时计数器) 

程序:

void Timer0Init()
{
 TMOD|=0X01;//或运算(看上图)选择为定时器 0 模式,工作方式1,仅用TR0打开启动。
 TH0=0XFC; //给定时器赋初值,定时1ms
 TL0=0X18; (看下图)   →(打开 常用辅助开发软件→51定时器计算→选择 定时器工作方式 →晶振频率 12 MHZ→ 选择定时时长,即可得到类似 FC18H)
 ET0=1;//打开定时器0中断允许(中断系统的内容)
 EA=1;//打开总中断
 TR0=1;//打开定时器   
}

 

 
(打开 常用辅助开发软件→51定时器计算→选择 定时器工作方式 →晶振频率 12 MHZ→ 选择定时时长,即可得到类似 FC18H)
void main()
{ 
 Timer0Init();  //定时器0初始化
 while(1);  
}

void Timer0() interrupt 1  //(中断号)中断函数
{
 static u16 i;
 TH0=0XFC; //给定时器赋初值,定时1ms
 TL0=0X18;
 i++;   // i 增加一次,定时1ms
 if(i==1000) // i累加了1000, 则定时了 1s
 {
  i=0;
  led=~led; // led 翻转较简单,可放在 中断里 
 } 
}

 

 

 

 

posted @ 2020-05-01 00:07  ARCHERy  阅读(2312)  评论(2编辑  收藏  举报