插播4 定时计数器.ppt_第1页
插播4 定时计数器.ppt_第2页
插播4 定时计数器.ppt_第3页
插播4 定时计数器.ppt_第4页
插播4 定时计数器.ppt_第5页
已阅读5页,还剩146页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1/164,第七章 定时计数器 与可编程计数器阵列 本章学习目标 掌握定时计数器的应用 掌握可编程时钟输出模块的应用(实验) 掌握可编程计数器阵列模块的应用 (脉宽调制效应),2/164,K60S2单片机内部集成了以下与定时 功能有关的模块: 1)三个16位的定时/计数器,不仅可以方便地用于定时控制,而且还可以用作分频器和事件记录; 2)可编程时钟输出功能,可给外部器件提供时钟; 3)三路可编程计数器阵列(Programmable Counter Array,PCA)。可用于软件定时器、外部脉冲的捕捉、高速输出以及脉宽调制(Pulse Width Modulation ,PWM)输出。,3/1

2、64,一、定时/计数器的结构及工作原理 定时/计数器的核心是一个加1计数器,加1计 数器的脉冲有两个来源,一个是外部脉冲源,另 一个是系统的时钟振荡器。,7.1定时/计数器及其应用,图7-1 定时/计数器的结构框图(x=0、1),4/164,当脉冲源为时钟振荡器(等间隔脉冲序列)时,在每个时钟周期计数器加1,由于计数脉冲为一时间基准,所以脉冲数乘以脉冲间隔时间就是定时时间,因此为定时功能。 当脉冲源为间隔不等的外部脉冲时,就是外部事件的计数器,计数器在其对应的外输入端上有一个10的跳变时加1。外部输入信号的速率是不受限制的,但必须保证给出的电平在变化前至少被采样一次。,5/164,图中有两个模

3、拟的位开关,C/T决定其工作方式:是定时还是计数。后者受控制信号的控制,决定加1计数器的开启与运行。 起这两个开关作用的是特殊功能寄存器TMOD和TCON的相应位,用户可对其进行设置,从而选择不同的工作方式(计数或定时)或是否启动计数器。另外,AUXR中的T0 x12位和T1x12位决定是否对振荡时钟进行12分频。,6/164,工作原理 计数器对这两个脉冲源之一进行输入计数,每输入一个脉冲,计数值加1。当计数到计数器为全1时,再输入一个脉冲就使计数值回零,同时从最高位溢出一个脉冲使特殊功能寄存器TCON的TF0或TF1置1,作为计数器的溢出中断标志。 如果定时/计数器工作于定时状态,则表示定时

4、时间到;若工作于计数状态,则表示计数回零。,7/164,CPU与TMOD、TCON、AUXR、T0、T1的关系图 16位的加1计数器由两个8位的特殊功能寄存器THX(高8位)和TLX(低8位)组成(X=0,1,下同)。 通过改变TMOD的相应位,它们可被设置为4种不同的工作方式。,8/164,STC15F2K60S2除了定时/计数器T0和T1外,还有一个16位定时器T2(简称T2)。 T2的工作模式固定为16位自动重装载模式。T2可以当定时器使用,也可以用作串口的波特率发生器或可编程时钟输出源。,图7-3 定时器T2的原理框图,9/164,二、定时/计数器的相关寄存器 TMOD、TCON和AU

5、XR用来确定定时/计数 器的工作方式并控制其功能。其中,TMOD控 制定时/计数器0和1的工作方式;TCON控制定 时器T0、T1的启停及状态;AUXR设置定时 器的速度和T2的功能。,10/164,1、TMOD:定时器工作方式控制寄存器 TMOD(地址为89H,复位值为00H)寄存器的各位定义如下:,11/164,1)M1和M0:方式选择控制位,表7-1 定时/计数器的方式选择,12/164,2)C/ :功能选择位。 1:计数器功能(对T0或T1引脚的负跳变进行计数)。 0:定时器功能(对时钟周期进行计数)。,13/164,3)GATE:门控位。GATE用于选通控制。 1:为高电平且TRX置

6、位时,启动定时器工作。 0:每当TRX置位时,就启动定时器工作。 注意:TMOD寄存器不能进行位寻址,设置时只 能对整个寄存器赋值。,14/164,2、TCON:定时器控制寄存器 TCON(地址为88H,复位值为00H)寄存器的格式如下:,15/164,1)TF1:T1溢出标志位。 T1启动计数后,最高位产生溢出时,TF1由硬件置1,向CPU请求中断,当CPU响应中断时,由硬件清0。TF1也可以由程序查询或清0。 2)TF0:定时器/计数器0溢出标志位。 含义和功能与TF1相似。,16/164,3)TR1:T1的运行控制位。可由软件置位或清0。 当GATE(TMOD.7)=0,TR1=1启动T

7、1开始计数,TR1=0时停止T1计数。 当GATE(TMOD.7)=1,TR1=1且输入高电平时,才允许T1计数。 4)TR0:定时器T0的运行控制位。 含义和功能与TR1相似。,17/164,由于定时/计数器是可编程的,所以在任何一个定时/计数器开始工作之前,必须对其写入相应的控制字。 把方式控制字写入TMOD选择定时器的工作方式 把初值写入THX、TLX控制计数长度 将TCON相应位(TRX)置1或清零实现启动或停止计数。 在运行过程中,还可读出THX、TLX和TCON 的内容来随时查询T0、T1的状态。,18/164,3、AUXR:辅助寄存器 辅助寄存器AUXR主要用来设置定时器0的速度

8、和定时器2的工能以及串口UART的波特率控制。 STC15F2K60S2单片机是1T 的8051单片机,为了兼容传统8051单片机,定时器0和定时器1复位后是传统8051的速度,即12分频,但此时指令执行速度仍然是1T的速度。 通过设置特殊功能寄存器AUXR中相关的位,定时器也可不进行12分频,实现真正的1T速度。,19/164,辅助寄存器AUXR(地址为8EH,复位值为00H)各位定义如下:,1)T0 x12:定时器0速度控制位。 0:定时器0的速度与传统8051单片机定时器速度相同,即12分频。 1:定时器0的速度是传统8051单片机定时器速度的12倍,即不分频。,20/164,2)T1x

9、12:(D6)定时器1速度控制位。 0:即12分频。 1:不分频。 如果UART串口用T1作为波特率发生器,T1x12位决定UART串口是12T 还是1T。,3)T2R:(D4)定时器2运行控制位。 0:不允许定时器2运行; 1:允许定时器2运行。,21/164,4)T2_C/ :(D3)定时器2工作方式选择。 0:定时器(计数脉冲从内部系统时钟输入; 1:计数器(计数脉冲从P3.1/T2引脚输入)。,5)T2x12:(D2)定时器2速度控制位。 0: 12分频,T2每12个时钟计数一次; 1:不分频,T2每1个时钟计数一次。,22/164,UART_M0 x6和S1BRS用于控制UART串口

10、的速度。 EXTRAM用于设置是否允许使用内部1024字节的扩展RAM。,23/164,4、T2H/RL_TH2:定时器2重装值寄存器高字节 (地址为0D6H,复位值为00H),5、T2L/RL_TL2:定时器2重装值寄存器低字节 (地址为0D7H,复位值为00H),24/164,三、定时/计数器的工作方式 通过对寄存器TMOD中M1、M0的设置,定时 /计数器有4种不同的工作方式: 方式0: 16位自动重装方式 方式1: 16位定时/计数器方式 方式2: 8位自动重装方式 方式3: 留作备用,25/164,1、定时/计数器0和1的工作方式0(16位自动重装方式),图7-4 定时器0和1的工作

11、方式0的原理框图,26/164,STC15F2K60S2的定时器有两种计数速率:一种是12T模式,每12个时钟加1;另一种是1T模式,每个时钟加1。 T0和T1的速率分别由特殊功能寄存器AUXR中的T0 x12和T1x12决定。 T0 x12=0,T0工作在12T模式; T0 x12=1,T0工作在1T模式。 T1x12=0,T1工作在12T模式; T1x12=1,T1则工作在1T模式。,27/164,如何实现16位重装载定时器。 定时器0和定时器1分别有2个隐藏的寄存器RL_THx和RL_TLx。 RL_THx与THx共有同一个地址,RL_TLx与TLx共有同一个地址。 当TRx=0即定时器

12、/计数器被禁止工作时,对TLx、THx写入的内容会同时写入RL_TLx、RL_THx。 当TRx=1即定时器/计数器工作时,对TLx 、THx写入的内容不会写入RL_TLx 、RL_THx。,28/164,当定时器工作在模式0时,TLx,THx的溢出 不仅置位TFx,而且会自动将RL_TLx,RL_THx 的内容重新装入TLx,THx。 当T0CLKO=1时,T1/P3.5引脚配置为定时器0的时钟输出CLKOUT0。 当T1CLKO=1时,T0/P3.4引脚配置为定时器1的时钟输出CLKOUT1。,29/164,2、定时/计数器0和1的工作方式1(16位定时/计数器方式),图7-5 定时器0和

13、1的方式1的原理框图,30/164,此模式下,定时器配置为16位的计数器,由TLx的8位和THx的8位构成。TLx的8位溢出向THx进位,THx计数溢出置位TCON中的溢出标志位TFx。 与方式0的区别是,THx计数溢出时,不会重新装载时间常数。此外,本模式也不用于时钟输出功能。,31/164,3、定时/计数器0和1的工作方式2(8位自动重装方式),图7-6 定时/计数器的工作方式2原理框图,32/164,方式2是能自动重置初值的8位定时/计数器,计数溢出后具有自动恢复初值的功能。当TL0/TL1计数溢出时,不仅置位溢出标志TF0/TF1,还自动将TH0/TH1的内容送入TL0/TL1,使TL

14、0/TL1从初值开始重新计数。用户可以通过程序把时间常数预置在TH0/TH1中,再装入后,TH0/TH1的内容保持不变。 当T0CLKO=1时,T1/P3.5引脚配置为定时器0的时钟输出CLKOUT0。 当T1CLKO=1时,T0/P3.4引脚配置为定时器1的时钟输出CLKOUT1。,33/164,在自动装载时间常数的工作方式中,用户不需要在中断服务程序中重载定时常数,可产生高精度的定时时间,适合用作较精确的定时脉冲信号发生器,如波特率发生器等。特别是工作方式0(16位自动重装方式),实际工程中应用更加方便,因此,建议读者尽量使用方式0进行定时器的应用设计。 定时器2的工作方式与定时器0或1的

15、工作方式0类似,读者可参照上述内容自行学习。,34/164,四、定时/计数器量程的扩展 在实际应用中,需要的定时时常常超过定时/计数器的定时能力,特别是当单片机的系统时钟频率较高时,定时时长就更为有限。为了满足需要,经常需要对单片机的定时计数能力进行扩展。,35/164,1、定时器的最大定时能力 当工作于定时状态时,定时/计数器是对时钟周期进行计数,若对时钟进行12分频,则对每12个时钟周期计数一次。 当晶振频率为6MHz,采用12分频时,计数的单位时间为: 单位时间为: Tu= = s=2s 定时时间为:TC=XTu。其中,Tu为单位时间,TC为定时时间,X为所需计数次数。,36/164,S

16、TC15F2K60S2单片机的定时/计数器是加1计数器。因此,不能直接将实际的计数值作为计数初值送入计数寄存器THX、TLX中,而必须将实际计数值以28、216为模求补,以补码作为计数初值设置THX和TLX。 即应装入计数/定时器的初值为: 其中,n=8或16。,37/164,例如:已知Tu2s,要求定时TC1ms,则 对方式0和方式1,时间常数为:216500=65036=FE0CH (THX装入FEH,TLX装入0CH)。 设系统时钟频率为6MHz,12分频时, 8位定时器的最大定时能力为:T(28 0)2s512s 16位定时器的最大定时能力为:T(216 0)2s131072s131.

17、072ms,38/164,2、定时量程的扩展 定时量程的扩展分为软件扩展和硬件扩展两种 方法。 (1)软件扩展方法 软件扩展方法是在定时器中断服务程序中对定 时器中断请求进行计数,当中断请求的次数达到 要求的值时才进行相应的处理。,39/164,例如,某事件的处理周期为1s 由于受到最大定时时间的限制,无法一次完成定时。 此时可以将定时器的定时时间设为以10ms为一个单位,启动定时器后,每一次定时器溢出中断将产生10ms的定时。 进入中断服务程序后,对定时器的中断次数进行计数,每计数100次进行一次事件的处理,则可实现1s的定时效果。 这是最常用的方法。,40/164,(2)硬件扩展方法 硬件

18、扩展方法可以使用外接通用定时器芯片对单片机的定时能力进行扩展。 也可以利用单片机自身的资源对定时能力进行扩展。 例如,将两个定时器串联起来使用(其中,一个工作于定时方式,另一个工作于计数方式,请读者分析其最大定时时间)。 由于该扩展方法占用较多的资源,较少采用。,41/164,五、定时/计数器编程举例 一般定时/计数器的应用采用中断方式,因此,编程时主要考虑两点: 正确初始化,包括写入控制字、时间常数的计算并装入; 中断服务程序的编写,在中断服务程序中编写实现需要定时完成的任务代码。,42/164,在定时/计数器初始化部分的一般步骤大致如下: 设置工作方式,将控制字写入TMOD寄存器。(对于T

19、0和T1)或AUXR(对于T2)。(注意TMOD不能进行位寻址)。 设置分频方式,将控制字写入AUXR寄存器。默认的情况是12分频(兼容传统8051单片机),如使用传统8051单片机模式,无需设置。 计算定时/计数初值,并将其装入TLX、THX寄存器。(对于T0和T1)或T2L、T2H寄存器(对于T2)。 置位ETX和EA允许定时/计数器中断(如果需要)。 置位TRX(对于T0和T1)或T2R(对于T2)以启动定时/计数。 在中断服务程序中,要注意计数初值的重新装入问题。,43/164,【例7-1】 设系统时钟频率为6MHz,利用T0定时,每隔1s将P2.0的状态取反。 解: 所要求的定时时间

20、1s超过了定时器的定时能力(时钟频率为6MHz,12分频时,16位定时器的最长定时时间为131.072ms),所以无法采用定时器直接实现1s的定时。 将定时器的定时时间设为50ms,在中断服务程序中对定时器溢出中断请求进行计数,当计够20次时,将P2.0的状态取反,否则直接返回主程序,从而达到1s的定时。,44/164,选择T0为16位定时器方式,方式字为01H。系统时钟频率为6MHz,12分频时,计数单位时间间隔为2s。T0的计数初值为:,45/164,$INCLUDE (STC15.INC) ;包含STC15F2K60S2寄存器定义文件 ORG0000H LJMP MAIN ;转主程序 O

21、RG 000BH;T0中断服务程序入口地址 LJMPT0_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 $ ;等待,46/164,T0_ISR:MOV TL0,#58H MOV TH0,#9EH;重新装入时间常数 DEC A ; 累加器A内容减1 JNZEXIT CPL P2.0 MOV A,#20 ;累加器A重载20 EX

22、IT:RETI END 程序中的符号“$”表示“本条指令地址”,指令“SJMP $”相当于: “HERE: LJMP HERE”。,47/164,#include “stc15.h”/包含STC15F2K60S2的寄存器定义文件 sbit P20=P20;/声明P2.0的引脚位变量 unsigned char i; /声明计数变量。C语言程序中尽量不要使用ACC void main (void) /SP=0 x60; /使用C语言设计程序时,可以不设置堆栈指针 TMOD=0 x01; TL0=0 x58; TH0=0 x9E; i=20;/计数变量赋初值 ET0=1;/允许T0中断 EA =

