?? t2定時器.txt
字號:
/********************************************************************************************
* 文 件 名:test.c
* 功 能:使用T2定時器實現(xiàn)1秒精確定時并閃燈
* 1.CPU型號:AT89S52
* 2.晶振:12.000MHz
*********************************************************************************************/
#include "reg52.h" // 包含頭文件
#define uint unsigned int
#define uchar unsigned char
sbit P1_7 = P1 ^ 7; // 定義位變量
/********************************************************************************************
* 函數(shù)名稱:Timer2_Server()
* 功 能:定時器2溢出中斷。
* 入口參數(shù):無
* 出口參數(shù):無
* 注 意:在本函數(shù)中設(shè)置了一個靜態(tài)變量Timer2_Server_Count,靜態(tài)變量的值在進入函數(shù)時是不會被
* 初始化的,而是保持上次的值。它用來計數(shù)T2定時器的溢出次數(shù)(進入本函數(shù)的次數(shù)),每
* 溢出16次,就控制一次LED11反轉(zhuǎn)顯示。這時的時間正好是1秒,而且是精確的1秒!只與晶振
* 的精度有關(guān)。
*********************************************************************************************/
void Timer2_Server(void) interrupt 5
{
static uint Timer2_Server_Count;
// 定義靜態(tài)變量,用來計數(shù)T2定時器的溢出次數(shù)(進入本函數(shù)的次數(shù))
TF2=0;
// T2定時器發(fā)生溢出中斷時,需要用戶自己清除溢出標記,而51的其他定時器是自動清除的?
Timer2_Server_Count++;
if(Timer2_Server_Count==16) // T2定時器的預(yù)裝載值為0x0BDC,溢出16次就是1秒鐘。
{
Timer2_Server_Count=0;
P1_7=~P1_7; // LED11反轉(zhuǎn)顯示。
}
}
/********************************************************************************************
* 函數(shù)名稱:main()
* 功 能:使用T2定時器實現(xiàn)1秒精確定時并使LED11閃燈,即LED11亮1秒,滅1秒,亮1秒,滅1秒......
* 注 意:
* 1、要精確定時,必須使用定時器的自動裝載方式。本實驗使用T2定時器,讓它工作在16bit自動
* 裝載方式,這時,有另一個位置專門裝著16位預(yù)裝載值,當T2溢出時,預(yù)裝載值立即被裝入,
* 這就保證了精確定時。
* 2、T2定時器是一個16位定時器,最長的溢出時間也就幾十毫秒,要定時1秒,就需要用一個變量
* 來保存溢出的次數(shù),積累到了一定的次數(shù)后,才執(zhí)行一次操作。這樣就可以累加到1秒或者更
* 長的時間才做一次操作。
* 3、當T2定時器發(fā)生溢出中斷時,需要用戶自己清除溢出標記,而51的其他定時器是自動清除的。
* 4、T2定時器預(yù)裝載值的計算:
* 設(shè)晶振為12MHz,每秒鐘可以執(zhí)行1000000(12000000/12)個機器周期。而T2每次溢出時最多
* 經(jīng)過了65536個機器周期。我們應(yīng)該盡量讓T2定時器的溢出中斷的次數(shù)最少,這樣對主程序的干擾
* 也就最小。
* 選擇每秒中斷14次,每次溢出1000000/14=71428.57個機器周期,不為整數(shù)且超出65536個機器周期,有效。
* 選擇每秒中斷16次,每次溢出1000000/16=62500個機器周期,小于65536個機器周期,有效。
* 選擇每秒中斷20次,每次溢出1000000/20=50000個機器周期,小于65536個機器周期,有效。
* .
* .
* .
* 通過上面的計算,我們可以發(fā)現(xiàn),我們可以選擇的方式有很多,但是最佳的是每秒中斷16次,每次
* 溢出62500個機器周期,那么賦給T2定時器的初值應(yīng)為65536-62500=3036,轉(zhuǎn)換成十六進制值為
* 0x0BDC。
*********************************************************************************************/
void main (void)
{
P1_7=1; // LED11滅
/* T2定時器賦預(yù)裝載值,溢出16次就是1秒。 */
RCAP2H=0x0B;
RCAP2L=0xDC;
ET2=1; // 允許T2定時器中斷
EA=1; // 打開總中斷
TR2=1; // 啟動T2定時器
while(1); // 死循環(huán),等待T2定時器的溢出中斷
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -