T2的使用主要是用定时器2来改变小灯的状态,T2每发生一次中断小灯改变状态一次。
这个实验共用到P1、P1DIR、P1SEL、T2CNF、T2PEROF2、T2CAPLPL和T2CAPLPH几个个寄存器。其中前几个的作用前面的文章里应经介绍过了,这里就不再重复说明了。这里主要是讲一下后几个寄存器的作用。其中T2CNF是T2配置寄存器,T2PEROF2是T2溢出计数器2寄存器,T2CAPLPL是T2周期寄存器低字节,T2CAPLPH是T2周期寄存器高字节。另外还有一个IEN0是中断使能寄存器0。
现在来看一下试验的相关函数:
void Initial(void)
{
LED_ENALBLE();
//用T2来做实验
SET_TIMER2_CAP_INT(); //开比较中断
//TIMER2_CMP_HIGH_BYTE();
SET_TIMER2_CAP_COUNTER(0X0FFF);
//SET_TIMER2_CAP_COUNTER(10000);
}
要注意一下SET_TIMER2_CAP_INT()和SET_TIMER2_CAP_COUNTER(0X0FFF)的定义,
#define SET_TIMER2_CAP_INT() \
do{ \
EA = 1; \ 打开全局中断
T2IE = 1; \ 打开T2中断
T2PEROF2 |= 0x40; \ 打开T2溢出中断
}while(0)
#define SET_TIMER2_CAP_COUNTER(val) SET_WORD(T2CAPLPL,T2CAPHPH,val)
//将无符号整形数val高8位写入T2CAPLPL,低8位写入T2CAPHPH。
启动T2
#define TIMER2_RUN() T2CNF|=0X01
停止T2
#define TIMER2_STOP() do{T2CNF&=0XFE;}while(0)
最后我们要看一下T2的ISR
#pragma vector = T2_VECTOR
__interrupt void T2_ISR(void)
{
CLEAR_TIMER2_INT_FLAG(); //清T2中断标志
if(counter<200)counter++; //200次中断LED闪烁一轮
else
{
counter = 0; //计数清零
TempFlag = 1; //改变闪烁标志
}
}
主要的就是这些了,有了前一个实验,这个实验就不用放主程序了。
本文转载自阿元的新浪博客:http://blog.sina.com.cn/s/blog_4c8287230100av5z.html
文章评论(0条评论)
登录后参与讨论