STC15单片机编程——定时器/计数器设置

一、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为
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值