23、1;/开放总的中断 TR0=1;/启动T0计数 while(1); /等待中断 ,48/164,void T0_ISR (void) interrupt 1 /定时器T0中断函数 TL0=0 x58;/重新装入时间常数 TH0=0 x9E; i-;/计数变量减1 if(i=0) /若减到0,则将P2.0取反 P20 = !P20; /将P2.0取反 i = 20;/重新给计数变量赋值 ,49/164,若使用工作方式0,则上述程序中,除了将TMOD的值设置为0以外,在中断服务程序中,不再需要重新装入时间常数,即: 在汇编语言程序的中断服务程序中可以省去下面的两句: MOV TL0,#58H MO

24、V TH0,#9EH;重新装入时间常数 在C语言程序的中断服务程序中可以省去下面的两句: TL0=0 x58; TH0=0 x9E; /重新装入时间常数 其他部分的程序不变。 对于1T模式的使用,请读者自行实验学习。,50/164,【例7-2】设时钟频率为18.432MHz,使用定时器2定时,使P0.0口输出38.4KHZ的方波。,汇编代码如下: $INCLUDE (STC15.INC) ;包含STC15F2K60S2寄存器定义文件 ;定义38.4KHz时的时间常数 (65536-18432000/12/38400/2) T38_4KHz EQU 0FFECH TEST_PIN BIT P0.

25、0 ;测试引脚定义 ORG0000H LJMPMAIN ORG0063H ;定时器2的中断服务程序入口地址 LJMPT2_ISR,51/164,MAIN: MOV SP,#70H;设置堆栈指针 ORLAUXR,#04H;设置T2为1T模式 MOV T2H,#HIGH T38_4KHz;设置定时器2重装载时间 常数的高字节 MOV T2L,#LOW T38_4KHz;设置定时器2重装载时间 常数的低字节 ORLAUXR,#10 H;启动定时器2 ORLIE2,#04H;允许定时器2中断 SETBEA;开放CPU中断 SJMP$ ;定时器2中断服务程序 T2_ISR: CPLTEST_PIN RE

26、TI END,52/164,对应的C语言代码如下: #include “stc15.h”/包含STC15F2K60S2的寄存器定义文件 typedef unsigned char BYTE; typedef unsigned int WORD; #define FOSC 18432000L #define T38_4KHz (65536-18432000/12/38400/2) /38.4KHz sbit TEST_PIN = P00; /定义测试引脚 void main(void) AUXR|= 0 x04;/设置T2为1T模式 T2H = T38_4KHz8; /设置T2重装时间常数的高字

27、节 T2L = T38_4KHz; /设置T2重装时间常数的低字节 AUXR |= 0 x10; /启动定时器2 IE2 |= 0 x04; /允许定时器2中断 EA = 1; /开放CPU中断 while (1); /循环等待中断 /定时器2中断服务函数 void t2_isr(void) interrupt 12 TEST_PIN = TEST_PIN; ,53/164,【例7-3】 利用定时器的门控方式实现正脉冲的 脉宽测量。 当GATE=1,TRX=1,只有引脚输入高电平时,TX才被允许计数,利用这一特点,就可以测量引脚上正脉冲的宽度。 以T0为例的门控法测量示意图如图所示。,图7-7

28、 利用门控法测量脉冲宽度,54/164,解:以T0为例,下面给出实现这一方法的关键代码,完整的 汇编语言程序和对应的C语言程序,请读者自行编写。 MOVTMOD,#09H ; T0工作于16位定时方式、GATE置1 MOVTL0,#00H MOVTH0,#00H CLREX0 ;关外部中断 JNBP3.2,$ ;等待升高 SETBTR0 JBP3.2,$ ;等待下降 CLRTR0 ;关T0 MOVA,TL0 ;T0内容高8位送B,低8位送A MOVB,TH0 ;计算脉宽或送显示器显示,55/164,思考: (1)当脉冲宽度超过定时器的最大定时时间应该如何处理? (2)在动态读取运行中的定时/计

29、数器的计数值时,如果不加注意,就可能出错。这是因为不可能在同一时刻同时读取TH0和TL0中的计数值。比如,先读TL0后读TH0,因为定时/计数器处于运行状态,在读TL0时尚未产生向TH0进位,而在读TH0前已产生进位,这时读得的TH0就不对了;同样,先读TH0后读TL0也可能出错。如何解决这个问题?,56/164,7.2可编程时钟输出模块及其应用,在控制系统中,有时需要为单片机外部的器 件提供时钟控制,为此,STC12C5A60S2单片 机提供了4路可编程时钟输出功能。 MCLKO/P5.4, CLKOUT0/P3.5,CLKOUT1/P3.4, T2CLKO/P3.0。 只有内部R/C时钟频

