这里是 单片微型计算机原理及接口技术 的第七章知识点
STC15单片机的定时/计数器
T0/T1结构
定时方法
软件定时:执行一个程序段。
完全占用CPU的时间,因而降低了CPU的利用率,适用于时间短的定时。
硬件定时:采用固定电路,如555定时器。
由纯硬件来完成,使用不够方便。
可编程定时/计数器:利用硬件电路控制定时,定时时间由软件确定,精确、灵活;还能对外部事件计数。
IAP15W4K58单片机的定时/计数器
- 有5个可编程的16位定时/计数器:T0、T1、T2、T3和T4。它们都具有计数和定时两种工作模式。
- 定时/计数器的核心部件是加法计数器,对脉冲进行加1计数。
- 计数脉冲来自系统时钟,为定时模式,定时时间=脉冲周期X脉冲个数。SFR中的Tix12位决定脉冲频率=系统时钟还是=系统时钟/12。
计数脉冲来自外部引脚(T0为P3.4,T1为P3.5,T2为P3.1,T3为P0.5,T4为P0.7),为计数模式,外部脉冲负跳变时,计数值加1。
T0有4种工作方式:
方式0,16位自动重载方式;
方式1,16位不可重载方式;
方式2,8位自动重载方式;
方式3,不可屏蔽中断的16位自动重载方式。定时/计数器T1有3种工作方式,与T0的方式0、1、2相同。
- 定时/计数器T2、T3、T4都只有16位自动重载方式。
- T0、T1、T2、T3和T4既可以当作定时器使用,也可以当作波特率发生器和可编程时钟输出。
- 作为波特率发生器和可编程时钟输出时,只能采用自动重载工作方式。
STC15单片机T0/T1的结构
- TH0、TL0是T0的计数寄存器。TH1、TL1是T1的计数寄存器。
- TMOD选择T0/T1的工作模式和工作方式。
- TCON控制启动和停止计数,同时包含了T0、T1的溢出状态。
- AUXR:设置定时计数脉冲的分频系数。
- INT_CLKO:控制是否允许输出可编程时钟信号。
TMOD
选择定时/计数器的工作模式和工作方式,字节地址为89H
(1)GATE:门控位。
- GATE = 0,TRx=1即可启动定时/计数器运行。
- GATE = 1,TRx=1,且INT0(或 INT1)=1,才可启动定时/计数器运行。
(2)C/T:计数器模式和定时器模式选择位 - C/T = 0,定时器工作模式,对系统时钟/12或系统时钟脉冲进行计数。
- C/T = 1,计数器工作模式,对外部输入引脚T0(P3.4)或T1(P3.5)的外部脉冲计数。
(3)M1、M0:工作方式选择位
M1 | M0 | 工作方式 | 功能说明 |
---|---|---|---|
0 | 0 | 方式0 | 16位自动重装初值,溢出时将初值自动装入TH和TL |
0 | 1 | 方式1 | 16位不可重装载 |
1 | 0 | 方式2 | 8位自动重装载初值,溢出时将TH中的初值自动装入TL |
1 | 1 | 方式3 | 不可屏蔽中断的16位自动重装初值(T1无效) |
TCON
控制T0、T1的启动和停止,记录T0、T1的溢出状态
字节地址为88H,可位寻址,位地址为88H~8FH。
(1)TF1、TF0:计数溢出标志位。
- 计数器计满溢出时,由硬件置TFi=1。
- 可作为状态位供CPU查询,查询结束,应用软件及时将该位清0。
- 可作为中断请求标志,进入中断服务程序后由硬件自动清0。
(2)TR1、TR0:计数运行控制位。 - 由软件置1或清0。
- GATE=0时,TRi =1,启动Ti工作;TRi =0,停止Ti工作。
- GATE=1时,TRi =1,且INTi=1,才可启动Ti工作。
AUXR
设定T0、T1的计数脉冲的分频系数,字节地址为8EH
STC15单片机是1T的8051单片机,机器周期=1个时钟周期。
为兼容传统8051,可通过AUXR设置为1T或传统的12T。
Tix12 = 0,Ti是传统8051速度,定时计数脉冲为系统时钟的12分频;
Tix12 = 1,Ti的速度是传统8051的12倍,定时计数脉冲为系统时钟。
INT_CLKO
控制是否输出可编程时钟信号,字节地址为8FH
(1)T0CLKO:是否允许P3.5配置为T0的时钟输出T0CLKO。
- T0CLKO=0, 不允许P3.5配置为T0的时钟输出;
- T0CLKO=1,将P3.5配置为T0的时钟输出T0CLKO。
(2)T1CLKO:是否允许P3.4配置为T1的时钟输出T1CLKO。 - T1CLKO=0, 不允许P3.4配置为T1的时钟输出;
- T1CLKO=1,将P3.4配置为T1的时钟输出T1CLKO。
T0CLKO(P3.5)、T1CLKO(P3.4)的输出时钟频率分别由T0、T1控制。
T0/T1工作方式
T0有4种工作方式,T1除方式3无效外,其余3种工作方式与T0完全相同。
方式0
可自动重载的16位定时/计数器
TMOD中的GATE=0时,仅由TR0控制T0的运行;
GATE=1时,只有当INT0=1且TR0=1,T0才启动运行。
利用INT0的控制可实现脉宽测量。
C/T位控制的电子开关决定了定时/计数器的两种工作模式。
(1) C/T=0,开关连接到系统时钟的分频输出,T0为定时器模式。有2种计数速率:
T0x12=0,12T模式,每12个系统时钟计数值加1;
T0x12=1,1T模式,每个系统时钟计数值加1。
(2) C/T=1,开关连接到外部脉冲输入端P3.4,T0为计数器模式。
当P3.4的外部输入脉冲发生负跳变时,计数值加1。
- 2个隐藏的寄存器RL_TH0和RL_TL0分别和TH0、TL0共有同一个地址。
- 写入TH0、TL0的计数初值会同时写入RL_TH0和RL_TL0中。
- 当读取计数值时,读取的是TH0和TL0中的当前计数值。
- 计数溢出时,硬件置TF0=1,并且将RL_TH0和RL_TL0中的初值重新载入TH0和TL0中,自动启动下一轮计数。
INT_CLK0中的T0CLKO=1时,P3.5管脚为T0的时钟输出T0CLKO。
输出时钟频率=T0溢出率/2。
定时时间=($2^{16}$-[TH0,TL0])×计数脉冲周期×$12^{(1-12T0)}$;
溢出率= $f_{计数脉冲}$/($2^{16}$-[ TH0,TL0]) /$12^{(1-T0x12)}$;
T0CLKO的输出时钟频率= $f_{计数脉冲}$/($2^{16}$-[ TH0,TL0]) /$12^{(1-12T0)}$/2。
计数脉冲可以来自系统时钟,也可以由T0(P3.4)输入的外部脉冲提供。
方式1
不可重装初值的16位定时/计数器
方式2
可重装初值的8位定时/计数器
TL0是8位计数器,而TH0是一个数据缓冲器,存放8位计数初值。
TL0计数溢出时,置TF0=1同时,自动将TH0中的初值送至TL0,使TL0从初值开始重新计数。
INT_CLK0中的T0CLKO=1时,P3.5管脚为T0的时钟输出T0CLKO。输出时钟频率=T0溢出率/2。
定时时间=($2^8$-[TH0])×计数脉冲周期×$12(1-12T0)$;
溢出率= $f_{计数脉冲}$/($2^8$-[ TH0]) /$12^{(1-12T0)}$;
T0CLKO的输出时钟频率= $f_{计数脉冲}$/($2^8$-[ TH0]) /$12^{(1-12T0)}$/2。
计数脉冲可以来自系统时钟,也可以由T0(P3.4)输入的外部脉冲提供。
方式3
不可屏蔽的可重装初值的16位定时/计数器
只需ET0=1就可打开T0的中断,与总中断允许位EA无关,即不受EA屏蔽。
T1在方式3无效,其余3种工作方式的电路结构与T0完全相同。
由于方式0是16位的可自动重装初值的定时/计数器,
方式1不可自动重装初值,故不推荐使用;
方式2实现的功能完全可以由方式0取代;
方式0、方式2常用作串口通信的波特率发生器。
T0/T1定时应用
定时/计数器的初始化任务:
- 设置TMOD,确定工作模式和工作方式;
- 设置AUXR中对应的分频系数;
- 计算计数初值,高8位写入THi,低8位写入TLi。
- 对于方式2,初值既要写入THi,也要写入TLi;
- 采用定时中断时,设置中断允许和中断优先级;
- 置位TCON中的Tri,启动定时或计数。
【例1】假设系统时钟频率为12MHz,在P1.0引脚上输出周期为2s的方波。
系统时钟频率=12 MHz,分频系数为12,则定时脉冲周期=1us。
T1工作于方式0定时,最大定时时间=$2^{16}$×定时脉冲周期=65.536ms,
需要采用多次定时累计的方法实现1s的定时时间。
1s的定时=定时50ms×累计20次。
(1)计算计数初值X
有50ms=($2^{16}$-X)×1us,初值X=15536,T1的初值TH1=3CH,TL1=B0H。
(2)对计数溢出采用查询式处理
程序设计:
MOV R2, #20 ;定时次数,每次50ms
MOV TMOD, #00H ;T1方式0定时
MOV TH1, #3CH ;50ms定时初值
MOV TL1, #0B0H
SETB TR1 ;启动定时
Check_TF1: JBC TF1, T1_Over ;查询到溢出,则跳转
SJMP Check_TF1
T1_Over: DJNZ R2, Check_TF1
MOV R2, #20
CPL P1.0 ;1s时间到,P1.0翻转
SJMP Check_TF1
对计数溢出采用中断式处理:
主程序设计包括定时器初始化和中断系统初始化。
———对寄存器IP、IE、TCON、TMOD和AUXR的相应位进行正确的设置,并将计数初值送入定时器中。
1s = 50ms*20次
主程序任务: 允许T1中断 启动T1定时 中断总允许 设置T1优先级 设置T1方式字 设置T1定时50ms初值 启动T1 | 中断服务子程序任务: 记录定时中断次数 P1.0翻转 返回主程序 |
- 单片机复位时,从程序入口0000H跳向主程序MAIN处执行
ORG 0000H
AJMP MAIN
ORG 001BH ;T1中断向量
AJMP T1_ISR
ORG 0100H ;主程序起始地址
MAIN: MOV R2, #14H ;定时次数,每次50ms
MOV TMOD, #00H ;T1方式0定时
MOV TH1, #3CH ;50ms定时初值
MOV TL1, #0B0H
- 主程序初始化完成后,执行“SJMP $”指令,循环等待。
- 响应T1中断时,跳向T1中断入口001BH,再跳向T1_ISR处执行T1的中断服务子程序。
- 执行完”RETI”后,返回断点处继续执行”SJMP $”。
- 当下一次T1的50ms定时中断发生,再跳向T1中断入口001BH , … 。
SETB ET1 ;T1中断允许
SETB EA ;中断总允许
SETB PT1 ;T1高优先级
SETB TR1 ;启动定时
SJMP $ ;等待T1 50ms时间到,溢出中断
T1_ISR: DJNZ R2, EXIT ; 1s未到,退出中断
MOV R2, #14H
CPL P1.0 ;1s时间到,P1.0翻转
EXIT: RETI
END
【例2】假设系统时钟频率采用12MHz,要求在P3.4引脚上输出51.2KHz的时钟信号。假设单片机为1T模式。
利用P3.4是定时/计数器T1的可编程时钟输出端口,编程中需允许T1输出时钟,并设置T1为自动重载方式。
根据输出时钟频率=T1溢出率/2,
计算溢出率=102.4KHz。
再由溢出率= $f_{SYS}$/($2^8$-初值) /$12^{(1-12T1)}$,
计算初值=8BH。
汇编参考程序如下:
ANL TMOD, #0FH
ORL TMOD, #20H ;T1方式2定时
ORL AUXR, #40H ;T1x12=1
MOV TH1, #8BH
MOV TL1, #8BH
ORL INT_CLKO, #02H ;T1CLKO=1
SETB TR1
T0/T1计数应用
【例3】系统时钟为6MHz,当T0(P3.4)引脚上发生负跳变时,作为P1.0引脚产生方波的启动信号。开始从P1.0脚上输出一个周期为1ms的方波。
T0设为方式1计数,只计1,初值为FFFFH。
当T0计数输入端(P3.4)↓时,T0计数器加1且溢出,置TF0=1,向CPU发中断请求。进入T0中断程序后,启动T1。
T1定义为方式2定时,定时500µs。
T1每500µs产生一次中断,在中断服务子程序中对P1.0求反,使P1.0产生周期1ms的方波。
计算T1的初值x:
汇编参考程序:
ORG 0000H
LJMP MAIN
ORG 000BH ;T0中断向量
LJMP T0_ISR
ORG 001BH ;T1中断向量
CPL P1.0
RETI
ORG 0100H
MAIN: MOV TMOD, #25H ;设T0为方式1计数,T1为方式2定时
MOV TH0, #0FFH ;T0初值FFFFH
MOV TL0, #0FFH
SETB ET0
MOV TH1, #06H ;T1初值06H
MOV TL1, #06H
SETB EA
SETB TR0 ;启动T0
AJMP $
T0_ISR: CLR TR0 ;T0停止计数
SETB ET1
SETB TR1 ;启动T1
RETI
END
T0/T1的门控位GATE的应用
利用门控制位GATEx,可用来测量INTi(INT0为P3.2,INT1为P3.3)引脚上正脉冲的宽度。
【例4】门控位GATE1可使T1的计数启动受 INT1的控制,当GATE1=1,TR1=1,只有INT1=1时,T1才被允许计数。可测量INT1(P3.3)上正脉冲的宽度。
ORG 0000H
AJMP MAIN
ORG 0100H
MAIN: MOV TMOD, #80H ;T1为方式0定时,GATE1=1
MOV TH1, #0
MOV TL1, #0
LOOP1: JB P3.3, LOOP1 ;等待P3.3=0,前一轮结束
SETB TR1
LOOP2: JNB P3.3, LOOP2 ;当P3.3=1时,才启动T1定时
LOOP3: JB P3.3, LOOP3
CLR TR1 ;当P3.3=0时,停止T1定时
MOV R0, TL1
MOV R1, TH1 ;读取T1的计数值至R1,R0
END
T0/T1综合应用
【例5】用定时器实现可变占空比矩形波输出,驱动LED7(P1.7)发光,达到呼吸灯的效果。矩形波的周期为5ms。
用2个定时器实现:
T0定时tms,中断方式运行,控制矩形波的低电平宽度;
T1定时5ms-t,中断方式运行,控制矩形波的高电平宽度。
每10ms(2个矩形波)改变一次占空比,占空比改变101次后一次呼吸过
程结束,循环重复。
T0和T1交替运行,T0定时结束时开启T1,T1定时结束时开启T0。
1 | //为减少在改变定时器初值时的计算任务,将101个初值存储一个表格。 |
【例6】利用单片机定时/计数器设计一个简易频率计,采用数码管显示,利用开关控制频率计的启动、停止。
查询开关P3.2控制启、停。T0实现1s定时中断,T1计数。定时到,读取T1数值即为频率。
1s = 50ms*20次
汇编参考程序(数码管部分省略):
1 |
|
T2/T3/T4
T2、T3、T4都只有16位自动重载工作方式。它们既可作定时/计数器用,也可用作可编程时钟输出和串行通信的串口波特率发生器。
TiH、TiL是Ti的计数寄存器,分别和初值寄存器RL_THi和RL_TLi共有同一个地址。
计数初值写入TiH、TiL的同时也写入RL_THi和RL_TLi中。
计数溢出时,通过RL_THi和RL_TLi将初值重载入TiH和TiL,自动启动下一轮计数。
当读取计数值时,读取的是TiH和TiL中的当前计数值。
AUXR
用作定时/计数器T2的控制位。
T2R控制T2的启动/停止。
当T2R=1,启动T2开始定时/计数;当T2R =0时,则T2停止定时/计数。
T2_C/T控制的电子开关决定了T2的两种工作模式。
(1) T2_C/T=0,开关连接到系统时钟的分频输出,T2为定时器模式。
T2x12=0,对系统时钟/12的脉冲计数。T2x12=1,对系统时钟脉冲计数。
(2) T2_C/T=1,开关连接到外部脉冲输入P3.1,T2为计数器模式。
引脚上的外部输入脉冲发生负跳变时1。
T4T3M
用作T3和T4的控制,字节地址为D1H
T3R控制T3的启动/停止。
T3R=1,启动T3开始定时/计数;T3R =0时,则T3停止定时/计数。
T3_C/T控制T3的两种工作模式。
(1) T3_C/T=0, T3为定时器工作模式。
T3x12=0,对系统时钟/12的脉冲计数。T23x12=1,对系统时钟脉冲计数。
(2) T3_C/T=1, T3为计数器工作模式。
P0.5引脚上的外部输入脉冲发生负跳变时,计数值加1。
T4R控制T4的启动/停止。
当T4R=1,启动T4开始定时/计数,当T4R =0时,则T4停止定时/计数。
T4_C/T控制T4的两种工作模式。
(1) T4_C/T=0, T4为定时器工作模式。
T4x12=0,对系统时钟/12的脉冲计数。T4x12=1,对系统时钟脉冲计数。
(2) T4_C/T=1, T4为计数器工作模式。
当P0.7引脚上的外部输入脉冲发生负跳变时,计数值加1。
T2、T3、T4都不受门控信号GATE的控制,它们的计数溢出标志都对用户不可见。
IE2
控制T2、T3、T4的中断允许,字节地址为AFH
ETi=1,允许Ti溢出中断;ETi =0,禁止Ti溢出中断。
T2、T3、T4的中断优先级都固定为低级。
INT_CLKO
用于可编程时钟输出T2CLKO的控制,字节地址为8FH
T2CLKO:是否允许P3.0配置为定时/计数器T2的时钟输出T2CLKO。
T2CLKO=0, 不允许P3.0配置为定时/计数器T2的时钟输出;
T2CLKO=0,将P3.0配置为定时/计数器T2的时钟输出T2CLKO。
T4T3M
用于可编程时钟输出的控制,字节地址为8FH
(1)T3CLKO:是否允许P0.4配置为定时/计数器T3的时钟输出T3CLKO。
T3CLKO=0, 不允许P0.4配置为定时/计数器T3的时钟输出;
T3CLKO=0,将P0.4配置为定时/计数器T3的时钟输出T3CLKO。
(2)T4CLKO:是否允许P0.6配置为定时/计数器T4的时钟输出T4CLKO。
T4CLKO=0, 不允许P0.6配置为定时/计数器T4的时钟输出;
T4CLKO=0,将P0.6配置为定时/计数器T4的时钟输出T4CLKO。
T2CLKO(P3.0)的输出时钟频率由定时/计数器T2控制;
T3CLKO(P0.4)的输出时钟频率由定时/计数器T3控制;
T4CLKO(P0.6)的输出时钟频率由定时/计数器T4控制。
时钟输出信号的频率为定时/计数器溢出率的二分之一。
定时时间=$(2^{16}-[TiH,TiL])×计数脉冲周期×12^{(1-Tix12)}$;
Ti溢出率= $f_{计数脉冲}/(2^{16}-[ TiH,TiL]) /12^{(1-Tix12)}$;
TiCLKO的输出时钟频率= $f_{计数脉冲}/(2^{16}-[ TiH,TiL]) /12^{(1-Tix12)}/2$。