以下是M051單片機的定時器2測試程序 成功!!!
#include "SmartM_M0.h"
bool flag = 0; //中斷標志位
/****************************************
*函數名稱:TMR2Init
*輸 入:無
*輸 出:無
*功 能:定時器2初始化
******************************************/
VOID TMR2Init(VOID)
{
PROTECT_REG
(
/* 使能TMR2時鐘源 */
APBCLK |= TMR2_CLKEN;
/* 選擇TMR2時鐘源為外部晶振12MHz */
CLKSEL1 = (CLKSEL1 & (~TM2_CLK)) | TM1_12M;
/* 復位TMR2 */
IPRSTC2 |= TMR2_RST;
IPRSTC2 &= ~TMR2_RST;
/* 選擇TMR2的工作模式為周期模式*/
TCSR2 &= ~TMR_MODE;
TCSR2 |= MODE_PERIOD;
/* 溢出周期 = (Period of timer clock input) * (8-bit Prescale + 1) * (24-bit TCMP)*/
/* 溢出周期 = (1/12MHz) * (0 + 1) * (12000*500)=500ms (0.5S)*/
TCSR2 = TCSR2 & 0xFFFFFF00; // 設置預分頻值 [0~255]
TCMPR2 = 12000*500; // 設置比較值 [0~16777215]
TCSR2 |= TMR_IE; //使能TMR0中斷
NVIC_ISER |= TMR2_INT;
TCSR2 |= CRST; //復位TMR0計數器
TCSR2 |= CEN; //使能TMR0
)
}
/****************************************
*函數名稱:main
*輸 入:無
*輸 出:無
*功 能:函數主體
******************************************/
INT32 main(VOID)
{
u8 i =0;
PROTECT_REG //ISP下載時保護FLASH存儲器
(
PWRCON |= XTL12M_EN; //默認時鐘源為外部晶振
while((CLKSTATUS & XTL12M_STB) == 0); //等待12MHz時鐘穩定
CLKSEL0 = (CLKSEL0 & (~HCLK)) | HCLK_12M; //設置外部晶振為系統時鐘
P2_PMD = 0x5555; //P2口設置為輸出模式
P2_DOUT= 0x00; //P2口輸出低電平
)
TMR2Init();
while(1)
{
if(flag)
{
flag = 0;
i++;
}
if(i>7)
{
i = 0;
}
P2_DOUT = 1UL<<i; //P2口輸出相應的電平
}
}
/****************************************
*函數名稱:TMR2_IRQHandler
*輸 入:無
*輸 出:無
*功 能:定時器2中斷服務函數
******************************************/
VOID TMR2_IRQHandler(VOID)
{
/* 清除TMR1中斷標志位 */
TISR2 |= TMR_TIF;
flag = 1;
}