1.实现功能
使LED1与LED2交替闪烁 周期为1s
2.元件连接方式
P1_0连接LED1
P1_1连接LED2
3.定时器1相关寄存器:
T1CNTL:定时器1计数器低位字节
T1CNTH:定时器1计数器高位字节
T1CTL:定时器1控制器
T1STAT:定时器1状态标志位
T1CTL:定时器1控制器
端口 | Bit位 | 名称 | 初始化 | 读/写 | 描述 |
T1CTL (0xE4) | 7:4 | --- | 0000 | R0 | 未使用 |
3:2 | DIV[1:0] | 00 | R/W | 时钟分频 00:不分频 01:8分频 10:32分频 11:128分频 | |
1:0 | MODE[1:0] | 00 | R/W | 定时器1模式选择 00:暂停运行 01:自由模式(从0X0000至OXFFFF反复计数) 10:模计数,从0x000到T1CC0反复计数 11:正计数/倒计数,从0x0000到T1CC0反复计数并且从T1CC0倒计数到0x0000 |
T1CCnH、T1CCnL:定时器1捕获寄存器高低字节。
T1STAT定时器1状态标志位
端口 | Bit位 | 名称 | 初始化 | 读/写 | 描述 |
T1STAT (0xAF) | 7:6 | --- | 00 | R0 | 未使用 |
5 | OVFIF | R/W0 | 定时器1计数器溢出中断标志,在自由模式和模模式到达终点计数值,在正/倒计数模式中到达0。写1无效。 | ||
4 | CH4IF | R/W0 | 定时器1通道4中断标志位,当通道4中断条件发生时设置。写1无效。 | ||
3 | CH3IF | R/W0 | 定时器1通道3中断标志位,当通道3中断条件发生时设置。写1无效。 | ||
2 | CH2IF | R/W0 | 定时器1通道2中断标志位,当通道2中断条件发生时设置。写1无效。 | ||
1 | CH1IF | R/W0 | 定时器1通道1中断标志位,当通道1中断条件发生时设置。写1无效。 | ||
CH0IF | R/W0 | 定时器1通道0中断标志位,当通道0中断条件发生时设置。写1无效。 |
IRCON(0xC0)——中断标志位寄存器(0:无中断请求 1:有中断请求)
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
睡眠定时器 | 必须为0 | 端口0 | 定时器4 | 定时器3 | 定时器2 | 定时器1 | DMA完成 |
4.部分代码分析
定时器1初始化编程
T1CTL = 0x0d; //128分频,自动重装 0X0000-0XFFFF
T1STAT = 0x21; //通道0, 中断有效
IRCON = 0;
晶振为32MHz,系统默认2分频,再分128次,即定时器1产生一次中断的时间为(32*10^6)/(2*128*16^4)≈0.5(好坑呀,用了定时器结果还是只能约等于!)
5.完整代码
#include <ioCC2530.h>
#define uchar unsigned char
#define uint unsigned int
//引脚定义
#define LED1 P1_0
#define LED2 P1_1
//函数声明
void ledInit(); //LED初始化
void T1Init(); //定时器1初始化
//变量声明
uchar count = 0; //计定时器1中断次数
/*********************
LED初始化
*********************/
void ledInit()
{
P1SEL &= ~0x03;
P1DIR |= 0x03;
P1INP &= ~0x03;
LED1 = 1;
LED2 = 0;
}
/*********************
定时器1初始化
*********************/
void T1Init()
{
T1CTL = 0x0d; //128分频,自动重装 0X0000-0XFFFF
T1STAT = 0x21; //通道0, 中断有效
IRCON = 0;
}
/*********************
主函数
*********************/
void main()
{
ledInit();
T1Init();
while(1)
{
if(IRCON == 0x02)
{
IRCON &= ~0x02;
count ++;
if(count == 1) //其实本程序可以不用count
{
LED1 = ~LED1;
LED2 = ~LED2;
count = 0;
}
}
}
}