30、率为12MHz以下时, MCLKO/P5.4才能正常输出。,57/164,一、可编程时钟输出的相关寄存器 1、主时钟输出 主时钟可以是内部高精度R/C时钟,也可以是外部输入的时钟或外部晶体振荡产生的时钟。 MCLKO/P5.4的时钟输出控制由CLK_DIV寄存器的MCKO_S1和MCKO_S0位控制。通过 设置MCKO_S1和MCKO_S0可将MCLKO/P5.4 管脚配置为主时钟输出,同时,还可以设置输 出频率。,58/164,时钟分频寄存器CLK_DIV(也称为PCON2,地址为97H,复位值为0000 x000B)的各位定义如下:,59/164,主时钟的输出频率由MCKO_S1和MCKO

31、_S0控制。,表7-2 主时钟的输出频率设置,其中,MCLK指主时钟频率。 IO口输出的频率最高可达13.5MHz。,60/164,2、T2CLKO/P3.0、T1CLKOU/P3.4和T0CLKOU/P3.5的时钟输出 T2CLKO/P3.0、T1CLKOU/P3.4和T0CLKOU/P3.5的时钟输出分别由外部中断使能和时钟输出寄存器INT_CLKO (也称为AUXR2)的T2CLKO、T1CLKO和T0CLKO位控制。 CLKOUT0的输出时钟频率由定时器0控制,CLKOUT1的输出时钟频率由定时器1控制,T2CLKO的输出时钟频率由定时器2控制 定时器需要工作在定时器方式0(16位自动

32、重装模式)或方式2(8位自动重装载模式),不允许定时器中断,以免CPU反复进中断。,61/164,外部中断使能和时钟输出寄存器INT_CLKO(地址为8FH,复位值为X0000000B)各位的定义如下:,62/164,1)T2CLKO:是否将P3.0脚设置为定时器2(T2)的时钟输出T2CLKO。 T2CLKO=1 设P3.0引脚为T2的时钟输出 输出频率=T2溢出率/2 如果T2_C/T=0,定时器/计数器T2对内部系统时钟计数,则: T2工作在1T模式时的输出频率=(SYSclk) / (65536-RL_TH2, RL_TL2)/2 T2工作在12T模式时的输出频率= (SYSclk)

33、/12/ (65536-RL_TH2, RL_TL2)/2 如果T2_C/T=1,定时器/计数器T2对外部脉冲输入(P3.1/T2)计数,则输出时钟频率= (T2_Pin_CLK) / (65536-RL_TH2, RL_TL2)/2 T2CLKO=0 不允许P3.0引脚为T2的时钟输出,63/164,当T1CLKO=1时,将P3.4/T0脚配置为定时器1的时钟输出T1CLKO。 输出时钟频率= T1溢出率/2。 定时器/计数器T1工作在定时器模式0(16位自动重装模式)时,如果C/T=0, 定时器/计数器T1对内部系统时钟计数,则: T1工作在1T模式时的输出频率=(SYSclk) / (6

34、5536-RL_TH1, RL_TL1)/2 T1工作在12T模式时的输出频率= (SYSclk) /12/ (65536-RL_TH1, RL_TL1)/2 如果C/T =1,定时器/计数器T1对外部脉冲输入(P3.5/T1)计数, 则输出时钟频率= (T1_Pin_CLK) / (65536-RL_TH1, RL_TL1)/2 定时器/计数器T1工作在模式2(8位自动重装模式)时, 如果C/T=0,定时器/计数器T1对内部系统时钟计数,则: T1工作在1T模式时的输出频率 = (SYSclk) / (256-TH1)/2 T1工作在12T模式时的输出频率= (SYSclk)/12/(256

35、-TH1)/2 如果C/T=1,定时器/计数器T1是对外部脉冲输入(P3.5/T1)计数,则: 输出时钟频率= (T1_Pin_CLK) / (256-TH1) / 2 当T1CLKO=0时,不允许P3.4/T0管脚被配置为定时器1的时钟输出。,2)T1CLKO:是否允许将P3.4脚配置为定时器1(T1)的时钟输出T1CLKO。设置方法与T2相同。,64/164,3)T0CLKO:是否允许将P3.5脚配置为定时器0(T0)的时钟输出T0CLKO。,当T0CLKO=1时,将P3.5/T1管脚配置为定时器0的时钟输出T0CLKO,输出时钟频率=T0溢出率/2。 定时器/计数器T0工作在定时器模式0

36、(16位自动重装模式)时,如果C/T =0,定时器/计数器T0对内部系统时钟计数,则: T0工作在1T模式时的输出频率= (SYSclk)/(65536-RL_TH0, RL_TL0)/2 T0工作在12T模式时的输出频率= (SYSclk) /12/ (65536-RL_TH0, RL_TL0)/2 如果C/T=1,定时器/计数器T0对外部脉冲输入(P3.4/T0)计数,则: 输出时钟频率= (T0_Pin_CLK) / (65536-RL_TH0, RL_TL0)/2 定时器/计数器T0工作在定时器模式2(8位自动重装模式)时,如果C/T=0,则: T0工作在1T模式时的输出频率= (SY

37、Sclk) / (256-TH0) / 2 T0工作在12T模式时的输出频率= (SYSclk) / 12 / (256-TH0) / 2 如果C/T=1,定时器/计数器T0对外部脉冲输入(P3.4/T0)计数,则: 输出时钟频率= (T0_Pin_CLK) / (256-TH0) / 2 当T0CLKO=0时,不允许P3.5/T1管脚被配置为定时器0的时钟输出。,65/164,二、可编程时钟输出的编程实例 1、如果要使用主时钟输出,例如,从P5.4输出时钟信号,频率是SYSclk,只需加入下面的语句即可: MOV CLK_DIV,#40H ;在汇编语言程序中 CLK_DIV = 0 x40;

