Timer0 寄存器配置
Timer0 的配置涉及到如下寄存器:
- TCON:定时器/计数器控制寄存器;
- TMOD:定时器模式寄存器;
- Timer 0:TH0, TL0
例:配置 Timer0 为 16 位定时器,定时时间为 20ms,产生溢出中断的代码如下:
/*********************************************************************
* 描 述 : 配置Timer0为16位定时器,定时时间20ms,开启中断
* 入 参 : 无
* 返回值 : 无
*********************************************************************/
void Timer0Init(void)
{
TMOD = 0x01; //16位定时器
TH0 = (65536-TIMER0_VALUE)/256; //写入初值
TL0 = (65536-TIMER0_VALUE)%256;
ET0 = 1; //使能Timer0溢出中断
EA = 1; //使能全局中断
TR0 = 1; //启动Timer0
}
定时器初值计算
先计算出定时时间,再用 65536(16 位定时器)-定时时间对应的数值,即得到定时器初值
- 系统时钟:16MHz
- 定时器使用的是系统时钟的12分频
- 假设预定的时间为T,对应的初值为:
代码
#include <stdio.h>
#include <reg24le1.h>
#include <stdint.h>
/* 本试验用到的nRF24LE1的管脚
P00:输出,驱动指示灯D1 (需要短接跳线)
*/
/*-------------------管脚定义--------------------------------------------------*/
#define D1 P00 // 开发板上的指示灯D1
#define TIMER0_VALUE 26666 //Timer0定时器定时20ms对应的数值
uint8_t count=0; //软件计数变量
/*******************************************************************************************************
* 描 述 : 配置 IO P0.0为输出
* 入 参 : 无
* 返回值 : 无
*******************************************************************************************************/
void IO_Init(void)
{
P0DIR &= ~0x01; //配置P0.0为输出
D1 = 1; //设置D1初始状态为熄灭
}
/*******************************************************************************************************
* 描 述 : 配置Timer0为16位定时器,定时时间20ms,开启中断
* 入 参 : 无
* 返回值 : 无
*******************************************************************************************************/
void Timer0Init(void)
{
TMOD = 0x01; //16位定时器
TH0 = (65536-TIMER0_VALUE)/256; //写入初值
TL0 = (65536-TIMER0_VALUE)%256;
ET0 = 1; //使能Timer0溢出中断
EA = 1; //使能全局中断
TR0 = 1; //启动Timer0
}
/*******************************************************************************************************
* 描 述 : 主函数
* 入 参 : 无
* 返回值 : 无
*******************************************************************************************************/
void main(void)
{
IO_Init(); //配置IO
Timer0Init(); //Timer0初始化
while(1); //死循环,等待Timer0溢出中断
}
/*******************************************************************************************************
* 描 述 : Timer0中断服务函数
* 入 参 : 无
* 返回值 : 无
*******************************************************************************************************/
void Timer0_irq() interrupt INTERRUPT_T0
{
TH0=(65536-TIMER0_VALUE)/256; //写入初值
TL0=(65536-TIMER0_VALUE)%256;
count++; //软件计数器加1
if(count==25) //500ms时间到
{
count=0; //软件计数器清零
D1 = ~D1; //D1指示灯状态取反
}
}