一.前言
上次我們學習了了用定時器3進行查詢方式來進行溢出判斷,今天我們來換一種方式,用中斷方式來檢測和查詢定時器3的溢出。
二.原理與分析
要使用定時器3,我們必須先要配置的是T3CTL,來把定時器3初始化,進行工作模式和頻率的選擇,要使用中斷模式來控制定時器3,我們還要配置中斷的控制寄存器,T3IE和總中斷EA。T3CTL的配置和上次的一樣。
三.程序
#include <ioCC2530.h>
#define uint unsigned int
#define uchar unsigned char
//定義控制LED燈的端口
#define LED1 P1_0 //LED1為P1_0端口控制
#define LED2 P1_1 //LED2為P1_1端口控制
#define LED3 P1_4 //LED3為P1_4端口控制
//函數聲明 void Delayms(uint xms); //延時函數
void InitLed(void); //LED_IO初始化函數
void InitT3(void); //Timer3中斷方式初始化函數
//由於是中斷函數用到,一定要定義為全局變量
uint count=0;//用於計算溢出中斷的次數
/***************** 函 數 名 : main 功能描述 : Timer3測試(Timer3中斷方式的使用) 輸入參數 : NONE 輸出參數 : NONE 返 回 值 : NONE ******************/
void main(void)
{
InitLed(); //調用初始化函數
InitT3();
while(1) { } }
/********************* 函 數 名 : T3_ISR 功能描述 : 中斷服務函數 輸入參數 : NONE 輸出參數 : NONE 返 回 值 : NONE *********************/ #pragma vector = T3_VECTOR //Timer3中斷向量
__interrupt void T3_ISR(void)
{ IRCON = 0x00; //清中斷標志, 也可由硬件自動完成
if((++count)>254) //254次中斷后LED取反,閃爍一輪(0.5 秒時間)
{
count = 0; //計數清零
LED1=~LED1;
LED2=~LED2;
LED3=~LED3; }
}
/************************ 函 數 名 : Delayms 功能描述 : 毫秒延時 輸入參數 : xms:延時時間,如 i=xms 即延時i毫秒 輸出參數 : none 返 回 值 : none ********************/
void Delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=587;j>0;j--); }
/******************** 函 數 名 : InitLed 功能描述 : LED_IO初始化函數 輸入參數 : NONE 輸出參數 : NONE 返 回 值 : NONE ************************/
void InitLed(void)
{
P1DIR |= 0xff; //P1端口定義為輸出
LED1 = 1; //LED1燈熄滅
LED2 = 1;
LED3 = 1; }
/******************** 函 數 名 : InitT3 功能描述 : Timer3中斷方式初始化函數 輸入參數 : NONE 輸出參數 : NONE 返 回 值 : NONE *************************/
void InitT3(void)
{
T3CTL|=0XE0; //128分頻,
T3CTL |= 0x08 ; //開溢出中斷
T3CTL &= ~0X03; //自動重裝0x00---0xFF
T3IE = 1; //開Timer3中斷
EA = 1; //開總中斷
T3CTL |=0X10; //啟動
}
四.原理與分析
通過本次實驗,我們應該會用中斷來控制定時器了,通過開總中斷EA和定時器3中斷T3IE來控制定時器3的運行。