STC15单片机定时器0工作模式介绍
Posted perseverance52
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STC15单片机定时器0工作模式介绍相关的知识,希望对你有一定的参考价值。
STC15单片机定时器0工作模式介绍
STC15单片机定时器工作模式与传统的51单片机有一点区别,在定时器0上,有自动重装载功能。
以指令周期1T
的模式为例,定时器0
计时5ms
为例,
- 定时器0,定时器模式:16位自动重装载方式;定时时间5ms。
- STC15系列单片机的定时器有两种计数速率:一种是12T模式,每12个时钟加1,与传统8051单片机相同;另外一种是1T模式,每个时钟加1,速度是传统8051单片机的12倍。T0的速率由特殊功能寄存器AUXR中的T0x12决定,如果T0x12=0,T0则工作在12T模式;如果TOx12=1,T0则工作在1T模式。
- 定时器0有2个隐藏的寄存器RL_TH0和RLTL0。RL _TH0与TH0共有同一个地址,RLTL0与TL0共有同一个地址。当TR0=0即定时器/计数器0被禁止工作时,对TL0写入的内容会同时写入RL_TL0,对TH0写入的内容也会同时写入RL_TH0。当TR0=1即定时器/计数器0被允许工作时,对TL0写入内容,实际上不是写入当前寄存器TL0中,而是写入隐藏的寄存器RL_TL0中;对TH0写入内容,实际上也不是写入当前寄存器TH0中,而是写入隐藏的寄存器RL_TH0。这样可以巧妙地实现16位重装载定时器。当读THO和TL0的内容时,所读的内容就是TH0和TL0的内容,而不是RL_TH0和RL_TL0的内容。
- 当定时器0工作在模式0(TMOD[1:0]/[M1,M0]-00B)时,[TL0,TH0]的溢出不仅置位TF0,而且会自动将[RL_TL0,RL_TH0]的内容重新装入[TL0,TH0]。
定时器时钟1T模式,那么分频系数就是除以1,如果是12T的模式就是除以12,
void Timer0Init(void) //5毫秒@11.0592MHz
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式&1111 0000,让TMOD高四位清零,并保存低四位不变化。
//选择定时器0工作方式为方式0
TL0 = 0x00; //设置定时初始值
TH0 = 0x28; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
- 定时器0,定时器模式:16位方式;定时时间5ms。
void Timer0Init(void) //5毫秒@11.0592MHz
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式,&1111 0000,让TMOD高四位清零,并保存低四位不变化。
TMOD |= 0x01; //设置定时器模式:选择定时器0工作方式为方式1,即16位定时器。
TL0 = 0x00; //设置定时初始值
TH0 = 0x28; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
从上面的官方文档信息可知,还是推荐使用定时器0,自动重装载方式,比较方便。
官方文档给出的示例
//假定测试芯片的工作频率为18.432MHz
#include "reg51.h"
typedef unsigned char BYTE;
typedef unsigned int WORD;
//-----------------------------------------------
#define FOSC 18432000L
#define T1MS (65536-FOSC/1000) //1T模式,18.432MHz
//#define T1MS (65536-FOSC/12/1000) //12T模式,18.432MHz
sfr AUXR = 0x8e; //Auxiliary register
sbit P10 = P1^0;
//-----------------------------------------------
/* Timer0 interrupt routine */
void tm0_isr() interrupt 1 using 1
P10 = ! P10; //将测试口取反
//-----------------------------------------------
/* main program */
void main()
AUXR |= 0x80; //定时器0为1T模式
// AUXR &= 0x7f; //定时器0为12T模式
TMOD = 0x00; //设置定时器为模式0(16位自动重装载)
TL0 = T1MS; //初始化计时值
TH0 = T1MS >> 8;
TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器0中断
EA = 1;
while (1);
- 调整了一下代码
#include "reg51.h"
typedef unsigned char BYTE;
typedef unsigned int WORD;
//-----------------------------------------------
#define FOSC 11059200L
#define T5MS (65536-5*FOSC/1000) //1T模式,110592MHz
//#define T5MS (65536-5*FOSC/12/1000) //12T模式,110592MHz
sfr AUXR = 0x8e; //Auxiliary register
sbit P10 = P1^0;
bit B_5ms; //5ms标志
unsigned int msecond; //计时
//-----------------------------------------------
/* Timer0 interrupt routine */
void tm0_isr() interrupt 1 using 1
B_5ms = 1;
void Timer0Init(void) //5毫秒@11.0592MHz
AUXR |= 0x80; //定时器时钟1T模式
// AUXR &= 0x7f; //定时器0为12T模式
TMOD &= 0xF0; //设置定时器模式
// TL0 = 0x00; //设置定时初始值
// TH0 = 0x28; //设置定时初始值
TL0 = T5MS; //初始化计时值
TH0 = T5MS >> 8;
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器0中断
EA = 1;
//-----------------------------------------------
/* main program */
void main()
Timer0Init();
while(1)
if(B_5ms) //5ms到达标志位
B_5ms = 0;
if(++msecond >= 200) //计数到达1S
msecond = 0;
P10 = ! P10; //将测试口取反
以上是关于STC15单片机定时器0工作模式介绍的主要内容,如果未能解决你的问题,请参考以下文章
11.STC15W408AS单片机CCP/PCA/PWM应用