第 8章 定时器 /计数器及实验第 8章 定时器 /计数器及实验
MCS-51单片机可提供 2个 16位的定时器 /计数器,T0和 T1。它们均可以用作定时器和事件计数器,为单片机系统提供精确定时和计数功能。
第 8章 定时器 /计数器及实验
8.1 定时器 /计数器的硬件结构及工作原理
图 8-1为定时器 /计数器的硬件结构框图。 图中可见,T0和 T1的核心均为一个加 1计数器。
加 1计数器的脉冲来源有两个:一个是外部脉冲源,另一个是单片机系统的时钟源。
计数器对输入脉冲进行加 1计数,每输入一个脉冲,计数值加 1。
第 8章 定时器 /计数器及实验
图 8-1 定时器 /计数器硬件结构框图第 8章 定时器 /计数器及实验计数到计数值为全 1
当计数到计数值为全 1时,再有一个脉冲信号输入将使得计数器溢出。这时,加 1计数器从最高位溢出一个脉冲使 TCON(定时器控制寄存器 )的溢出标志位 TF0或 TF1置 1,
同时将计数值清零。如果定时器 /计数器工作于定时状态,则表示定时时间到;
第 8章 定时器 /计数器及实验工作于计数状态
如果工作于计数状态,则表示计数值回零。因此,
加 1计数器的基本功能是对输入脉冲进行计数,至于其工作于定时状态还是计数状态,则取决于外接脉冲源。当脉冲源为单片机系统时钟源时,计数脉冲为一等间隔脉冲序列,脉冲数乘以间隔时间就是定时时间,此时加 1计数器工作于定时状态。
当脉冲源为间隔不等的外部脉冲信号时,加 1计数器就相当于外部事件计数器,工作于计数状态。
第 8章 定时器 /计数器及实验用作定时器
用作定时器时,在每个机器周期加 1计数器都加 1,因此也可以看作对机器周期的累计。
因为 1个机器周期包括 12个振荡周期,因此加 1计数器的计数频率是振荡频率的 1/12。
如果单片机采用 12MHz的晶体振荡器,则加 1计数器的计数频率为 1MHz,即每微秒加 1计数器加 1。这样就可以按定时时间的要求计算出加 1计数器的预置计数值。
第 8章 定时器 /计数器及实验用作计数器
用作计数器时,加 1计数器在其对应的外部输入端 T0(P3.4)或 T1(P3.5)检测到一个负跳变时加 1。其最快的计数频率是振荡频率的
1/24。
第 8章 定时器 /计数器及实验
2个 8位特殊功能寄存器
定时器 /计数器 T0由 2个 8位特殊功能寄存器 TH0和
TL0构成,TH0用于存放高 8位的二进制计数值,
TL0用于存放低 8位的二进制计数值。定时器 /计数器 T1由 2个 8位特殊功能寄存器 TH1和 TL1构成,
TH1用于存放高 8位的二进制计数值,TL1用于存放低 8位的二进制计数值。工作方式寄存器 TMOD
用于设置定时器 /计数器的工作方式。控制寄存器
TCON用于启动和停止定时器 /计数器的计数,并控制定时器 /计数器的工作状态。
第 8章 定时器 /计数器及实验
8.2 定时器的工作方式寄存器和控制寄存器
8.2.1 定时器 /计数器工作方式寄存器 TMOD
如图 8.2所示,TMOD的高 4位控制 T1的工作方式,低 4位控制 T0的工作方式。
第 8章 定时器 /计数器及实验工作方式选择位
M1,M0:工作方式选择位。定时器 /计数器有 4种工作方式,由 M1和
M0来进行选择,如表 8-1所示。
表 8-1 定时器 /计数器工作方式选择
M1 M0 工作方式 功 能 说 明
0 0 方式 0 13位定时器 /计数器
0 1 方式 1 16位定时器 /计数器
1 0 方式 2 可自动重新载入计数初值的 8位定时器 /计数器
1 1 方式 3 T0用作 2个 8位定时器 /计数器,关闭 T1
第 8章 定时器 /计数器及实验定时器 /计数器选择位
C/ T:定时器 /计数器选择位。 C/ T= 1工作为计数器功能,C/ T= 0工作为定时器功能。
GATE:选通控制位。 GATE= 0,由软件控制 TR0或 TR1启动定时器; GATE= 1,由外部中断引脚 INT0(P3.2)和 INT1(P3.3)输入电平分别控制 T0和 T1的运行。
第 8章 定时器 /计数器及实验
8.2.2 定时器控制寄存器 TCON
图 8.3 定时器 /计数器控制字段位地址 8FH 8EH 8DH 8CH 8BH 8AH 89H 88H
TCON TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
第 8章 定时器 /计数器及实验定时器 T1溢出中断标志
TF1:定时器 T1溢出中断标志。当定时器 T1
溢出时由内部硬件置位,申请中断。当转向中断服务程序时,由内部硬件将 TF1标志清零。
第 8章 定时器 /计数器及实验定时器 T1运行控制位
TR1:定时器 T1运行控制位,由软件置位 /
清零来控制定时器 T1的计数启动 /停止。当选通控制位 GATE为 0而 TR1为 1时,T1启动计数;当 TR1为 0时,T1停止计数。当选通控制位为 1时,仅当 TR1为 1且 P3.3引脚输入为高电平时才启动 T1计数,TR1为 0或 P3.3
引脚输入为低电平都使 T1停止计数。
第 8章 定时器 /计数器及实验溢出中断标志和运行控制位
TF0:定时器 T0溢出中断标志,其含义与
TF1类似。
TR0:定时器 T0运行控制位,其含义与 TR1
类似。
TCON的低 4位与外部中断有关,其意义在前一章已介绍过。
第 8章 定时器 /计数器及实验
8.3 定时器 /计数器的工作方式
2个 16位定时器 /计数器具有定时和计数两种功能,每种功能都包括了四种工作方式。
用户通过指令把方式字写入定时器 /计数器工作方式寄存器 TMOD来选择 T0或 T1的功能和工作方式;
第 8章 定时器 /计数器及实验启动计数或停止计数
通过写入计数初值来控制计数长度 (定时时间 );通过对定时器 /计数器控制寄存器
TCON的相应位进行置位或清零来实现定时器的启动计数或停止计数。
第 8章 定时器 /计数器及实验
8.3.1 工作方式 0
当 M1M0为 00时,定时器 /计数器被选为工作方式 0,其等效框图如图 8-4所示。
第 8章 定时器 /计数器及实验图 8-4 定时器 T0工作方式 0结构图第 8章 定时器 /计数器及实验一个 13位的定时器 /计数器
T0(或 T1)在工作在方式 0时,是一个 13位的定时器 /计数器。在这种方式下,16位寄存器 (TH0和 TL0)只用 13位。其中 TL0的高 3位未使用,其余位占了 13位的低 5位,TH0占了高 8位。计数时,TL0的低 5位溢出向 TH0
进位,TH0溢出时向溢出中断标志 TF0进位
(由硬件置位 ),并申请中断。
第 8章 定时器 /计数器及实验对机器周期进行计数
当 C/ T= 0时,图中的开关连接晶体振荡器的 12分频输出,T0对机器周期进行计数,
这就是定时工作方式。
当 C/ T= 1时,图中的开关连接引脚 P3.4(T0),
外部计数脉冲由引脚 T0输入。当外接信号发生从 1到 0的跳变时,计数器进行加 1计数,
T0成为外部事件计数器,这就是计数工作方式。
第 8章 定时器 /计数器及实验
GATE= 0时
当 GATE= 0时,关闭逻辑“或”门,使
P3.2引脚输入信号无效。这时,逻辑“与”
门被打开,由 TR0控制 T0的启动计数和停止计数。若 TR0= 1,接通控制开关,启动 T0
开始加 1计数,直至溢出。溢出时,计数寄存器值为 0,TF0= 1,并申请中断,T0从 0
开始计数。因此,若 T0工作于定时状态,
在溢出后应给计数器 (TH0和 TL0)重新赋计数初值。若 TR0= 0,T0停止计数。
第 8章 定时器 /计数器及实验
GATE= 1
当 GATE= 1,且 TR0= 1时,逻辑“或”门和逻辑“与”门都被打开,外接信号通过
P3.2引脚直接启动或停止定时器计数。输入高电平时,启动计数;输入低电平时,停止计数。通常用这种方式来测量外接信号的脉冲宽度。
第 8章 定时器 /计数器及实验定时时间的计算公式
为计数工作方式时,计数值的范围为 1~
8192(213)。
为定时工作方式时,定时时间的计算公式为:
T= (213-计数初值 )× 晶体振荡器周期 × 12 (式 8-1)
第 8章 定时器 /计数器及实验
8.3.2 工作方式 1
当 M1M0为 01时,定时器 /计数器被选为工作方式 1,其等效框图如图 8-5所示。
第 8章 定时器 /计数器及实验图 8-5 定时器 T0工作方式 1结构图第 8章 定时器 /计数器及实验工作在方式 1时
T0(或 T1)在工作在方式 1时,是一个 16位的定时器 /计数器。由图 8-5可见,其逻辑电路和工作情况与工作方式 0完全相同,所不同的只是组成计数器的位数。
第 8章 定时器 /计数器及实验计数值范围
为计数工作方式时,计数值的范围为 1~
65536 (216)。
为定时工作方式时,定时时间的计算公式为:
T= (216-计数初值 )× 晶体振荡器周期 × 12
(式 8-2)
第 8章 定时器 /计数器及实验
8.3.3 工作方式 2
当 M1M0为 10时,定时器 /计数器被选为工作方式 2,其等效框图如图 8-6所示。 控制振荡器 ÷1 2
TL 0
( 8 位)
TF 0 中断
T 0 端
C/ T = 0
C/ T = 1
+
I N T 0 端
G A T E
TR 0
TH 0
( 8 位)
重新装入第 8章 定时器 /计数器及实验图 8-6 定时器 T0工作方式 2结构图第 8章 定时器 /计数器及实验工作方式 0和工作方式 1的最大特点
工作方式 0和工作方式 1的最大特点是计数溢出后,计数寄存器的值全为 0。因此循环定时或计数应用时就存在重新设置计数初值的问题,这不但影响定时精度,而且给程序编写带来不便。
第 8章 定时器 /计数器及实验自动重新加载功能
工作方式 2就是针对此问题而设置的,它具有自动重新加载功能,计数溢出后计数初值可由硬件自动重新装载。在这种工作方式下,16位计数器被分为两部分,即以 TL0
作计数器,以 TH0作预置数寄存器,初始化时把计数初值分别装入 TL0和 TH0中。当计数溢出后,由预置数寄存器以硬件方式自动加载。
第 8章 定时器 /计数器及实验置位 TF0
初始化时,8位计数初值被同时装入 TL0和
TH0中。当 TL0计数溢出时,置位 TF0,同时将保存在 TH0中的计数初值自动装载到
TL0中,之后 TL0重新计数,循环不止。这样的话,不但省去了用户程序中的重新装载计数初值的指令,还有利于提高定时精度。但这种方式下计数值有限,最大只能到 256。这种工作方式较适用于连续定时或计数的应用场合。
第 8章 定时器 /计数器及实验定时时间的计算公式
为计数工作方式时,计数值的范围为 1~
256(28)。
为定时工作方式时,定时时间的计算公式为:
T= (28-计数初值 )× 晶体振荡器周期 × 12
(式 8-3)
第 8章 定时器 /计数器及实验
8.3.4 工作方式 3
当 M1M0为 11时,定时器 /计数器被选为工作方式 3,其等效框图如图 8-7所示。
第 8章 定时器 /计数器及实验图 8-7 定时器 T0工作方式 3结构图第 8章 定时器 /计数器及实验
前三种工作方式下,T0和 T1的使用是完全相同的。但是在工作方式 3下,T0和 T1的工作是不同的。
在工作方式 3下,因 T1的控制位和引脚信号已被 TH0借用,所以 T1是不能使用的。
前三种工作方式下第 8章 定时器 /计数器及实验在工作方式 3下
在工作方式 3下,T0被拆成 2个独立的 8位计数器 TL0和 TH0。 TL0既可以作计数器使用,
又可以作定时器使用,T0的各控制位和引脚信号全归它使用。其功能和操作与工作方式 0和工作方式 1完全相同,电路结构也极其相似,如图 8-7所示。但是 TH0只能作为定时器使用,控制位和引脚信号均借用
T1的。
第 8章 定时器 /计数器及实验
8.4 定时器 /计数器的初始化
由于定时 /计数器是可编程的,因此在定时或计数之前要用程序初始化,初始化一般有以下几个步骤:
( 1)确定工作方式 ―― 对工作方式寄存器
TMOD赋值。
第 8章 定时器 /计数器及实验预置定时或计数初值
( 2)预置定时或计数初值,直接将计数初值写入 TL0,TH0或 TL1,TH1中。
( 3)根据需要对中断允许寄存器 IE赋值,以开放或禁止定时 /计数器中断。
( 4)启动定时 /计数器,使 TCON中的 TR1或
TR0置,1”,计数器即按规定的工作方式和计数初值进行计数或定时。
第 8章 定时器 /计数器及实验
8.5 定时器实验
使用定时器 T1以工作方式 1进行 50ms精确定时。 P1口的 P1.0 – P1.7分别接八个发光二极管 L0 – L7。编写程序模拟一个时序控制装置:开机后第一秒钟 L0,L2亮,第二秒钟
L1,L3亮,第三秒钟 L4,L6亮,第四秒钟
L5,L7亮,第五秒钟 L0,L2,L4,L6亮,
第六秒钟 L1,L3,L5,L7亮,第七秒钟全亮,第八秒钟全灭,之后又从头开始,一直循环下去。
第 8章 定时器 /计数器及实验
8.5.1 硬件电路图 8-8 定时器实验硬件电路第 8章 定时器 /计数器及实验
8.5.2 软件
在用户文件夹中建立一个 timer.uv2工程项目,再输入以下源程序 timer.c,最后将源程序添加到工程项目中。如图 8-
9所示。
图 8-9 KEIL C51工程窗口第 8章 定时器 /计数器及实验以下为 time.c 源文件:
//---定时器实验 ---
//-----头文件引用 -----
#include<reg51.h>
#include<absacc.h>
//-----宏声明 -----
#define uchar unsigned char
uchar idata LED[8]=
{0xfa,0xf5,0xaf,0x5f,0xaa,0x55,0x00,0xff};//显示常数表
uchar times=20; //延时一秒的常数
uchar status=0;
第 8章 定时器 /计数器及实验
//-----定时器 -----
void int1( ) interrupt 3
{
TR1=0; //关中断
TL1=0x00; //延时 50ms常数
TH1=0x4b;
TR1=1; //开中断
times=(times-1);
if(times==0)
{
times=20; //延时一秒的常数
P1=LED[status]; //送 P1口显示
status=((status+1)&0x07);
}
}
第 8章 定时器 /计数器及实验
//-----主程序 -----
void main()
{ TMOD=0x10; //置 T1为方式 1
TL1=0x00; //延时 50ms的时间常数
TH1=0x4b;
TR1=1;
ET1=1;
EA=1; //开中断
while(1);
}
第 8章 定时器 /计数器及实验
8.5.3 实验运行结果
由图 8-10至图 8-13可见,程序已实现了精确定时控制的要求。
图 8-10 程序运行结果 (0.9525秒时 )
第 8章 定时器 /计数器及实验图 8-11 程序运行结果 (1.0秒时 )
第 8章 定时器 /计数器及实验图 8-12 程序运行结果 (1.95秒时 )
第 8章 定时器 /计数器及实验图 8-13 程序运行结果 (2.0秒时 )
第 8章 定时器 /计数器及实验
8.6 计数器实验
使用 T1作为定时器,T0作为计数器,均按方式 1工作,测试 P3.4( T0)引脚上每 50ms
来了多少脉冲,将其数值按二进制数在 LED
灯上显示出来,每隔 3秒测试显示一次。
第 8章 定时器 /计数器及实验
8.6.1 硬件电路
如图 8-14所示。
图 8-14 计数器实验硬件电路第 8章 定时器 /计数器及实验
8.6.2 软件
在用户文件夹中建立一个 counter.uv2工程项目,再输入以下源程序 counter.c,最后将源程序添加到工程项目中。如图 8-15所示。
图 8-15 KEIL C51工程窗口第 8章 定时器 /计数器及实验以下为 counter.c 源文件:
//---定时器实验 ---
//-----头文件引用 -----
#include<reg51.h>
//-----宏声明 -----
#define uchar unsigned char
uchar times=60; //延时 3 秒常数第 8章 定时器 /计数器及实验
//-----定时中断程序 -----
void int_t1() interrupt 3
{
uchar pulse;
TR1=0;
TL1=0xb0; //延时 50ms常数
TH1=0x3c;
pulse=TL0; //保存计数值
TL0=0x00; //清计数器
TH0=0x00;
TR1=1;
times--;
if(times==0)
{
times=60; //延时 3 秒常数
P1= ~ pulse;//把计数值在 LED上显示
}
}
第 8章 定时器 /计数器及实验
//-----主程序 -----
void main()
{
TMOD=0x15;//置 T1为方式 1,定时方式 ;置 T0为方式 1,计数方式
TL0=0x00; //计数器清零
TH0=0x00;
TL1=0xb0; //延时 50ms常数
TH1=0x3c;
TR0=1; //启动 T0
ET0=1;
TR1=1; //启动 T1
ET1=1;
EA=1; //开中断
while(1);
}
第 8章 定时器 /计数器及实验
8.6.3 实验运行结果
在实验中使用数字时钟作为脉冲源,频率设为 600Hz。如图 8-16所示。
图 8-16 作为脉冲源的数字时钟的设置第 8章 定时器 /计数器及实验实验结果与分析结果
在图 8-17中可见,3秒时单片机将 50ms内测得的脉冲个数以二进制的形式显示在 8个发光二极管上。若已知脉冲源的频率为 600Hz,
不难算出 50ms内单片机测得的脉冲数为
0.05/(1/600)=30,换算为二进制数为 11110,
实验结果与分析结果是吻合的。
第 8章 定时器 /计数器及实验图 8-17 二进制脉冲数显示 (3.0秒时 )