1.51k likes | 1.74k Views
第七章 定时计数器 与可编程计数器阵列 本章学习目标 掌握定时计数器的应用 掌握可编程时钟输出模块的应用 掌握可编程计数器阵列模块的应用. STC15F2K60S2 单片机内部集成了以下与定时 功能有关的模块: 1 ) 三个 16 位的定时 / 计数器 ,不仅可以方便地用于定时控制,而且还可以用作分频器和事件记录; 2 ) 可编程时钟输出功能 ,可给外部器件提供时钟;
E N D
第七章 定时计数器 与可编程计数器阵列 本章学习目标 • 掌握定时计数器的应用 • 掌握可编程时钟输出模块的应用 • 掌握可编程计数器阵列模块的应用
STC15F2K60S2单片机内部集成了以下与定时 功能有关的模块: 1)三个16位的定时/计数器,不仅可以方便地用于定时控制,而且还可以用作分频器和事件记录; 2)可编程时钟输出功能,可给外部器件提供时钟; 3)三路可编程计数器阵列(Programmable Counter Array,PCA)。可用于软件定时器、外部脉冲的捕捉、高速输出以及脉宽调制(Pulse Width Modulation ,PWM)输出。
§7.1定时/计数器及其应用 一、定时/计数器的结构及工作原理 定时/计数器的核心是一个加1计数器,加1计 数器的脉冲有两个来源,一个是外部脉冲源,另 一个是系统的时钟振荡器。 图7-1 定时/计数器的结构框图(x=0、1)
当脉冲源为时钟振荡器(等间隔脉冲序列)时,在每个时钟周期计数器加1,由于计数脉冲为一时间基准,所以脉冲数乘以脉冲间隔时间就是定时时间,因此为定时功能。当脉冲源为时钟振荡器(等间隔脉冲序列)时,在每个时钟周期计数器加1,由于计数脉冲为一时间基准,所以脉冲数乘以脉冲间隔时间就是定时时间,因此为定时功能。 • 当脉冲源为间隔不等的外部脉冲时,就是外部事件的计数器,计数器在其对应的外输入端上有一个1→0的跳变时加1。外部输入信号的速率是不受限制的,但必须保证给出的电平在变化前至少被采样一次。
图中有两个模拟的位开关,C/T决定其工作方式:是定时还是计数。后者受控制信号的控制,决定加1计数器的开启与运行。图中有两个模拟的位开关,C/T决定其工作方式:是定时还是计数。后者受控制信号的控制,决定加1计数器的开启与运行。 • 起这两个开关作用的是特殊功能寄存器TMOD和TCON的相应位,用户可对其进行设置,从而选择不同的工作方式(计数或定时)或是否启动计数器。另外,AUXR中的T0x12位和T1x12位决定是否对振荡时钟进行12分频。
工作原理 • 计数器对这两个脉冲源之一进行输入计数,每输入一个脉冲,计数值加1。当计数到计数器为全1时,再输入一个脉冲就使计数值回零,同时从最高位溢出一个脉冲使特殊功能寄存器TCON的TF0或TF1置1,作为计数器的溢出中断标志。 • 如果定时/计数器工作于定时状态,则表示定时时间到;若工作于计数状态,则表示计数回零。
CPU与TMOD、TCON、AUXR、T0、T1的关系图 • 16位的加1计数器由两个8位的特殊功能寄存器THX(高8位)和TLX(低8位)组成(X=0,1,下同)。 • 通过改变TMOD的相应位,它们可被设置为4种不同的工作方式。
STC15F2K60S2除了定时/计数器T0和T1外,还有一个16位定时器T2(简称T2)。STC15F2K60S2除了定时/计数器T0和T1外,还有一个16位定时器T2(简称T2)。 • T2的工作模式固定为16位自动重装载模式。T2可以当定时器使用,也可以用作串口的波特率发生器或可编程时钟输出源。 图7-3 定时器T2的原理框图
二、定时/计数器的相关寄存器 TMOD、TCON和AUXR用来确定定时/计数 器的工作方式并控制其功能。其中,TMOD控 制定时/计数器0和1的工作方式;TCON控制定 时器T0、T1的启停及状态;AUXR设置定时 器的速度和T2的功能。
1、TMOD:定时器工作方式控制寄存器 • TMOD(地址为89H,复位值为00H)寄存器的各位定义如下:
1)M1和M0:方式选择控制位 表7-1 定时/计数器的方式选择
2)C/ :功能选择位。 1:计数器功能(对T0或T1引脚的负跳变进行计数)。 0:定时器功能(对时钟周期进行计数)。
3)GATE:门控位。GATE用于选通控制。 1:INTX为高电平且TRX置位时,启动定时器工作。 0:每当TRX置位时,就启动定时器工作。 注意:TMOD寄存器不能进行位寻址,设置时只 能对整个寄存器赋值。
2、TCON:定时器控制寄存器 • TCON(地址为88H,复位值为00H)寄存器的格式如下:
1)TF1:T1溢出标志位。 T1启动计数后,最高位产生溢出时,TF1由硬件置1,向CPU请求中断,当CPU响应中断时,由硬件清0。TF1也可以由程序查询或清0。 2)TF0:定时器/计数器0溢出标志位。 含义和功能与TF1相似。
3)TR1:T1的运行控制位。可由软件置位或清0。 当GATE(TMOD.7)=0,TR1=1启动T1开始计数,TR1=0时停止T1计数。 当GATE(TMOD.7)=1,TR1=1且INTX输入高电平时,才允许T1计数。 4)TR0:定时器T0的运行控制位。 含义和功能与TR1相似。
由于定时/计数器是可编程的,所以在任何一个定时/计数器开始工作之前,必须对其写入相应的控制字。由于定时/计数器是可编程的,所以在任何一个定时/计数器开始工作之前,必须对其写入相应的控制字。 • 把方式控制字写入TMOD选择定时器的工作方式 • 把初值写入THX、TLX控制计数长度 • 将TCON相应位(TRX)置1或清零实现启动或停止计数。 在运行过程中,还可读出THX、TLX和TCON 的内容来随时查询T0、T1的状态。
3、AUXR:辅助寄存器 • 辅助寄存器AUXR主要用来设置定时器0的速度和定时器2的工能以及串口UART的波特率控制。 • STC15F2K60S2单片机是1T 的8051单片机,为了兼容传统8051单片机,定时器0和定时器1复位后是传统8051的速度,即12分频,但此时指令执行速度仍然是1T的速度。 通过设置特殊功能寄存器AUXR中相关的位,定时器也可不进行12分频,实现真正的1T速度。
辅助寄存器AUXR(地址为8EH,复位值为01H)各位定义如下:辅助寄存器AUXR(地址为8EH,复位值为01H)各位定义如下: 1)T0x12:定时器0速度控制位。 0:定时器0的速度与传统8051单片机定时器速度相同,即12分频。 1:定时器0的速度是传统8051单片机定时器速度的12倍,即不分频。
2)T1x12:(D6)定时器1速度控制位。 0:即12分频。 1:不分频。 如果UART串口用T1作为波特率发生器,T1x12位决定UART串口是12T 还是1T。 3)T2R:(D4)定时器2运行控制位。 0:不允许定时器2运行; 1:允许定时器2运行。
4)T2_C/ :(D3)定时器2工作方式选择。 0:定时器(计数脉冲从内部系统时钟输入; 1:计数器(计数脉冲从P3.1/T2引脚输入)。 5)T2x12:(D2)定时器2速度控制位。 0: 12分频,T2每12个时钟计数一次; 1:不分频,T2每1个时钟计数一次。
UART_M0x6用于控制UART串口的速度。 • S1S2为串行口1波特率发生器选择位。 • EXTRAM用于设置是否允许使用内部1024字节的扩展RAM。
4、T2H/RL_TH2:定时器2重装值寄存器高字节 (地址为0D6H,复位值为00H) 5、T2L/RL_TL2:定时器2重装值寄存器低字节 (地址为0D7H,复位值为00H)
三、定时/计数器的工作方式 通过对寄存器TMOD中M1、M0的设置,定时 /计数器有4种不同的工作方式: 方式0: 16位自动重装方式 方式1: 16位定时/计数器方式 方式2: 8位自动重装方式 方式3: 留作备用
1、定时/计数器0和1的工作方式0(16位自动重装方式)1、定时/计数器0和1的工作方式0(16位自动重装方式) 图7-4 定时器0和1的工作方式0的原理框图
STC15F2K60S2的定时器有两种计数速率:一种是12T模式,每12个时钟加1;另一种是1T模式,每个时钟加1。STC15F2K60S2的定时器有两种计数速率:一种是12T模式,每12个时钟加1;另一种是1T模式,每个时钟加1。 • T0和T1的速率分别由特殊功能寄存器AUXR中的T0x12和T1x12决定。 T0x12=0,T0工作在12T模式; T0x12=1,T0工作在1T模式。 T1x12=0,T1工作在12T模式; T1x12=1,T1则工作在1T模式。
如何实现16位重装载定时器。 • 定时器0和定时器1分别有2个隐藏的寄存器RL_THx和RL_TLx。 • RL_THx与THx共有同一个地址,RL_TLx与TLx共有同一个地址。 • 当TRx=0即定时器/计数器被禁止工作时,对TLx、THx写入的内容会同时写入RL_TLx、RL_THx。 • 当TRx=1即定时器/计数器工作时,对TLx 、THx写入的内容不会写入RL_TLx 、RL_THx。
当定时器工作在模式0时,[TLx,THx]的溢出 不仅置位TFx,而且会自动将[RL_TLx,RL_THx] 的内容重新装入[TLx,THx]。 • 当T0CLKO=1时,T1/P3.5引脚配置为定时器0的时钟输出CLKOUT0。 • 当T1CLKO=1时,T0/P3.4引脚配置为定时器1的时钟输出CLKOUT1。
2、定时/计数器0和1的工作方式1(16位定时/计数器方式)2、定时/计数器0和1的工作方式1(16位定时/计数器方式) 图7-5 定时器0和1的方式1的原理框图
此模式下,定时器配置为16位的计数器,由TLx的8位和THx的8位构成。TLx的8位溢出向THx进位,THx计数溢出置位TCON中的溢出标志位TFx。 • 与方式0的区别是,THx计数溢出时,不会重新装载时间常数。此外,本模式也不用于时钟输出功能。
3、定时/计数器0和1的工作方式2(8位自动重装方式)3、定时/计数器0和1的工作方式2(8位自动重装方式) 图7-6 定时/计数器的工作方式2原理框图
方式2是能自动重置初值的8位定时/计数器,计数溢出后具有自动恢复初值的功能。当TL0/TL1计数溢出时,不仅置位溢出标志TF0/TF1,还自动将TH0/TH1的内容送入TL0/TL1,使TL0/TL1从初值开始重新计数。用户可以通过程序把时间常数预置在TH0/TH1中,再装入后,TH0/TH1的内容保持不变。方式2是能自动重置初值的8位定时/计数器,计数溢出后具有自动恢复初值的功能。当TL0/TL1计数溢出时,不仅置位溢出标志TF0/TF1,还自动将TH0/TH1的内容送入TL0/TL1,使TL0/TL1从初值开始重新计数。用户可以通过程序把时间常数预置在TH0/TH1中,再装入后,TH0/TH1的内容保持不变。 • 当T0CLKO=1时,T1/P3.5引脚配置为定时器0的时钟输出CLKOUT0。 • 当T1CLKO=1时,T0/P3.4引脚配置为定时器1的时钟输出CLKOUT1。
在自动装载时间常数的工作方式中,用户不需要在中断服务程序中重载定时常数,可产生高精度的定时时间,适合用作较精确的定时脉冲信号发生器,如波特率发生器等。特别是工作方式0(16位自动重装方式),实际工程中应用更加方便,因此,建议读者尽量使用方式0进行定时器的应用设计。在自动装载时间常数的工作方式中,用户不需要在中断服务程序中重载定时常数,可产生高精度的定时时间,适合用作较精确的定时脉冲信号发生器,如波特率发生器等。特别是工作方式0(16位自动重装方式),实际工程中应用更加方便,因此,建议读者尽量使用方式0进行定时器的应用设计。 • 定时器2的工作方式与定时器0或1的工作方式0类似,读者可参照上述内容自行学习。
四、定时/计数器量程的扩展 在实际应用中,需要的定时时常常超过定时/计数器的定时能力,特别是当单片机的系统时钟频率较高时,定时时长就更为有限。为了满足需要,经常需要对单片机的定时计数能力进行扩展。
1、定时器的最大定时能力 • 当工作于定时状态时,定时/计数器是对时钟周期进行计数,若对时钟进行12分频,则对每12个时钟周期计数一次。 • 当晶振频率为6MHz,采用12分频时,计数的单位时间为: 单位时间为:Tu= = s=2μs 定时时间为:TC=XTu。其中,Tu为单位时间,TC为定时时间,X为所需计数次数。
STC15F2K60S2单片机的定时/计数器是加1计数器。因此,不能直接将实际的计数值作为计数初值送入计数寄存器THX、TLX中,而必须将实际计数值以28、216为模求补,以补码作为计数初值设置THX和TLX。STC15F2K60S2单片机的定时/计数器是加1计数器。因此,不能直接将实际的计数值作为计数初值送入计数寄存器THX、TLX中,而必须将实际计数值以28、216为模求补,以补码作为计数初值设置THX和TLX。 • 即应装入计数/定时器的初值为: 其中,n=8或16。
例如:已知Tu=2μs,要求定时TC=1ms,则 • 对方式0和方式1,时间常数为:216-500=65036=FE0CH (THX装入FEH,TLX装入0CH)。 设系统时钟频率为6MHz,12分频时, • 8位定时器的最大定时能力为:T=(28 -0)×2μs=512μs • 16位定时器的最大定时能力为:T=(216 -0)×2μs=131072μs=131.072ms
2、定时量程的扩展 定时量程的扩展分为软件扩展和硬件扩展两种 方法。 (1)软件扩展方法 软件扩展方法是在定时器中断服务程序中对定 时器中断请求进行计数,当中断请求的次数达到 要求的值时才进行相应的处理。
例如,某事件的处理周期为1s • 由于受到最大定时时间的限制,无法一次完成定时。 • 此时可以将定时器的定时时间设为以10ms为一个单位,启动定时器后,每一次定时器溢出中断将产生10ms的定时。 • 进入中断服务程序后,对定时器的中断次数进行计数,每计数100次进行一次事件的处理,则可实现1s的定时效果。 这是最常用的方法。
(2)硬件扩展方法 • 硬件扩展方法可以使用外接通用定时器芯片对单片机的定时能力进行扩展。 • 也可以利用单片机自身的资源对定时能力进行扩展。 • 例如,将两个定时器串联起来使用(其中,一个工作于定时方式,另一个工作于计数方式,请读者分析其最大定时时间)。 由于该扩展方法占用较多的资源,较少采用。
五、定时/计数器编程举例 • 一般定时/计数器的应用采用中断方式,因此,编程时主要考虑两点: • 正确初始化,包括写入控制字、时间常数的计算并装入; • 中断服务程序的编写,在中断服务程序中编写实现需要定时完成的任务代码。
在定时/计数器初始化部分的一般步骤大致如下:在定时/计数器初始化部分的一般步骤大致如下: • 设置工作方式,将控制字写入TMOD寄存器。(对于T0和T1)或AUXR(对于T2)。(注意TMOD不能进行位寻址)。 • 设置分频方式,将控制字写入AUXR寄存器。默认的情况是12分频(兼容传统8051单片机),如使用传统8051单片机模式,无需设置。 • 计算定时/计数初值,并将其装入TLX、THX寄存器。(对于T0和T1)或T2L、T2H寄存器(对于T2)。 • 置位ETX和EA允许定时/计数器中断(如果需要)。 • 置位TRX(对于T0和T1)或T2R(对于T2)以启动定时/计数。 • 在中断服务程序中,要注意计数初值的重新装入问题。
【例7-1】 设系统时钟频率为6MHz,利用T0定时,每隔1s将P2.0的状态取反。 解: • 所要求的定时时间1s超过了定时器的定时能力(时钟频率为6MHz,12分频时,16位定时器的最长定时时间为131.072ms),所以无法采用定时器直接实现1s的定时。 • 将定时器的定时时间设为50ms,在中断服务程序中对定时器溢出中断请求进行计数,当计够20次时,将P2.0的状态取反,否则直接返回主程序,从而达到1s的定时。
选择T0为16位定时器方式,方式字为01H。系统时钟频率为6MHz,12分频时,计数单位时间间隔为2μs。T0的计数初值为:选择T0为16位定时器方式,方式字为01H。系统时钟频率为6MHz,12分频时,计数单位时间间隔为2μs。T0的计数初值为:
$INCLUDE (STC12.INC) ;包含STC12C5A60S2寄存器定义文件 ORG 0000H LJMP MAIN ;转主程序 ORG 000BH ;T0中断服务程序入口地址 LJMP T0_ISR ORG 0100H MAIN: MOV SP,#7FH ;设置堆栈指针 MOV TMOD,#01H;T0初始化 MOV TL0,#58H MOV TH0,#9EH MOV A,#20 ;累加器A置20 SETB ET0;允外T0中断 SETB EA ;CPU开中断 SETB TR0;启动T0计数 SJMP $ ;等待
T0_ISR:MOV TL0,#58H MOV TH0,#9EH ;重新装入时间常数 DEC A ; 累加器A内容减1 JNZ EXIT CPL P2.0 MOV A,#20 ;累加器A重载20 EXIT: RETI END 程序中的符号“$”表示“本条指令地址”,指令“SJMP $”相当于: “HERE: LJMP HERE”。
#include “stc12.h” //包含STC12C5A60S2的寄存器定义文件 sbit P20=P2^0; //声明P2.0的引脚位变量 unsigned char i; //声明计数变量。C语言程序中尽量不要使用ACC void main (void) { //SP=0x60; //使用C语言设计程序时,可以不设置堆栈指针 TMOD=0x01; TL0=0x58; TH0=0x9E; i=20; //计数变量赋初值 ET0=1;//允许T0中断 EA = 1; //开放总的中断 TR0=1; //启动T0计数 while(1); //等待中断 }
void T0_ISR (void) interrupt 1 //定时器T0中断函数 { TL0=0x58; //重新装入时间常数 TH0=0x9E; i--; //计数变量减1 if(i==0) { //若减到0,则将P2.0取反 P20 = !P20; //将P2.0取反 i = 20; //重新给计数变量赋值 } }
若使用工作方式0,则上述程序中,除了将TMOD的值设置为0以外,在中断服务程序中,不再需要重新装入时间常数,即:若使用工作方式0,则上述程序中,除了将TMOD的值设置为0以外,在中断服务程序中,不再需要重新装入时间常数,即: • 在汇编语言程序的中断服务程序中可以省去下面的两句: MOV TL0,#58H MOV TH0,#9EH ;重新装入时间常数 • 在C语言程序的中断服务程序中可以省去下面的两句: TL0=0x58; TH0=0x9E; //重新装入时间常数 • 其他部分的程序不变。 • 对于1T模式的使用,请读者自行实验学习。 思考:若晶振频率修改为11.0592MHz,时间常数应为多少?
【例7-2】设时钟频率为18.432MHz,使用定时器2定时,使P0.0口输出38.4KHZ的方波。【例7-2】设时钟频率为18.432MHz,使用定时器2定时,使P0.0口输出38.4KHZ的方波。 汇编代码如下: $INCLUDE (STC15.INC) ;包含寄存器定义文件 ;定义38.4KHz时的时间常数 (65536-18432000/12/38400/2) T38_4KHz EQU 0FFECH TEST_PIN BIT P0.0 ;测试引脚定义 ORG 0000H LJMP MAIN ORG 0063H ;定时器2的中断服务程序入口地址 LJMP T2_ISR