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工作模式介绍的主要内容,如果未能解决你的问题,请参考以下文章

8.STC15W408AS单片机定时器/计数器

8.STC15W408AS单片机定时器/计数器

STC15定时器2模式0作为波特率发生器示例程序

11.STC15W408AS单片机CCP/PCA/PWM应用

11.STC15W408AS单片机CCP/PCA/PWM应用

11.STC15W408AS单片机CCP/PCA/PWM应用