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
0
R/W0
定时器1计数器溢出中断标志,在自由模式和模模式到达终点计数值,在正/倒计数模式中到达0。写1无效。
4
CH4IF
0
R/W0
定时器1通道4中断标志位,当通道4中断条件发生时设置。写1无效。
3
CH3IF
0
R/W0
定时器1通道3中断标志位,当通道3中断条件发生时设置。写1无效。
2
CH2IF
0
R/W0
定时器1通道2中断标志位,当通道2中断条件发生时设置。写1无效。
1
CH1IF
0
R/W0
定时器1通道1中断标志位,当通道1中断条件发生时设置。写1无效。
0
CH0IF
0
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; } } } }
转载于:https://www.cnblogs.com/Donut/p/4124034.html