38、 /在C语言程序中,66/164,2、如果需要从T0CLKO/P3.5引脚输出时钟,需要在用户程序中进行下面的设置: 设置定时器0的工作方式为方式0或方式2(将TMOD低4位设为0或者2); 设置16位或8位重装载值(分别设置TL0和TH0); 启动定时器0工作(将TR0设置为1); 对INT_CLKO寄存器中的T0CLKO位置1,让定时器0的溢出在P3.5引脚输出时钟。,67/164,3、如果需要从T1CLKO/P3.4引脚输出时钟,需要在用户程序中进行下面的设置: 设置定时器1的工作方式为方式0或方式2(将TMOD的高4位设为0或2); 设置16位或8位重装载值(分别设置TL1和TH1);

39、 启动定时器1工作(将TR1设置为1); 对INT_CLKO寄存器中的T1CLKO位置1,让定时器1的溢出在P3.4引脚输出时钟。,68/164,4、如果需要从T2CLKO/P3.0引脚输出时钟,需要在用户程序中进行下面的设置: 设置16位重装载值(分别设置T2H和T2L); 对AUXR寄存器中的T2R位置1,T2_C/清零,让定时器2运行; 对INT_CLKO寄存器中的T2CLKO位置1,让定时器2的溢出在P3.0引脚输出时钟。,69/164,下面以一个具体实例,说明如何使用 STC15F2K60S2单片机的可编程时钟输出功能。 【例7-4】 设时钟频率SYSclk=18.432MHz,设计

40、程序,从T0(P3.4)引脚输出频率为125KHz的时钟;从T1(P3.5)引脚输出频率为38.4KHz的时钟。,70/164,解: 使用STC15F2K60S2的可编程时钟输出功能完成所需要求。在下面的程序设计中(在此只给出C语言程序),T0和T1均工作在1T模式。,71/164,#include stc15.h /包含STC15F2K60S2的寄存器定义头文件 void main(void) TMOD = 0 x22; /T0和T1工作在方式2,8位自动重装计数器 AUXR = AUXR | 0 x80; /T0工作在1T模式 AUXR = AUXR | 0 x40; /T1工作在1T模式

41、 /设置T0的8位自动重装计数初值,输出频率=18432000/2/74约为125KHz TH0 = (256-74); TL0 = (256-74); /设置T1的8位自动重装计数初值,输出时钟频率18432000/2/240 = 38400Hz TH1 = (256-240); TL1 = (256-240); TR0 = 1; /启动T0开始计数,对系统时钟进行分频输出 TR1 = 1; /启动T1开始计数,对系统时钟进行分频输出 INT_CLKO =INT_CLKO|0 x03; /允许时钟输出 /至此时钟已经输出,用户可以通过示波器观看到输出的时钟频率 while(1); ,72/1

42、64,【例7-5】设时钟频率为18.432MHz,使用定时器2的时钟输出功能,使P3.0口输出38.4KHZ的方波。 $INCLUDE (STC15.INC) ;包含STC15F2K60S2寄存器定义文件 ;定义常数 T38_4KHz EQU 0FFECH ;38.4KHz (65536-18432000/12/38400/2) ;12T模式下的重装时间常数 T2CLKO BIT P3.0;时钟输出引脚 ORG0000H LJMPMAIN MAIN:MOVSP,#70H MOVT2H,#HIGH T38_4KHz;设置T2重装时间常数的高字节 MOVT2L,#LOW T38_4KHz;设置T2

43、重装时间常数的低字节 MOVAUXR,#10H;启动T2 ORLINT_CLKO,#04H;允许T2时钟输出功能 SJMP$ END,73/164,对应的C语言代码如下: #include stc15.h /包含STC15F2K60S2的寄存器定义头文件 /定时常数 #define FOSC 18432000L #define T38_4KHz (65536-18432000/12/38400/2) /38.4KHz sbit T2CLKO = P30; /时钟输出引脚 void main(void) T2H= T38_4KHz8; /设置T2重装时间常数的高字节 T2L = T38_4KHz

44、;/设置T2重装时间常数的低字节 AUXR = 0 x10;/启动定时器T2 INT_CLKO |= 0 x04;/允许T2时钟输出 while (1); /循环 ,74/164,7.3可编程计数器阵列模块及其应用,STC15F2K60S2单片机集成了三路可编程计数器阵列(PCA)模块。可用于软件定时器、外部脉冲的捕捉、高速输出以及脉宽调制(PWM)输出。,75/164,一、 PCA模块的结构 PCA模块含有一个特殊的16位定时器,有3个 16位的捕获/比较模块与之相连。如图所示。,图7-8 PCA模块结构,76/164,模块0连接到P1.1/CCP0 模块1连接到P1.0/CCP1 模块2连

