390 likes | 552 Views
第 5 章定时 / 计数器. 本章要点. 定时 / 计数器的工作原理 定时 / 计数器的控制寄存器和方式寄存器 定时 / 计数器的工作方式、计数初值的设置以及各种工作方式下的应用编程. 5.1 定时 / 计数器的结构及工作原理. 5.1.1 定时 / 计数器的结构. MCS-51 单片机内部由两个 16 位可编程的定时 / 计数器,即定时器 T0 和定时器 T1 。 既可以用作定时器,又可用作计数器。. 基本部件是两个 8 位的计数器。由 TH0 和 TL0 组成 T0 ,由 TH1 和 TL1 组成 T1 ,它们都是以 加 1 的方式完成计数。
E N D
本章要点 • 定时/计数器的工作原理 • 定时/计数器的控制寄存器和方式寄存器 • 定时/计数器的工作方式、计数初值的设置以及各种工作方式下的应用编程
5.1 定时/计数器的结构及工作原理 5.1.1 定时/计数器的结构 • MCS-51单片机内部由两个16位可编程的定时/计数器,即定时器T0和定时器T1。 • 既可以用作定时器,又可用作计数器。
基本部件是两个8位的计数器。由TH0和TL0组成T0,由TH1和TL1组成T1,它们都是以加1的方式完成计数。基本部件是两个8位的计数器。由TH0和TL0组成T0,由TH1和TL1组成T1,它们都是以加1的方式完成计数。 • 特殊功能寄存器TMOD控制定时/计数器的工作方式,TCON控制定时/计数器的启动运行并记录T0、T1的溢出标志。 • 通过初始化编程,可以预置计数初值、指定其工作方式及控制其运行
5.1.2 定时/计数器的工作原理 1.定时器的工作原理 • 在作定时器使用时,输入的计数脉冲是由晶体振荡器的输出经12分频后得到的,所以定时器也可以看作对机器周期计数的计数器。 • 如果晶振频率为12 MHz,则定时器每接收一个输入脉冲的时间为1us。
2.计数器的工作原理 • 当它用作计数器时,它对接到相应的外部引脚T0(P3.4) 或T1(P3.5)上的外部事件计数。 • 当检测到输入引脚上的电平由高跳变到低时,计数器就加1。 注意:计数器在每个机器周期采样外部输入,当采样值在这个机器周期为高,在下一个机器周期为低时,则计数器加1。 因此计数器需要两个机器周期来识别一个从高到低的跳变,故最高计数速率为晶振的1/24。
5.2 定时/计数器的方式和控制寄存器 1. 定时/计数器的方式寄存器TMOD • 高4位用于定时/计数器1,低4位用于定时/计数器0。
控制T1 • 控制T0 • TMOD(89H) • GATE:门控位。用来确定对应的外部中断请求引脚是否参与T0或T1的操作控制。 当GATE=0时,TR0或TR1被置位时,T0或T1被允许开始计数; 当GATE=1时,不仅要TR0或TR1置位,还需要P3口的/INT0或/INT1脚为高电平,才允许开始计数。 后一种情况下一般用于测量外部脉冲的宽度。
TMOD(89H) • :定时器方式或计数器方式选择。 • 时,为定时方式,其计数器输入为晶振的12分频,即对机器周期计数。 • 时,为计数方式,计数器的输入来自T0(P3.4)和T1(P3.5)端的外部脉冲。 • 控制T1 • 控制T0
2. 定时/计数器控制寄存器TCON • 特殊功能寄存器TCON用于控制定时器的操作及对定时器中断的控制。特殊功能寄存器TCON既能按字节寻址(88H),又能按位寻址。
TCON(88H) • TF1:T1的溢出标志。当T1计数溢出时由硬件则自动置1;在CPU响应中断处理时由硬件清0。也可由程序查询后清零(非中断方式)。 • TR1:T1的运行控制位。该位置1或清0用来实现启动或停止定时/计数器。 • TF0:T0的溢出标志 ;TR0:T0的运行控制位 。 • TMOD和TCON寄存器在复位时其每一位均清0。
5.3 定时/计数器的工作方式 1.方式0(了解) • 当M1M0设置为00时,定时/计数器选定为方式0工作。在这种方式下,计数器由THx中的8位和TLx中的低5位组成长度为13位的计数器。TLx中的高3位未用。 • 它的计数范围为0~8191(213=8192)。
振荡器 ÷12 K TH1 8位 TL1 低5位 TF1 T1(P3.5)脚 中断 TR1 GATE INT1脚 定时/计数器T1(T0)方式0逻辑图
2.方式1(常用) • 方式1 是THx和TLx组成一个16位计数器。它的计数范围为0~65535(216=65536)。
3.方式2(常用) • 可以自动装载计数初值(计数初值自动恢复)的8位计数器,THx作为赋值寄存器。 • THx由软件设置初值。当TLx产生溢出时,CPU一方面使溢出标志TFx置1,同时把THx中的8位数据重新装入TLx中。 • 方式2常用于精确定时控制和产生串行通信用的波特率。 • 但它的缺点是定时位数较少(最多只能定时256个周期)。
4.方式3(了解) • 方式3只适用于定时计数器T0。T1不能工作在方式3 • 当T0定义为方式3时,将使TL0和TH0分成两个相互独立的8位计数器。
当T1用作串行口波特率发生器时,才将T0定义为方式3,以增加一个8位计数器。当T1用作串行口波特率发生器时,才将T0定义为方式3,以增加一个8位计数器。
5.4 定时/计数器的编程举例 5.4.1计数初值的计算 设计数器最大计数值为M,则不同的工作方式,最大计数值M不同。 • 方式0:M=213=8192 • 方式1:M=216=65536 • 方式2、3:M=28=256
置入计数初值X的计算公式如下: 1.计数器方式:X=M-计数值 2.定时器方式:(M-X)×T=定时值 故,X=M - 定时值 / T • 其中T为计数周期,是单片机时钟的12分频,即单片机机器周期。当晶振为6 MHz时,T=2us,当晶振为12 MHz时,T=1us。
【例6-1】单片机晶振为12MHZ,要求T0产生500µs定时,计算计数初值X。【例6-1】单片机晶振为12MHZ,要求T0产生500µs定时,计算计数初值X。 解: 由于计数周期T=1µs,产生500µs定时,则需要“+1”计数500次,定时器方能产生溢出。 (1)采用方式0: X=213-500=7692=1E0CH; 11110000 01100B; 11110000 00001100B; F0H 装入TH0 0CH装入TL0;
(2)如果采用方式1: • X=216-500=65036=FE0CH; • 采用方式1时,则程序段如下: • TH1=(65536-500)/256; • TL1=(65536-500)%256;
5.4.2定时/计数器的初始化 初始化一般有以下几个步骤: ①确定工作方式----对方式寄存器TMOD赋值。 ②预置定时或计数初值----直接将初值写入TH0、TL0或TH1、TL1中。 ③根据需要对中断允许寄存器有关位赋值,以开放或禁止定时/计数器中断。 ④启动定时/计数器,使TCON中的TR1或TR0置1,计数器即按确定的工作方式和初值开始计数或定时。
着重介绍方式1、方式2的应用 5.4.3应用举例
【例6-5】采用12MHz晶振,在P1.0脚上输出周期为2.5s,占空比为20%的脉冲信号。【例6-5】采用12MHz晶振,在P1.0脚上输出周期为2.5s,占空比为20%的脉冲信号。 解: • 设置定时器0为工作方式1, TMOD=0x01; • 对于12MHz晶振,使用定时器最大定时为六十多ms,取10ms定时。 • 由于占空比为20%,高电平应为50次中断。 • 晶振=12MHz,定时10ms,则定时器的计数次数X为: X=10*10-3/机器周期=10*10-3/(12/ 12*10-6)=10000
#include<reg51.h> #define uchar unsigned char char time; uchar period=250; uchar high=50; sbit p1_0=P1^0; void time0( ) interrupt 1 using 1 { TH0=(65536-10000)/256; TL0=(65536-10000)%256; if (++time==high) p1_0=0 ; else if (time==period ) { time=0; p1_0=1; } }
void main( ) { TMOD=0x01; //设置定时器0为工作方式1 TH0=(65536-10000)/256; TL0=(65536-10000)%256; EA=1; //开总中断 ET0=1; //开定时器0中断 TR0=1; //启动定时器0 while(1); //等待中断 }
2.计数器方式的应用举例 【例6-6】用T1来计数,工作于方式2,要求每计满100次,将P1.0端取反。 解: • 设置T1为工作方式2,计数方式, TMOD=0x60 • 计数初值 X=28-100=156=9CH • TH1=TL1=9CH
C51程序如下: #include<reg51.h> void main( ) { TMOD=0x60; //设置T1为工作方式2,计数方式 TH1=0x9C; TL1=0x9C; //装入T1的计数初值 TR1=1; //启动定时/计数器1 for( ; ; ) { while ( !TF1); //查询等待TF1为1 p1_0=~ p1_0; //p1_0取反 TF1=0; } }
外部中断源的扩展方法之2 【例6-8】设T0为方式2(自动装入计数初值的8位计数器)计数方式工作时,编程实现只要对外来事件计数一次就产生中断请求解: 时间常数的计算: 方式2工作时,当计数到256时计数器就产生溢出。设时间常数为X,当发生一次外来事件时就溢出,则: X+1=256 X=256-1=11111111B=0FFH
设置T0为方式2,计数方式,时间常数为0FFH,允许中断,并令CPU开放中断。设置T0为方式2,计数方式,时间常数为0FFH,允许中断,并令CPU开放中断。 C51初始化程序段如下: TMOD=0x06; TL0=0x FF; TH0=0x FF; IE=0x82; TR0=1;
3.门控位的应用(TMOD) • 当GATE=1时,定时器的运行将同时受TRx位和外部中断引脚电平的控制。 • 只有在TRx=1,同时 =1时才能启动计数;若 =0,则停止计数。 • 利用这一特点可以极为方便地用于测试外部输入脉冲的宽度。
为低时,T1停止计数 (P3.3) 为高时,T1开始计数 【例6-9】利用T1的门控位GATE测试 /INT1(P3.3)引脚上出现的正脉冲宽度,设fosc=12 MHz,将所测得的高8位值存入变量H,低8位值存入变量L中。分析:设外部脉冲由/INT1(P3.3)输入,T1工作于定时器方式,选择操作模式1 ,GATE设为1,测试时,应在/INT1为低电平时,设置TR1为1,一旦/INT1变为高电平时,就启动计数;/INT1再次变化时,停止计数。此计数值即为被测正脉冲的宽度。
C51程序如下: #include<reg51.h> #define uchar unsigned char uchar H,L; sbit p3_3=P3^3; void main( ) { TMOD=0x90; //设置T1为工作方式1,定时方式 TH1=0x00; TL1=0x00; //装入T1的计数初值0 while(p3_3) ; //等待P3.3变低 TR1=1; while(!p3_3) ; //等待P3.3变高,启动计数 while(p3_3) ; //等待P3.3再次变低 TR1=0; H= TH1; //存计数值到变量H和L L= TL1; }
被测脉冲宽度的计算式为: 式中fcout为定时器的计数频率等于fosc/12;n为定时器中的计数值。
使用时注意的问题: 1、运行中读定时器/计数器 • 在改变定时器的内容之前,先使其停止运行,这是比较简单的方法。 • MCS-51的定时器/计数器在运行时,都可以对其读和写,先读高8位,再读低8位,最后再读一次高8位与前一次的结果比较。
小结 • 定时/计数器的工作原理 • 定时/计数器的控制寄存器和方式寄存器 • 定时/计数器的工作方式、计数初值的设置以及各种工作方式下的应用编程(方式1、2是重点,定时、计数应用是重点) 作业: P169、四、2