16 位重载定时器在两种时钟模式下,分别有两种工作模式。16 位重载定时器可以作为间隔定时器当在定时器中发生向下溢出时,会产生一个中断信号。该定时器在各工作条件下的触发模式如表7-6 所示
表7-6 16 位重载定时器工作模式

7.5.1 16 位重载定时器原理及应用
内部时钟模式下触发:
软件触发模式:计数使能位设为1,软件触发位(TRG)设为1。
外部边沿触发输入模式:计数使能位设为1,且MOD0~MOD2 下设置的有效边沿在TI 口被扫描到。
外部电平输入模式:计数使能位设为1,且MOD0~MOD2 下设置的有效高地电平在TI 口被扫描到。
外部时钟模式下触发:计数时钟设置位为111,且MOD0~MOD2 下设置的有效边沿在TI 口被扫描到。
定时器的状态控制及状态间的转换如图7-6 所示

7.5.2 16 位重载定时器寄存器配置及I/O 端口选择
16 位重载定时器的对应引脚较为简单:TI0 和TO0 。TI0 主要用来作为外部脉冲输入以触发定时器开始工作;TO0 则作为重载定时器信号的外部输出。
16 位重载定时器的寄存器有:重载定时器状态控制寄存器(TMCSRH0)/(TMCSRL0), 重载定时器计数寄存器(TMRH0)(TMRL0)定时器重载寄存器/。/,(TMRLRH0)(TMRLRL0)
重载定时器状态控制寄存器(TMCSRH0)控制寄存器时钟模式和触发模式。
重载定时器状态控制寄存器(TMCSRL0)包括了软件触发位,计数使能位,向下溢出中断请求标志位,中断使能位,重载工作模式选择位,针脚电平输出选择位,定时器输出使能位。
重载定时器计数寄存器(TMRH0)/(TMRL0)设定了16 位的向下计数值。
定时器重载寄存器(TMRLRH0)/(TMRLRL0)设定了16 位的重载计数值。
计数器的状态由定时器控制状态寄存器的CNTE 和内部等待信号决定,通过设置,可将计数器设置位停止态(Stop Status),等待态(Wait Status )和计数(运行)态(Run Status)。
7.5.3 16 位重载定时器应用设计范例
本节通过一个16 位重载定时器的实例来具体说明其应用。代码说明:通过重载定时器实现LED 从0 到9 循环亮,每1.5 秒改变一次。
#include "mb95100.h"
#define SEG_A 0xFE
#define SEG_B 0xFD
#define SEG_C 0xFB
#define SEG_D 0xF7
#define SEG_E 0xEF
#define SEG_F 0xDF
#define SEG_G 0xBF
#define SEG_DP 0x7F
#define SEG_0 SEG_A & SEG_B & SEG_C & SEG_D & SEG_E & SEG_F
#define SEG_1 SEG_B & SEG_C
#define SEG_2 SEG_A & SEG_B & SEG_D & SEG_E & SEG_G
#define SEG_3 SEG_A & SEG_B & SEG_C & SEG_D & SEG_G
#define SEG_4 SEG_B & SEG_C & SEG_F & SEG_G
#define SEG_5 SEG_A & SEG_C & SEG_D & SEG_F & SEG_G
#define SEG_6 SEG_A & SEG_C & SEG_D & SEG_E & SEG_F & SEG_G
#define SEG_7 SEG_A & SEG_B & SEG_C
#define SEG_8 SEG_A & SEG_B & SEG_C & SEG_D & SEG_E & SEG_F & SEG_G
#define SEG_9 SEG_A & SEG_B & SEG_C & SEG_D & SEG_F & SEG_G
const unsigned char seg_display[12] = { SEG_0, SEG_1, SEG_2, SEG_3, SEG_4,
SEG_5, SEG_6, SEG_7, SEG_8, SEG_9, 0xff, 0x00 }; // 初始化设置LED
/*****************************************************************************/
/*主程序部分*/
/*****************************************************************************/
char counter;
void main(void)
{ PDR0 = 0xff; // Port 0:
DDR0 = 0xff; // 7-Segment display (all segments off) 7 段LED 显示输出口
// Initialise Reload-Timer
TMRLR0 = 46874; // 设置重载值: (46874+1) * 3.2us = 150ms
TMCSR0 = 0x285B; // 在 10 MHz 状态工作时钟为 3.2us, 重载模式, IRQ 使能,输出使能
// Application Start 中断设置,应用功能开始
counter = 0;
InitIrqLevels(); // allow all levels
__EI(); // globaly enable interrupts
while(1)
{
asm("\tNOP"); // do nothing, 7-Segment counter is controlled by the Reload-Timer
}
}
/*****************************************************************************/
/*Interrupts 中断子程序,使LED 循环显示 */
/*****************************************************************************/
__interrupt void IRQ_ReloadTimer0 (void)
{
PDR0 = seg_display[counter++];
if (counter == 10)
counter = 0; // 循环显示
TMCSRL0_UF = 0; // 清中断位
}


