1.1 任务 用定时器1来控制LED1闪烁时亮灭间隔的时间
1.2 寄存器配置
(1)T1CTL——定时器1的控制
T1CTL是定时器1的控制寄存器。第2~3位DIV[1:0]对应定时器1的分频器划分值,设置为128;第0~1位对应定时器1的运行模式:这里设置为在自由模式下运:T1CTL = 0x0d;
(2)CLKCONCMD——时钟控制命令
CLKCONCMD:钟控制命令寄存器第6位OSC:系统时钟源选择
该位的默认值是1,对应16MHz RCOSC第3~5位TICKSPD[2:0]:定时器标记输出设置
默认值为001,即对应16MHz
所以,定时器的标记输出设置默认为16MHz
当定时器1的分频值(T1CTL:DIV[1:0]=11)设置为128时
对应的时钟频率为16M/128=1/8MHz,周期为8us。
当定时器1处于自由运行模式,即从0x0000~0xFFFF计数时,它溢出一次的周期为8usX65536=524288us(520ms)。
1.3源码分析
(查询)
// 在main函数中,先通过Init_T1()设置好定时器1的分频值和运行模式,并且让定时器1启动。
//在while(1)中,通过不断检测定时器1的中断标志T1IF是否被置1,来判断它是否产生溢出,
//如果有,就改变LED1的亮灭状态,并且清除中断标志T1IF。
#include <ioCC2530.h>
typedef unsigned char uchar;
typedef unsigned int uint;
//为LED1相关的I/O端口引脚定义一个宏
#define LED1 P1_0
//函数声明
void Init_Led(void);//初始化LED函数
void Init_T1(void);//初始化定时器1函数
#include <ioCC2530.h>
typedef unsigned char uchar;
typedef unsigned int uint;
//为LED1相关的I/O端口引脚定义一个宏
#define LED1 P1_0
//函数声明
void Init_Led(void);//初始化LED函数
void Init_T1(void);//初始化定时器1函数
/********************主函数********************/
int main(void)
{
Init_Led();//初始化LED函数
Init_T1();//初始化定时器1函数
while(1)
{
if(T1IF)//如果定时器1中断标志为1,表明定时器1产生溢出
{
LED1 =! LED1;//LED1亮灭状态改变
T1IF = 0;//清除定时器1中断标志
}
}
}
(中断)
#include <ioCC2530.h>
typedef unsigned char uchar;
typedef unsigned int uint;
uchar count = 0;//用于定时器计数
//为LED1相关的I/O端口引脚定义一个宏
#define LED1 P1_0
//函数声明
void Init_Led(void);//初始化LED函数
void Init_T1I(void);//初始化定时器1(中断方式)函数
/*********初始化LED函数**********/
void Init_Led(void)
{
P1DIR |= 0x01;//设置P1.0为输出
}
/*********初始化定时器1(中断方式)函数*************/
void Init_T1I(void)
{
T1CTL |= 0x0C;//128分频;
T1IF = 0; //清除定时器1的中断标志
T1STAT &=~ 0X20; //清除定时器1的溢出中断标志
TIMIF |= 0x40; //使能定时器1的溢出中断
T1IE = 1; //IEN1使能定时器1中断
EA = 1; //使能总中断
T1CTL = 0x0d; //定时器1启动
}
//定时器1中断处理函数
#pragma vector = T1_VECTOR
__interrupt void T1_ISR(void)
{
if(++count == 6(n)) //128/16MHz*65536*n=3s,n=0.9537
{
count = 0;//计数清零
LED1 = !LED1;//LED1亮灭状态改变
}
T1IF = 0;//清除定时器1中断标志, 也可由硬件自动清除
}
/********************
主函数
********************/
int main(void)
{
Init_Led();//初始化LED函数
Init_T1I();//初始化定时器1(中断方式)函数
while(1);//让程序永远在这里运行
}
补充说明
在main函数中,先通过Init_T1I()函数初始化以中断方式使用定时器1的设置,然后用“while(1);”让程序永远在这里运行,如果定时器1产生溢出中断,则会进入中断处理函数执行中断服务程序。中断处理函数的格式曾经在实验3——外部中断控制LED亮灭相关的例程中介绍过,这里只需要把中断向量相应地改为T_VECTOR即可。在中断处理函数中,通过一个全局变量count来计数,因为定时器3溢出一次的周期为:128/16MHz*65536=2048us,所以如果要定时0.5s,需要溢出0.5*1000000/(8*65536)=0.9537次,这里选择当定时器1溢出1次时,让count清零,并且让LED1亮灭状态改变。此外,在中断处理函数中,还应当清除定时器1的中断标志,当然这也可以由硬件自动清除。