51单片机定时器中断配置

8 篇文章 0 订阅
2 篇文章 0 订阅

测试环境

单片机型号:STC8G1K08-38I-TSSOP20,其他型号请自行测试;
IDE:Keil C51;

定时器配置及主要代码

以定时器T0为例,查看手册,有4种工作模式:模式0(16位自动重装载模式),模式1(16位不可自动重装载模式),模式2(8位自动重装载模式),模式3(不可屏蔽中断的16位自动重装载模式);
与定时器T0相关的寄存器如下图:
在这里插入图片描述在这里插入图片描述在这里插入图片描述
我们使用定时器T0的模式0,因此要将TMOD寄存器的低4位全部设置为0,另外,还需要配置辅助寄存器AUXR,如下图:
在这里插入图片描述
使用1T模式,将AUXR的最高位T0x12位设置为1;

在这里插入图片描述上图中红框中的公式为模式0定时器重载值的计算方法,
假设时钟频率为fOSC,重载值[TH0,TL0]为Reload,定时器T0为16位,1T模式,向上计数,到溢出的时候,共计数65536-Reload次,每次耗时1/fOSC,单位为秒,如果我们需要中断的时间为1ms,即定时器周期为1/1000ms,则:
65536 − R e l o a d f O S C = 1 1000 \frac{65536-Reload}{f_{OSC}}=\frac{1}{1000} fOSC65536Reload=10001
即:
R e l o a d = 65536 − f O S C 1000 Reload = 65536 -\frac{ f_{OSC}}{1000} Reload=655361000fOSC
综上,T0定时器的初始化,代码如下,其中系统时钟频率为宏定义方式,可按实际情况修改:

#define FOSC     				22118400L//时钟主频22.1184Mhz
/*******************************************************************************
  * 函数名:T0_Init
  * 功  能:定时器T0初始化
  * 参  数:无
  * 返回值:无
  * 说  明:模式0,16位自动重载模式,1ms中断
*******************************************************************************/
void T0_Init(void)
{
	uint16_t u16Reload = 0;
	AUXR |= 0x80;//T0为1T模式
	TMOD &= 0xF0;//T0为16位自动重载
	
	u16Reload = (uint16_t)((uint32_t)65536 - ((uint32_t)FOSC / 1000));
	TL0 = (uint8_t)(u16Reload >> 0);		//设置定时初始值
	TH0 = (uint8_t)(u16Reload >> 8);		//设置定时初始值
	
	//中断优先级1,较低级
	IP |= 0x02;//PT0=1
	IPH &= 0xFD;//PT0H=0
	
	TF0 = 0;//清除T0溢出中断标志
	TR0 = 1;//定时器T0开始计时
	ET0 = 1;//使能定时器中断
}

在定时器中断中,可以根据需要添加代码或函数:

/*******************************************************************************
  * 函数名:T0_ISR
  * 功  能:定时器T0中断
  * 参  数:无
  * 返回值:无
  * 说  明:定时器T0,1ms中断
*******************************************************************************/
void T0_ISR(void) interrupt 1
{
	TF0 = 0;//清除中断标志位
	//do something(添加需要的代码)
}

另外,还要开启总中断,即EA = 1,可以放到main函数初始化时执行;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值