timerRA应用实例
实现功能:用定时器timerRA提供3个不同频率信号0.5Hz,1Hz和2Hz,分别用3个指示灯LED1、LED2、LED3以上诉3种不同的频率闪烁。LED1亮灭时间相同,LED2与LED3常态是灭状态,在频率边沿处闪烁一次。
注:用示波器可以更加精确地捕获输出信号的频率
流程图:
程序简介:
int led_shifttime = 0;
int led3_shifttime = 0;
void main(void)
{
/* Timer RA initialization sequence */
/* Low speed on-chip oscillator is used (125kHz) instead of external clocking */
//ocd2=1; // 选择On-chip oscillator clock作为system clock,因为复位后ocd2为1所以可以省略此句
/* 设置TRAO为输出端口 */
toena_traioc = 1;
/* 设置timerRA 位Timer mode */
tmod0_tramr = 0;
tmod1_tramr = 0;
tmod2_tramr = 0;
/* 选择片上低速时钟Low speed on-chip oscillator作为timerRA的时钟源 */
tck0_tramr = 0;
tck1_tramr = 1;
tck2_tramr = 0;
//RA timmer 中断发生间隔为t,则t=(trapre+1)*(pre+1)*1/ F(OCO)
trapre = 249;
tra = 249; //RA timer中断时间间隔为0.5s
/* 清零timerRA中的标志位 */
ir_traic = 0;
/* 设置timerRA中断等级为1级 */
ilvl1_traic = 1;
/* 开启timerRA定时器 */
tstart_tracr = 1;
/* 允许中断 */
ENABLE_IRQ;
/* LED0 LED1 LED2 LED3初始状态都是灭状态 */
p3 = 0x5A;
pd3 = 0xFF;
while (1)
{
if (led_shifttime == 2)
{
led_shifttime = 0; //led_shifttime计数周期为2个RA timer中断间隔,即2*0.5s=1s
LED1 = !LED1; //LED1每隔1s变换一次状态
LED2 = !LED2;
LED2 = !LED2; //LED2每隔1s闪烁一次
}
else
{
}
if(led3_shifttime == 1)
{
led3_shifttime =0; //led3_shifttime计数周期为1个RA timer中断间隔,即0.5s
LED3 = !LED3;
LED3 = !LED3; //LED3闪烁一次,间隔为0.5s
}
else
{
}
}
}
/***********************************************************************************
Function Name: timer_ra
Description: Timer RA中断函数.
Parameters: None
Return Value: None
***********************************************************************************/
/* timer RA (software int 22) */
#pragma interrupt timer_ra(vect=22)
void timer_ra(void)
{
led_shifttime++;
led3_shifttime++; //每进入一次RA timer中断,间隔为0.5s,两个计数加1
ir_traic = 0; //中断标志位IR清零
}
总结:
定时器timerRA的使用重点,首先设置timerRA的工作模式为timer mode;
第二,选择timerRA的时钟源;
第三,通过设置寄存器trapre和tra来得到发生timerRA中断的时间间隔
每次发生timerRA中断的间隔时间确定后,再在timerRA中断函数中设定相应的动作。相当于以中断间隔作为该动作发生的长度标尺。