STC15W4K系列单片机有5个16位的定时器/计数器,分别是T0,T1,T2,T3,T4;
一、定时器与计数器的区分
所谓定时器和计数器,它们本质上是一样的东西,它们的核心都是一个加法计数器,都是统计脉冲的个数,区别在于,定时器是在数单片机系统时钟的脉冲个数,而计数器是在数单片机外部引脚的脉冲个数。
二、与定时器/计数器相关的特殊功能寄存器
定时器/计数器T0和T1:使用特殊功能寄存器TMOD中控制位来选择T0或T1是定时器还是计数器;
定时器/计数器T2:使用特殊功能寄存器AUXR中的控制位来选择T2是定时器还是计数器;
定时器/计数器T3和T4:使用特殊功能寄存器T4T3M中的控制位来选择T3或T4是定时器还是计数器;
我们知道STC15W4K系列单片机号称是1T的单片机,比传统单片机运行速度快,而之前的89C51单片机是12T的单片机。1T和12T是什么意思?所谓1T就表示1个时钟周期就是一个机器周期,12T表示12个时钟周期就是一个机器周期。STC15W4K系列单片机既可以工作在1T模式,也可以工作在12T模式。
因此,定时器是使用1T还是12T模式,也需要设置,设置T0,T1,T2这三个定时器相关的特殊功能寄存器就是AUXR,定时器T3和T4,使用T4T3M寄存器来进行设置。
相关的寄存器太多,还是用在哪个定时器就说到哪里。
三、定时器/计数器的工作模式
关于定时器/计数器,它们的核心都是计数,我们得知道它们是怎么计数的。
向上计数:
STC15W系列单片机都只能向上计数,就是顺着数,比如1、2、3 ......, 不能倒着数,比如100,99,98......
定时器/计数器的位宽:
常说8位,16位定时器/计数器,指的是那个计数寄存器的位宽,每个定时器的计数寄存器有两个TH 和TL,它们都是8位的,TH与TL连起来就是16位的了,16位最多就能计数到65535。
自动重装载:
要计数我们可以从0开始计,也可以从100开始计,反正计数计到65535(16位定时器),就满了,要溢出,如果我们从100开始计数,溢出之后,有自动从100开始计数,一直循环着,这就是自动重装载,也叫自动重载,自动重载就是在计数溢出之后自动的添加计数初始值。
3.1 定时器/计数器0
模式0: 16位自动重装载模式(STC官方推荐学习的模式)
要让定时器/计数器工作,首先要确认是定时还是计数,前面说过定时是数系统时钟的脉冲,计数是数外部引脚的脉冲,这一块需要通过配置TMOD寄存器来实现。
因为STC15W系列单片机有12T和1T模式的设置 ,需要在AUXR寄存器种设置
定时器/计数器的模式设置好之后,只要设置好控制寄存器TCON 就行,控制寄存器可以位寻址
我们知道定时器工作在1T模式,11.0592MHz的时钟频率,16位定时器,最多只能计65535个数,总时间也不到6ms就溢出了,要想定时1s钟,就需要计1000次,让定时器溢出1000次,
定时器一般是与中断配合使用,牵扯到中断,那就有中断控制寄存器和中断优先级控制寄存器。
定时器0工作在定时模式、1T模式、中断模式,模式0的代码如下:
#include <STC15.H>
#define FOSC 11059200L
unsigned int cnt = 0;
void main(void)
{
AUXR |= 0x80;//定时器0为1T模式
TMOD = 0x00; //设置定时器为模式0,16位自动重装载
//定时器1ms
TL0 = (65535- FOSC/1000);
TH0 = (65535- FOSC/1000) >> 8;
TR0 = 1;//开启定时器0,开始计数
ET0 = 1;// 使能定时器0中断
EA = 1;//中断总开关也要打开
while(1);
}
void Timer0_ISR() interrupt 1
{
cnt++; //每次定时溢出,cnt就加1
if(cnt == 1000) //累计1000次就是1s
{
cnt = 0;
P55 = !P55;
}
}
//
3.2 定时器/计数器1
定时器1的工作原理与定时器0 基本相同
3.3 定时器/计数器2
定时器/计数器2的工作模式比较单一,只有16位自动重装载模式,T2除了用作基本的定时器和计数器外,更多的是用于串口的波特率发生器。
与T2相关的寄存器