一、實驗內容
分別使用定時器T1和T3使得LED周期性閃爍
二、實驗過程
1、定時器T1(查詢IRCON來控制)
(1)需要調配的寄存器
| T1CTL(0XE4) | Timer1控制寄存器 |
| BIT3,BIT2:定時器分頻倍數選擇 00:不分 01:8分頻 10:32分頻 11:128分頻 |
|
| BIT1,BIT0:定時器模式選擇: 00:暫停 01:自動重裝:0X0000—0XFFFF 10:比較計數:0X0000—T1CC0 11:PWM方式 |
|
| T1STAT(0XAF) | Timer1狀態寄存器: |
| BIT5:OVFIF 定時器溢出中斷標志,在數值達到計數終值時置為1. |
|
| Bit4: 定時器 1 通道 4 中斷標志位 |
|
| IRCON(0XCO) | 中斷標志位寄存器; |
(2)定時器T1的初始化:
T1CTL=0X0d; T1STAT=0X21;
(3)代碼實現
#include<ioCC2540.h> #define LED1 P1_0 //定義LED1,方便查閱代碼 void Init()//初始化函數 { P1SEL = 0X00; //實現LED的初始化 P1DIR = 0X01; P1INP = 0X00; LED1 = 0; T1CTL = 0X0d; //128分頻,自動重裝0X0000-0XFFFF;,時鍾頻率為16MHZ T1STAT = 0X21; //通道0,中斷有效 EA=1; } void main(void) { Init(); unsigned char count=0; while(1) { if(IRCON>0) //檢查是否置位為1 { IRCON=0; count++; //由於分頻128后,已經滿足1s的閃爍周期。 if(count>=1) { count=0; LED1=~LED1; } } } }
2、定時器T3(中斷方式)
(1)需要調配的寄存器
| T3CTL(0XCB) | Timer3:控制寄存器 |
| BIT7,BIT6,BIT5:定時器時鍾分頻倍數選擇 000:不分頻 001 :2 分頻 010 : 4 分頻 011 : 8分頻 100 :16 分頻 101 :32 分頻 110 : 64 分頻 111 :128分頻 |
|
| BIT4:T3起止控制位 | |
| BIT3:溢出中斷掩碼 0:關中斷溢出 1:開中斷溢出 |
|
| BIT2:清計數值,高電平有效 | |
| BIT1,BIT0:T3模式選擇: 00 :自動重裝 0X00 -0XFF |
|
| T3CCTL0(0XCC) | T3通道 0 捕獲/比較控制寄存器 |
| BIT6:T3通道 0 中斷掩碼 0:關中斷,1:開中斷 |
|
| BIT5,BIT4,BIT3:T3通道 0 比較輸出模式選擇 | |
| BIT2:T3通道 0 模式選擇: 0:捕獲 1:比較 |
|
| BIT1,BIT0:T3通道 0 捕獲模式選擇: 00 沒有捕獲 01 上升沿捕獲 10 下降沿捕獲 11 邊沿捕獲 |
|
| T3CC0(0XCD) | T3 通道 0 捕獲 / 比較寄存器 |
| T3CCTL1(0XCE) | T3通道 1 捕獲/比較控制寄存器 |
| BIT6:T3通道1中斷掩碼 0:關中斷,1:開中斷 |
|
| BIT5,BIT4,BIT3:T3通道 1 比較輸出模式選擇 | |
| BIT2:T3通道 1 模式選擇: 0:捕獲 1:比較 |
|
| BIT1,BIT0:T3通道 1 捕獲模式選擇: 00 沒有捕獲 01 上升沿捕獲 10 下降沿捕獲 11 邊沿捕獲 |
|
| T3CC1(0XCF) | T3 通道 1 捕獲 / 比較寄存器 |
定時器T3有 4種工作模式:分別是自由、正計數 /倒計數模式、 倒計數模式。
(2)代碼實現(使用自由模式)
無法解析此遠程名稱: 'util.cnblogs.com#include<ioCC2540.h> #define LED1 P1_0 //定義LED1,方便查閱代碼 unsigned char count=0; void Init()//初始化函數 { P1SEL = 0X00; //實現LED的初始化 P1DIR = 0X01; P1INP = 0X00; LED1 = 0; T3CTL = 0X08; //開溢出中斷 T3IE = 1; //開縱中斷和T3中斷 T3CTL |= 0XE0; //開128分頻,128/(16*10e6)*N=0.5s,N=65536; T3CTL &= ~0x03; //自動重裝 貌似溢出的數值改變成256.。不懂為什么。。 T3CTL |= 0X10; //2分頻(16MHZ),然后就是開始啟動 EA=1; //打開中斷總閘 } void main(void) { Init(); while(1) { } } #pragma vector = T3_VECTOR __interrupt void fu() { IRCON = 0x00; //清除中斷標志 count++; if(count>250) { count = 0; LED1=~LED1; } }

