一)STC8H定时器简介
STC8H8K64U有5个定时器:定时器0,定时器1,定时器2,定时器3,定时器4。
想了解更详细的请查阅STC8H官方手册。
1.定时器0/1控制寄存器(TCON)
TF1:T1溢出中断标志。T1被允许计数以后,从初值开始加1计数。当产生溢出时由硬件将TF1位置“1”,并向CPU请求中断,一直保持到CPU响应中断时,才由硬件清“0”(也可由查询软件清“0”)。
TR1:定时器T1的运行控制位。该位由软件置位和清零。当GATE(TMOD.7)=0,TR1=1时就允许T1开始计数,TR1-0时禁止T1计数。当GATE(TMOD.7)=1,TR1=1且INT1输入高电平时,才允许T1计数。
TF0:TO溢出中断标志。TO被允许计数以后,从初值开始加1计数,当产生溢出时,由硬件置“1”TFO,向CPU请求中断,一直保持CPU响应该中断时,才由硬件清0(也可由查询软件清0)。
TR0:定时器T0的运行控制位。该位由软件置位和清零。当GATE(TMOD.3)-0,TRO=1时就允许T0开始计数,TR0-0时禁止T0计数。当GATE(TMOD.3)=1,TRO=1且INT0输入高电平时,才允许TO计数,TRO-0时禁止T0计数。
IE1:外部中断1请求源(DNT1/P3.3)标志。IE1=1,外部中断向CPU请求中断,当CPU响应该中断时由硬件清“0”IE1。
IT1:外部中断源1触发控制位。IT1=0,上升沿或下降沿均可触发外部中断1。IT1=1,外部中断1程控为下降沿触发方式。
IE0:外部中断0请求源(INTO/P3.2)标志。IE0=1外部中断0向CPU请求中断,当CPU响应外部中断时,由硬件清“0”IE0(边沿触发方式)。
IT0:外部中断源0触发控制位。IT0=0,上升沿或下降沿均可触发外部中断0。ITO=1,外部中断0程控为下降沿触发方式。
2.定时器0/1模式寄存器(TMOD)
T1_GATE:控制定时器1,置1时只有在INT1脚为高及TR1控制位置1时才可打开定时器/计数器1。
T0_GATE:控制定时器0,置1时只有在INT0脚为高及TR0控制位置1时才可打开定时器/计数器0。
T1_C/T:控制定时器1用作定时器或计数器,清0则用作定时器(对内部系统时钟进行计数),置1用作计数器(对引脚T1/P3.5外部脉冲进行计数)
T0_C/T:控制定时器0用作定时器或计数器,清0则用作定时器(对内部系统时钟进行计数),置1用作计数器(对引脚T0/P3.4外部脉冲进行计数)。
T1_MI/T1_M0:定时器定时器/计数器1模式选择
3.定时器/计数器0模式选择
注意:自动重载模式在计数器值溢出后,系统会将内部重载寄存器的值装进去;不自动重载会从0开始计数
4.定时器0模式1(16位不可重装载模式)
此模式下定时器/计数器 0 工作在 16 位不可重装载模式,如下图所示:
此模式下,定时器/计数器 0配置为16位不可重装载模式,由TLO的8位和THO的8位所构成。TLO的8位溢出向THO进位,THO计数溢出置位TCON中的溢出标志位TFO。
当GATE=O(TMOD.3)时,如 TRO=1,则定时器计数。GATE=1 时,允许由外部输入INTO 控制定时器0,这样可实现脉宽测量。TR0为TCON 寄存器内的控制位,TCON 寄在器各位的具体功能描述见上文TCON寄存器的介绍。
当 C/T=0 时,多路开关连接到系统时钟的分频输出,TO 对内部系统时钟计数,T0 工作在定时方式。当C/T=1 时,多路开关连接到外部脉冲输入 P3.4/T0,即 TO 工作在计数方式。
STC 单片机的定时器0有两种计数速率:一种是 12T 模式,每 12 个时钟加 1,与传统 8051 单片机相同:另外一种是 1T 模式,每个时钟加 1,速度是传统 8051 单片机的 12 倍。TO 的速率由特殊功能寄存器 AUXR中的 TOx12 决定,如果 TOx12=0,TO 则工作在 12T 模式,如果 TOx12=1,TO 则工作在1T 模式
5.定时器0计数寄存器(TL0,TH0)
当定时器/计数器0工作在16位模式时,TL0和TH0组合成一个16位寄存器,TL0为低字节,TH0为高字节。
6. 辅助寄存器1(AUXR)
T0x12(地址B7,即最高位):定时器0速度控制位
0:12T模式,即CPU时钟12分频
1:1T模式,即CPU时钟不分频
7.中断与时钟输出控制寄存器(INTCLKO)
T0CLKO:定时器0时钟输出控制
0:关闭时钟输出
1:使能P3.5口的是定时器0时钟输出功能。当定时器0计数发生溢出时,P3.5口的电平自动发生翻转
8.定时器0计算公式
9.定时器中断系统
(1) 中断向量表
void TM0_Rountine(void) interrupt 1;
(2) 中断使能寄存器
EA:总中断允许控制位。EA的作用是使中断允许形成多级控制。即各中断源首先受EA控制:其次还受各中断源自己的中断允许控制位控制。
0:CPU屏蔽所有的中断申请
1:CPU开放中断
ELVD:低压检测中断允许位。
0:禁止低压检测中断
1:允许低压检测中断
EADC:AD转换中断允许位。
0:禁止AD转换中断
1:允许AD转换中断
ES:串行口1中断允许位。
0:禁止串行口1中断
1:允许串行口1中断
ET1:定时/计数器T1的溢出中断允许位。
0:禁止T1中断
1:允许T1中断
EX1:外部中断1中断允许位。
0:禁止NT1中断
1:允许NT1中断
ET0:定时/计数器T0的溢出中断允许位。
0:禁止T0中断
1:允许T0中断
EX0:外部中断0中断允许位。
0:禁止NT0中断
1:允许NT0中断
(3)中断标志辅助寄存器
INT4IF:外部中断4中断请求标志。中断服务程序中硬件自动清零INT3IF:外部中断3中断请求标志。中断服务程序中硬件自动清零INT2IF:外部中断2中断请求标志。中断服务程序中硬件自动清零
T4F:定时器4溢出中断标志。中断服务程序中硬件自动清零(注意:此位为只写寄存器,不可读)。
T3IF:定时器3溢出中断标志。中断服务程序中硬件自动清零(注意:此位为只写寄存器,不可读)
T2IF:定时器2溢出中断标志。中断服务程序中硬件自动清零(注意:此位为只写寄存器,不可读)。
(二)定时器的配置
1.配置定时器0的模式1
步骤1:SYSclK:表示微控制器或嵌入式系统中的系统主时钟频率。为了方便计算,这里选择48MHZ。
步骤2:选择计数速率。有12T/1T模式的选择。对应寄存器AUXR中的T0x12,如果你想选择12T,那么T0x12置0,否则置1。
步骤3:置1连接。需要给这个部分置为1,开关才能连接。
-
为了目标输出为1,根据与门运算得:TR0=1,或门结果=1;
2.为了或门结果为1,根据或门运算得:非门结果=1;
3.为了非门结果为1,根据非门运算得:GATE=0;
最后打开相应的寄存器。
步骤4:配置计数器
根据定时器的计算公式,比如定时器0的模式1的12T模式
比如我想创建1ms的定时器周期,将1ms转换为0.001s,48MHZ转换为48000000HZ
配置相对应的寄存器就好了。
步骤5:计数位溢出时,TF0会自动置为1,下一步进入到中断。然后打开中断相对应的寄存器就好了!!!
2.示范代码
void vCore_Timer0_Init()//对定时器0进行初始化
{
AUXR &= 0x7F; //定时器时钟设置12T模式
TMOD &= 0xF0; //清空要配置的4位
TMOD |= 0x01; //设置GATE CT M1 M0 1111 0 0 01
TL0 = 0x60; //设置定时初始值(低位)
TH0 = 0xF0; //设置定时初始值(高位)
TF0 = 0; //TCON -TF0 清除TF0标志
TR0 = 1; //TCON -TR0定时器0开始计时
IE |= 0x82; //打开EA总中断 与定时器0中断 ET0
}
//定时器中断法
void TM0_Isr() interrupt 1
{
//进入中断会自动重置标志位,不用手动重置TF0
TL0 = 0x60; //设置定时初始值(由于设置的是不自动重置,因此要手动设置定时时间)
TH0 = 0xF0; //设置定时初始值
i++; //计数
if(i==1000)//由于定时器设置周期为1ms,当i==1000时,时间为1s。
{
P10 = !P10; //翻转LED
i=0;
}
}
void main()
{
STC8H_IOinit(); //STC15W单片机引脚初始化函数
vCore_Timer0_Init();//初始化T0定时器
while(1)
{
}
}