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(); //配置IOTimer0Init(); //Timer0初始化while(1); //死循环,等待Timer0溢出中断}/******************************************************************************************************** 描 述 : Timer0中断服务函数* 入 参 : 无* 返回值 : 无*******************************************************************************************************/void Timer0_irq() interrupt INTERRUPT_T0{TH0=(65536-TIMER0_VALUE)/256; //写入初值TL0=(65536-TIMER0_VALUE)%256;count++; //软件计数器加1if(count==25) //500ms时间到{count=0; //软件计数器清零D1 = ~D1; //D1指示灯状态取反}}
