一、STC15单片机定时器/计数器
1、STC15系列单片机内部设置了5个16位定时器/计数器(T0、T1、T2、T3、T4),每个定时器/计数器的核心部件是一个加法计数器,对脉冲进行计数,只是计数脉冲的来源不同:如果计数脉冲来自系统时钟(每12个时钟或1个时钟得到1个计数脉冲,计数值加1),则为定时方式;如果计数脉冲来自单片机外部引脚(T0为P3_4、T1为P3_5、T2为P3_1、T3为P0_7、T4为P0_5,每1个计数脉冲,计数值加1),则为计数方式。
2、STC15系列单片机定时器/计数器类型如下表:
3、STC15系列单片机定时器/计数器有4种工作模式,不同定时器/计数器支持的工作模式如下表:
二、STC15单片机定时器/计数器寄存器
1、STC15系列单片机相关寄存器如下表:
2、STC15系列单片机定时器/计数器0寄存器设置:
(1)TMOD寄存器(不可位寻址):定时器/计数器工作模式寄存器
GATE0:控制定时器/计数器0,GATE0=1时INT0(P3_2)引脚为高且TR0=1才可打开定时器/计数器0,GATE0=0时只需TR0=1即可打开定时器/计数器0
C/T_0:控制定时器/计数器0用作定时器或计数器,C/T_0=0则用作定时器,对内部系统时钟进行计数,C/T_0=1用作计数器,对引脚T0(P3_4)的外部脉冲进行计数
M1_0、M0_0:定时器/计数器0模式选择如下表:
(2)TCON寄存器(可位寻址):定时器/计数器控制寄存器
TF0:定时器/计数器0的计数溢出中断标志,定时器/计数器0被允许计数后,从初始值开始加1,当产生溢出时,由硬件置1,向CPU请求中断,直到CPU响应该中断时,由硬件清0(也可由查询软件清0)
TR0:定时器/计数器0运行控制位,由软件置位或清零,当GATE0=0时,TR0=1就允许定时器/计数器0开始计数,TR0=0禁止定时器/计数器0计数;当GATE0=1时,TR0=1且INT0(P3_2)为高电平允许定时器/计数器0开始计数,TR0=1或INT0(P3_2)为低电平禁止定时器/计数器0计数
(3)AURX寄存器(不可位寻址):辅助寄存器
T0x12:定时器0速度控制器,T0x12=1时,定时器0的速度是传统8051的12倍,不分频,T0x12=0时,定时器0时传统8051速度,不分频
注:T0x12仅针对系统内部时钟脉冲进行分频,不适用于外部引脚T0(P3_4)输入的计数脉冲
(4)INT_CLKO(AUXR2)寄存器(不可位寻址):定时器/计数器时钟输出寄存器
T0CLKO:定时器/计数器0的时钟输出控制位,T0CLKO=1时,在T0CLKO(P3_5)引脚配置输出定时器/计数器0的时钟,输出时钟频率=定时器/计数器0溢出率/2;T0CLKO=0时,不允许T0CLKO(P3_5)引脚配置输出定时器/计数器0的时钟
定时器/计数器0溢出率计算如下表:
(5)IE寄存器(可位寻址):中断允许寄存器
EA:总中断允许控制位,EA=1时,单片机开放总中断;EA=0时,单片机关闭总中断
ET0:定时器/计数器0溢出中断允许位,ET0=1时,允许定时器/计数器0溢出中断,ET0=0时,关闭定时器/计数器0溢出中断
(6)IP寄存器(可位寻址):中断优先级控制寄存器
PT0:定时器/计数器0中断优先级控制位,PT0=0时,定时器/计数器0中断为最低优先级中断(优先级0);PT0=1时,定时器/计数器0中断为最高优先级中断(优先级1)
3、STC15系列单片机定时器/计数器1寄存器设置:
(1)TMOD寄存器(不可位寻址):定时器/计数器工作模式寄存器
GATE1:控制定时器/计数器1,GATE1=1时INT1(P3_3)引脚为高且TR1=1才可打开定时器/计数器1,GATE1=0时只需TR1=1即可打开定时器/计数器1
C/T_1:控制定时器/计数器1用作定时器或计数器,C/T_1=0则用作定时器,对内部系统时钟进行计数,C/T_1=1用作计数器,对引脚T1(P3_5)的外部脉冲进行计数
M1_1、M0_1:定时器/计数器0模式选择如下表:
(2)TCON寄存器(可位寻址):定时器/计数器控制寄存器
TF1:定时器/计数器1的计数溢出中断标志,定时器/计数器1被允许计数后,从初始值开始加1,当产生溢出时,由硬件置1,向CPU请求中断,直到CPU响应该中断时,由硬件清0(也可由查询软件清0)
TR1:定时器/计数器1运行控制位,由软件置位或清零,当GATE1=0时,TR1=1就允许定时器/计数器1开始计数,TR1=0禁止定时器/计数器1计数;当GATE1=1时,TR1=1且INT1(P3_3)为高电平允许定时器/计数器1开始计数,TR1=1或INT1(P3_3)为低电平禁止定时器/计数器1计数
(3)AURX寄存器(不可位寻址):辅助寄存器
T1x12:定时器1速度控制器,T1x12=1时,定时器1的速度是传统8051的12倍,不分频,T1x12=0时,定时器1时传统8051速度,不分频
注:T1x12仅针对系统内部时钟脉冲进行分频,不适用于外部引脚T1(P3_5)输入的计数脉冲
(4)INT_CLKO(AUXR2)寄存器(不可位寻址):定时器/计数器时钟输出寄存器
T1CLKO:定时器/计数器1的时钟输出控制位,T1CLKO=1时,在T1CLKO(P3_4)引脚配置输出定时器/计数器1的时钟,输出时钟频率=定时器/计数器1溢出率/2;T1CLKO=0时,不允许T1CLKO(P3_4)引脚配置输出定时器/计数器1的时钟
定时器/计数器1溢出率计算如下表:
(5)IE寄存器(可位寻址):中断允许寄存器
EA:总中断允许控制位,EA=1时,单片机开放总中断;EA=0时,单片机关闭总中断
ET1:定时器/计数器1溢出中断允许位,ET1=1时,允许定时器/计数器1溢出中断,ET1=0时,关闭定时器/计数器1溢出中断
(6)IP寄存器(可位寻址):中断优先级控制寄存器
PT1:定时器/计数器1中断优先级控制位,PT1=0时,定时器/计数器1中断为最低优先级中断(优先级0);PT1=1时,定时器/计数器1中断为最高优先级中断(优先级1)
4、STC15系列单片机定时器/计数器2寄存器设置:
(1)AURX寄存器(不可位寻址):辅助寄存器
T2R:定时器/计数器2允许控制位,T2R=1时,允许定时器/计数器2计数,T2R=0时,禁止定时器/计数器2计数。
T2_C/T:控制定时器/计数器2用作定时器或计数器,T2_C/T=0则用作定时器,对内部系统时钟进行计数,T2_C/T=1用作计数器,对引脚T2(P3_1)的外部脉冲进行计数
T2x12:定时器2速度控制器,T2x12=1时,定时器2的速度是传统8051的12倍,不分频,T2x12=0时,定时器2时传统8051速度,不分频
注:T2x12仅针对系统内部时钟脉冲进行分频,不适用于外部引脚T2(P3_1)输入的计数脉冲
(2)INT_CLKO(AUXR2)寄存器(不可位寻址):定时器/计数器时钟输出寄存器
T2CLKO:定时器/计数器2的时钟输出控制位,T2CLKO=1时,在T2CLKO(P3_0)引脚配置输出定时器/计数器2的时钟,输出时钟频率=定时器/计数器2溢出率/2;T2CLKO=0时,不允许T2CLKO(P3_0)引脚配置输出定时器/计数器2的时钟
定时器/计数器2溢出率计算如下表:
(3)IE寄存器(可位寻址)、IE2寄存器(不可位寻址):中断允许寄存器
EA:总中断允许控制位,EA=1时,单片机开放总中断;EA=0时,单片机关闭总中断
ET2:定时器/计数器2溢出中断允许位,ET2=1时,允许定时器/计数器2溢出中断,ET2=0时,关闭定时器/计数器2溢出中断
注:定时器/计数器2的中断优先级只有一级
5、STC15系列单片机定时器/计数器3寄存器设置:
(1)T4T3M寄存器(不可位寻址):定时器/计数器控制寄存器
T3R:定时器/计数器3允许控制位,T3R=1时,允许定时器/计数器3计数,T3R=0时,禁止定时器/计数器3计数。
T3_C/T:控制定时器/计数器3用作定时器或计数器,T3_C/T=0则用作定时器,对内部系统时钟进行计数,T3_C/T=1用作计数器,对引脚T3(P0_5)的外部脉冲进行计数
T3x12:定时器3速度控制器,T3x12=1时,定时器3的速度是传统8051的12倍,不分频,T3x12=0时,定时器3时传统8051速度,不分频
T3CLKO:定时器/计数器3的时钟输出控制位,T3CLKO=1时,在T3CLKO(P0_4)引脚配置输出定时器/计数器3的时钟,输出时钟频率=定时器/计数器3溢出率/2;T3CLKO=0时,不允许T3CLKO(P0_4)引脚配置输出定时器/计数器3的时钟
定时器/计数器3溢出率计算如下表:
注:T3x12仅针对系统内部时钟脉冲进行分频,不适用于外部引脚T3(P0_5)输入的计数脉冲
(2)IE寄存器(可位寻址)、IE2寄存器(不可位寻址):中断允许寄存器
EA:总中断允许控制位,EA=1时,单片机开放总中断;EA=0时,单片机关闭总中断
ET3:定时器/计数器3溢出中断允许位,ET3=1时,允许定时器/计数器3溢出中断,ET3=0时,关闭定时器/计数器3溢出中断
注:定时器/计数器3的中断优先级只有一级
6、STC15系列单片机定时器/计数器4寄存器设置:
(1)T4T3M寄存器(不可位寻址):定时器/计数器控制寄存器
T4R:定时器/计数器4允许控制位,T4R=1时,允许定时器/计数器4计数,T4R=0时,禁止定时器/计数器4计数。
T4_C/T:控制定时器/计数器4用作定时器或计数器,T4_C/T=0则用作定时器,对内部系统时钟进行计数,T4_C/T=1用作计数器,对引脚T4(P0_7)的外部脉冲进行计数
T4x12:定时器4速度控制器,T4x12=1时,定时器4的速度是传统8051的12倍,不分频,T4x12=0时,定时器4是传统8051速度,不分频
T4CLKO:定时器/计数器4的时钟输出控制位,T4CLKO=1时,在T4CLKO(P0_6)引脚配置输出定时器/计数器4的时钟,输出时钟频率=定时器/计数器4溢出率/2;T4CLKO=0时,不允许T4CLKO(P0_6)引脚配置输出定时器/计数器4的时钟
定时器/计数器4溢出率计算如下表:
注:T4x12仅针对系统内部时钟脉冲进行分频,不适用于外部引脚T4(P0_7)输入的计数脉冲
(2)IE寄存器(可位寻址)、IE2寄存器(不可位寻址):中断允许寄存器
EA:总中断允许控制位,EA=1时,单片机开放总中断;EA=0时,单片机关闭总中断
ET4:定时器/计数器4溢出中断允许位,ET4=1时,允许定时器/计数器4溢出中断,ET4=0时,关闭定时器/计数器4溢出中断
注:定时器/计数器4的中断优先级只有一级
三、STC15单片机定时器/计数器工作模式
1、STC15系列单片机定时器/计数器0工作模式
(1)工作模式0:
此模式下定时器/计数器0工作在16位自动重装载模式,如下图所示:
(2)工作模式1:
此模式下定时器/计数器0工作在16位不可自动重装载模式,如下图所示:
注:此模式不能对外输出定时器脉冲,TH0与TL0溢出后,须在中断内手动对其重新赋初值
(3)工作模式2:
此模式下定时器/计数器0工作在8位自动重装载模式,如下图所示:
(4)工作模式3:
此模式下定时器/计数器0工作在不可屏蔽中断16位自动重装载模式,如下图所示:
注:此模式下定时器0中断通过ET0打开后,便不在受ET0和EA的控制,无法被屏蔽,且中断优先级是最高的。
2、STC15系列单片机定时器/计数器1工作模式
(1)工作模式0:
此模式下定时器/计数器1工作在16位自动重装载模式,如下图所示:
(2)工作模式1:
此模式下定时器/计数器1工作在16位不可自动重装载模式,如下图所示:
注:此模式不能对外输出定时器脉冲,TH1与TL1溢出后,须在中断内手动对其重新赋初值
(3)工作模式2:
3、STC15系列单片机定时器/计数器2工作模式
定时器2只能工作在16位自动重装载模式
4、STC15系列单片机定时器/计数器3工作模式
定时器3只能工作在16位自动重装载模式
5、STC15系列单片机定时器/计数器4工作模式
定时器4只能工作在16位自动重装载模式
四、STC15单片机定时器/计数器设置程序
1、STM.h文件
/*
*******************************************************************************
* 文件名:STM.h
* 描 述:声明了51单片机定时器相关函数及变量定义
* 版本号:v1.0.0
* 备 注:适用于KingST-51板子
*******************************************************************************
*/
#ifndef _STM_H
#define _STM_H
/*******************************************************************************/
//#define ConfigTime0_16_Auto_ON //设置定时器0为16位自动重装载定时器函数使能
//#define ConfigTime0_16_ON //设置定时器0为16位定时器函数使能
//#define ConfigTime0_8_Auto_ON //设置定时器0为8位自动重装载定时器函数使能
//#define ConfigTime0_16_Fixed_ON //设置定时器0为16位不可屏蔽中断自动重装载定时器函数使能
//#define ConfigTime0_16_Auto_OUT_P3_5_ON //设置定时器0时钟脉冲输出函数使能
//#define ConfigCount0_16_Auto_P3_4_IN_ON //设置定时器0为16位自动重装载计数器函数使能
//#define ConfigCount0_16_Auto_P3_4_IN_P3_5_OUT_ON //设置定时器0输入的计数脉冲分频后输出函数使能
//#define ConfigTime0_Or_Count0_Interrupt_RegisterCallback_ON //设置定时器0/计数器0中断回调函数注册函数使能
//#define ConfigTime0_Or_Count0_Interrupt_DeregisterCallback_ON //设置定时器0/计数器0中断回调函数解除注册函数使能
//#define ConfigGetTime0_16_Auto_ON //设置获取定时器0为16位自动重装载定时器的定时时间函数使能
//#define Get_Time0_Clock_Ms_ON //设置获取当前定时器0的定时时间函数使能
//#define Get_Time0_Clock_Count_ON //设置获取16位定时器0的定时计数值函数使能
//#define ConfigEncoder0_16_Auto_P3_4_IN_ON //设置定时器0为16位编码器(单脉冲)函数使能
//#define Get_Encoder0_Pulse_Count_ON //设置获取定时器0为16位编码器脉冲计数值函数使能
//#define ConfigTime1_16_Auto_ON //设置定时器1为16位自动重装载定时器函数使能
//#define ConfigTime1_16_ON //设置定时器1为16位定时器函数使能
//#define ConfigTime1_8_Auto_ON //设置定时器1为8位自动重装载定时器函数使能
//#define ConfigTime1_16_Auto_OUT_P3_4_ON //设置定时器1时钟脉冲输出函数使能
//#define ConfigCount1_16_Auto_P3_5_IN_ON //设置定时器1为16位自动重装载计数器函数使能
//#define ConfigCount1_16_Auto_P3_5_IN_P3_4_OUT_ON //设置定时器1输入的计数脉冲分频后输出函数使能
//#define ConfigTime1_Or_Count1_Interrupt_RegisterCallback_ON //设置定时器1/计数器1中断回调函数注册函数使能
//#define ConfigTime1_Or_Count1_Interrupt_DeregisterCallback_ON //设置定时器1/计数器1中断回调函数解除注册函数使能
//#define ConfigGetTime1_16_Auto_ON //设置获取定时器1为16位自动重装载定时器的定时时间函数使能
//#define Get_Time1_Clock_Ms_ON //设置获取当前定时器1的定时时间函数使能
//#define Get_Time1_Clock_Count_ON //设置获取16位定时器1的定时计数值函数使能
//#define ConfigEncoder1_16_Auto_P3_5_IN_ON //设置定时器1为16位编码器(单脉冲)函数使能
//#define Get_Encoder1_Pulse_Count_ON //设置获取定时器1为16位编码器脉冲计数值函数使能
//#define ConfigTime2_16_Auto_ON //设置定时器2为16位自动重装载定时器函数使能
//#define ConfigTime2_16_Auto_OUT_P3_0_ON //设置定时器2时钟脉冲输出函数使能
//#define ConfigCount2_16_Auto_P3_1_IN_ON //设置定时器2为16位自动重装载计数器函数使能
//#define ConfigCount2_16_Auto_P3_1_IN_P3_0_OUT_ON //设置定时器2输入的计数脉冲分频后输出函数使能
//#define ConfigTime2_Or_Count2_Interrupt_RegisterCallback_ON //设置定时器2/计数器2中断回调函数注册函数使能
//#define ConfigTime2_Or_Count2_Interrupt_DeregisterCallback_ON //设置定时器2/计数器2中断回调函数解除注册函数使能
//#define ConfigGetTime2_16_Auto_ON //设置获取定时器2为16位自动重装载定时器的定时时间函数使能
//#define Get_Time2_Clock_Count_ON //设置获取16位定时器2的定时计数值函数使能
//#define ConfigEncoder2_16_Auto_P3_1_IN_ON //设置定时器2为16位编码器(单脉冲)函数使能
//#define Get_Encoder2_Pulse_Count_ON //设置获取定时器2为