45、接到P3.7/CCP2 上述CCP模块可以通过AUXR1中的CCP_S0和P_SW2中的CCP_S1切换到其他引脚(参见表3-9)。每个模块可编程工作在4种模式:上升/下降沿捕获、软件定时器、高速输出或可调制脉冲输出。,77/164,16位PCA定时器/计数器是3个模块的公共时间基准。,图7-9 PCA定时器/计数器结构,78/164,PCA定时器/计数器结构图说明 寄存器CH和CL的内容是自动递增计数的16位PCA定时器的值。 PCA定时器的时钟源有以下几种:1/12振荡频率、1/8振荡频率、1/6振荡频率、1/4振荡频率、1/2振荡频率、振荡频率、定时器0溢出或ECI脚的输入(P1.2)。

46、 定时器的计数源可通过设置特殊功能寄存器CMOD的CPS2、CPS1和CPS0位选择其中一种。,79/164,PCA定时器/计数器结构图说明 CMOD中的CIDL位用于控制空闲模式下是否允许停止PCA;CMOD中的ECF位用于中断控制,置位时,使能PCA中断。当PCA定时器溢出时,PCA计数溢出标志CF置位。 CCON中的CR位是PCA的运行控制位。CR=1时,运行PCA。CR=0时,关闭PCA。,80/164,PCA定时器/计数器结构图说明 CCON中还包括PCA定时器标志(CF)以及各个模块的标志(CCF1/CCF0)。 当PCA计数器溢出时,CF位置位,如果CMOD寄存器的ECF位置位,

47、就产生中断。CF位只能通过软件清除。 CCON寄存器中的CCF0是PCA模块0的标志,CCF1是模块1的标志。当发生匹配或比较时由硬件置位。这些标志也只能通过软件清除。所有模块共用一个中断向量,可以在中断服务程序中判断CCF0和CCF1,以确定到底是哪个模块产生了中断。,81/164,二、PCA模块的特殊功能寄存器 下面介绍与PCA模块有关的特殊功能寄存器。 PCA工作模式寄存器(CMOD) PCA控制寄存器(CCON) PCA比较/捕获寄存器CCAPMn PCA模块PWM寄存器PCA_PWMn PCA的16位计数器-低8位CL和高8位CH PCA捕捉/比较寄存器,82/164,1、PCA工作

48、模式寄存器(CMOD) CMOD(地址为D9H,复位值为0XXX0000B)各位的定义如下:,83/164,1)CIDL:空闲模式下是否停止PCA计数的控制位。CIDL=0时,空闲模式下PCA计数器继续计数;CIDL=1时,空闲模式下PCA计数器停止计数。 2)CPS2、CPS1、CPS0:PCA计数脉冲源选择控制位。,84/164,2)CPS2、CPS1、CPS0:PCA计数脉冲源选择控制位。 PCA计数脉冲选择如表所示。,表7-3 PCA计数脉冲源选择,85/164,例如,CPS2/CPS1/CPS0=(100)2时,PCA/PWM的时钟源是SYSclk。 如果要使用SYSclk/3作为P

49、CA 的时钟源,应让T0工作在1T模式,计数3个脉冲即产生溢出。用T0的溢出可对系统时钟进行1256级分频。,86/164,3)ECF:PCA计数器溢出中断使能位。 ECF=1时,允许寄存器CCON中CF位的中断。ECF=0时,禁止寄存器CCON中CF位的中断。,87/164,2、PCA控制寄存器(CCON) CCON(地址为D8H,复位值为00XXXX00B),1)CF:PCA计数器溢出标志位。 当PCA计数器溢出时,CF位由硬件置位。如果CMOD寄存器的ECF位置位,CF标志可用来产生中断。CF位可通过硬件或软件置位,但只能通过软件清0。,88/164,2)CR:PCA计数器的运行控制位。

50、 置位CR位时,启动PCA计数器计数; 清零CR位时,关闭PCA计数器。 3)CCF2/CCF1/CCF0:PCA模块的中断标志(CCF0对应模块0,CCF1对应模块1 ,CCF2对应模块2 )。 当发生匹配或捕获时由硬件置位。这些标志位必须通过软件清除。,89/164,3、PCA工作模式寄存器CCAPMn(n=0,1,2) 地址分别对应DAH、DBH和DCH,复位值均为x000 0000B),1)ECOMn:允许比较器功能控制位。 ECOMn=1时,允许比较器功能。 2)CAPPn:正捕获控制位。 CAPPn=1时,允许上升沿捕获。,90/164,3)CAPNn:负捕获控制位。 CAPNn=

51、1时,允许下降沿捕获。如果CAPPn=1,同时CAPNn=1,则允许上升沿和下降沿都捕获。 4)MATn:匹配控制位。 如果MATn=1,则PCA计数值与模块的比较/捕获寄存器的值匹配时,将置位CCON寄存器的中断标志位CCFn。,91/164,5)TOGn:翻转控制位。 当TOGn=1时,PCA工作于高速输出模式,PCA计数器的值与模块的比较/捕获寄存器的值匹配时,将使CEXn脚翻转。 6)PWMn:脉宽调制模式。 当PWMn=1时,CEXn脚用作脉宽调制输出。 7)ECCFn:使能CCFn中断。 寄存器CCON的比较/捕获标志CCFn用来产生中断。,92/164,4、PCA模块PWM寄存器

52、PCA_PWMn(n=0,1,2) 地址分别为F2H、F3H和F4H,复位值均为xxxx xx00B),1)EBSn_1 , EBSn_0:PCA模块n工作于PWM模式时的功能选择位。 00: PCA模块n工作于8位PWM功能; 01: PCA模块n工作于7位PWM功能; 10:PCA模块n工作于6位PWM功能; 11:无效,PCA模块n仍工作于8位PWM模式。,93/164,2)EPCnH:在PWM模式下与CCAPnH组成9位数。 3)EPCnL:在PWM模式下与CCAPnL组成9位数。 PCA模块的工作模式设定如表7-4所示。,94/164,5、PCA的16位计数器-低8位CL和高8位CH

53、 (地址分别为E9H和F9H,复位值均为00H)。它们用于保存PCA的装载值。,95/164,6、PCA捕捉/比较寄存器CCAPnL(低位字节)和CCAPnH(高位字节) 当PCA模块用于捕获或比较时,它们保存各个模块的16位捕捉计数值;当PCA模块用于PWM模式时,它们用来控制输出的占空比。其中,n=0、1、2,分别对应模块0和模块1和模块2。复位值均为00H。 它们对应的地址分别为: CCAP0LEAH、CCAP0HFAH:模块0捕捉/比较寄存器 CCAP1LEBH、CCAP1HFBH:模块1捕捉/比较寄存器 CCAP2LECH、CCAP2HFCH:模块2捕捉/比较寄存器,96/164,三

54、、PCA模块的工作模式 捕获模式 16位软件定时器模式 高速输出模式 脉宽调节模式,97/164,1、捕获模式 PCA模块工作于捕获模式的结构图如图所示。,图7-10 PCA模块捕获模式结构图,98/164,说明 要使PCA 模块工作在捕获模式,寄存器CCAPMn的两位(CAPNn和CAPPn)中至少有一位必须置1。 PCA模块工作于捕获模式时,对外部输入CCPn引脚的跳变进行采样。当采样到有效跳变时,PCA硬件将PCA计数器阵列寄存器(CH和CL)的值装载到模块的捕获寄存器(CCAPnH和CCAPnL)中。 如果CCON中的CCFn位和CCAPMn中的ECCFn位被置位,将产生中断。可在中断

55、服务程序中判断是哪一个模块产生了中断,并注意中断标志位的软件清0问题。,99/164,2、16位软件定时器模式 16位软件定时器模式的结构图如图所示。,图7-11 PCA模块的16位软件定时器模式/PCA比较模式结构,100/164,说明 通过置位寄存器CCAPMn的ECOMn和MATn位,可使PCA模块用作软件定时器。PCA定时器的值与模块捕获寄存器的值相比较,当二者相等时,如果CCFn位和ECCFn位都置位,将产生中断。 CH,CL每隔一定的时间自动加1,时间间隔取决于选择的时钟源。例如,当选择的时钟源为FOSC/12时,每12个时钟周期CH,CL加1。当CH,CL增加到等于CCAPnH,

56、CCAPnL时,CCFn=1,产生中断请求。如果每次PCA模块中断后,在中断服务程序中给CCAPnH,CCAPnL增加一个相同的数值,那么下一次中断来临的间隔时间T也是相同的,从而实现了定时功能。定时时间的长短,取决于时钟源的选择以及PCA计数器计数值的设置。,101/164,假设,时钟频率SYSclk = 18.432MHz,选择的时钟源为SYSclk/12,定时时间T为5ms,则PCA计数器计数值为: T/(1/SYSclk)12 )= 0.005/ ( (1/18432000)12 ) = 7680 = 1E00H 也就是说,PCA 计数器计数1E00H次,定时时间才是5ms。这也就是每

57、次给CCAPnH,CCAPnL增加的数值(步长)。,102/164,3、高速输出模式 高速输出模式的结构图如图所示。,图7-12 PCA模块的高速输出模式结构图,103/164,说明 该模式中,当PCA计数器的计数值与模块捕获寄存器的值相匹配时,PCA模块的输出CEXn将发生翻转。要激活高速输出模式,CCAPMn寄存器的TOGn、MATn和ECOMn位必须都置位。 CCAPnL中的值决定了PCA模块n输出脉冲的频率。当PCA时钟源是SYSclk/2时,输出脉冲的频率f为: f = SYSclk / (4CCAPnL) ,其中,SYSclk为系统时钟频率。由此,可以得到CCAPnL的值为: CC

58、APnL = SYSclk / (4f),104/164,如果计算出的结果不是整数,则进行四舍五入取整,即 CCAPnL =INT(SYSclk / (4f) + 0.5)其中,INT()为取整数运算,直接去掉小数。 例如,假设SYSclk=20MHz,要求PCA高速脉冲输出125KHz的方波,则CCAPnL中的值应为: CCAPnL = INT( 20000000/4/125000 + 0.5) = INT( 40 + 0.5) = 40= 28H,105/164,4、脉宽调节模式 脉宽调制(Pulse Width Modulation,PWM)是一种使用程序来控制波形占空比、周期、相位波形的技术,在三相电机驱动、D/A转换等场合有广泛的应用。,106/164,STC15F2K60S2单片机的PCA模块可以通过程序设定各自的寄存器PCA_PWMn(n=0,1,2.下同)中的位EBSn_1及EBSn_0,使

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论