STC89x 定时器2 T2配置

上次博主转发了一篇比较不错的文章关于STC51的第三个定时器T2详解。今天写了个小测试程序,发现它作为定时器使用时。是16位自动重装载的,值得注意的是在我STC89C52RC上测试发现它不是硬件置位,也就是说在定时/计数溢出需要手动清除标志位。
以下是测试代码:

#include "timer.h"
// 主函数
void main()	
{
	P30=1;  			//初始化 板载P30口的指示灯为灭
	P31=1; 
	Timer0_Init(100);	//定时器0初始化,范围 1-256  	此处100us
	Timer2_Init(1000);	//定时器2初始化,范围 1-65536  此处1ms
	while(1)
	{
		;
	}
}

由于我为了对比传统T0,于是在这里把T0和T2都写了进来,除此之外,T1的配置方式同T0,还有一点就是,因为T0和T1在STC89系列上面好像不能配置16位自动重载模式,尽管我在 STC89C52RC的官方文档有所见到描述,但需要注意,若要配置16位定时/计数 模式,需要软件重装。而我在这选择8位自动重载模式。
在这里插入图片描述

#include "timer.h"
// 平台MCU:STC89C52RC
/**********************************************************
 *	函数名:Timer0_Init()		
 *	功	能:定时器0  初始化函数 @11.0592MHz  12T模式
 *	入参数:time_0 定时时间,单位 微秒0-256 值越小误差越大
 *					1us 误差8.51%, 100us 误差0.17%
 *	模	式:8位自动重装载(16位需要软件重载)
 *	返回值:无
 *********************************************************/
void Timer0_Init(uint8 time_0)		//1微秒@11.0592MHz
{
	AUXR &= 0x7F;					//定时器时钟12T模式
	TMOD &= 0xF0;					//使用模式2,
	TMOD |= 0x02;					//使用"|"或 可以在使用多个定时器时不受影响		    
	// TMOD为定时计数器的模式设置,00,01(常用),10(一般给串口),11 四种
	TL0=(256-time_0);				//给定初值,这里使用定时器最大值从0开始计数一直到256溢出
	TH0=(256-time_0);				//自动重载值
	
	EA=1;            				//总中断打开
	ET0=1;           				//定时器0中断使能
	TR0=1;           				//定时器0开关打开,开始计时
	
}

/**********************************************************
 *	函数名:Timer2Init()		
 *	功	能:定时器2  初始化函数 @11.0592MHz  12T模式
 *	入参数:u16 time_2 定时时间,单位毫秒 范围:1000-65535
 *					0-999   则为微秒
 *	模	式:16位  无自动重装载
 *	返回值:无
 *********************************************************/
void Timer2_Init(uint16 time_2)		  //1毫秒@11.0592MHz
{
	T2MOD = 0;								//初始化模式寄存器
	T2CON = 0;								//初始化控制寄存器
	TL2 = (65536-time_2)%256;				//设置定时初始值
	TH2 = (65536-time_2)/256;				//设置定时初始值
	RCAP2L = TL2;							//设置定时重载值
	RCAP2H = TH2;							//设置定时重载值
	TR2 = 1;								//定时器2开始计时
	
	EA=1;									//开总中断
	ET2=1;            						//定时器2中断使能
	TR2=1;            						//定时器2开关打开
}

/*	定时器0中断程序	100us 中断*/
uint16 m;
void Timer0_ISR() interrupt 1 using 1
{
//	TF0 = 0;					//清除TF0标志, 硬件置位,故在此注释掉
/*  用户中断服务程序 */
	
 if(m==1000*10)  				// 1000  ms
   {
     m = 0;
     P31=!P31;             		//板载LED
   }
   m++;
}

/*  Timer2中断服务子函数	1ms 中断*/
	uint16 n;
void Timer2_ISR() interrupt 5 using 1
{ 
   TF2 = 0;                  	//软件置位**需手动清中断标志  
  if(n==500)  					// 500ms
   {
     n = 0;
     P30=!P30;                  //LED 状态取反
   }
   n++;
}

每天学习一点点,好的习惯从认真做笔记开始。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Guard_Byte

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值