?? abc.txt
字號:
使用AT89S52的T2定時器實現1秒精確定時(C51)
作者:POWER 來源:斯凱科技 點擊數:112 更新時間:2007年02月05日
/********************************************************************************************
* 文 件 名:test011.c
* 功 能:使用T2定時器實現1秒精確定時并閃燈
* 硬件條件:1.CPU型號:AT89S52
* 2.晶振:12.000MHz
* 3.用跳線帽短接LED11__P1.7
* 作 者:POWER
* 日 期:2006年12月12號
* 斯凱科技主頁:www.armsky.net
* 斯凱科技論壇:www.armsky.net/bbs
*********************************************************************************************/
#include "reg52.h" // 包含頭文件
/* 與編譯器無關的數據類型定義 */
/********************************************************************************************/
typedef unsigned char uint8; // 無符號8位整型變量
typedef signed char int8; // 有符號8位整型變量
typedef unsigned short uint16; // 無符號16位整型變量
typedef signed short int16; // 有符號16位整型變量
typedef unsigned int uint32; // 無符號32位整型變量
typedef signed int int32; // 有符號32位整型變量
typedef float fp32; // 單精度浮點數(32位長度)
typedef double fp64; // 雙精度浮點數(64位長度)
/********************************************************************************************/
sbit P1_7 = P1 ^ 7; // 定義位變量
/********************************************************************************************
* 函數名稱:Timer2_Server()
* 功 能:定時器2溢出中斷。
* 入口參數:無
* 出口參數:無
* 注 意:在本函數中設置了一個靜態變量Timer2_Server_Count,靜態變量的值在進入函數時是不會被
* 初始化的,而是保持上次的值。它用來計數T2定時器的溢出次數(進入本函數的次數),每
* 溢出16次,就控制一次LED11反轉顯示。這時的時間正好是1秒,而且是精確的1秒!只與晶振
* 的精度有關。
*********************************************************************************************/
void Timer2_Server(void) interrupt 5
{
static uint8 Timer2_Server_Count; // 定義靜態變量,用來計數T2定時器的溢出次數(進入本函數的次數)
TF2=0; // T2定時器發生溢出中斷時,需要用戶自己清除溢出標記,而51的其他定時器是自動清除的?
Timer2_Server_Count++;
if(Timer2_Server_Count==16) // T2定時器的預裝載值為0x0BDC,溢出16次就是1秒鐘。
{
Timer2_Server_Count=0;
P1_7=~P1_7; // LED11反轉顯示。
}
}
/********************************************************************************************
* 函數名稱:main()
* 功 能:使用T2定時器實現1秒精確定時并使LED11閃燈,即LED11亮1秒,滅1秒,亮1秒,滅1秒......
* 注 意:
* 1、要精確定時,必須使用定時器的自動裝載方式。本實驗使用T2定時器,讓它工作在16bit自動
* 裝載方式,這時,有另一個位置專門裝著16位預裝載值,當T2溢出時,預裝載值立即被裝入,
* 這就保證了精確定時。
* 2、T2定時器是一個16位定時器,最長的溢出時間也就幾十毫秒,要定時1秒,就需要用一個變量
* 來保存溢出的次數,積累到了一定的次數后,才執行一次操作。這樣就可以累加到1秒或者更
* 長的時間才做一次操作。
* 3、當T2定時器發生溢出中斷時,需要用戶自己清除溢出標記,而51的其他定時器是自動清除的。
* 4、T2定時器預裝載值的計算:
* 設晶振為12MHz,每秒鐘可以執行1000000(12000000/12)個機器周期。而T2每次溢出時最多
* 經過了65536個機器周期。我們應該盡量讓T2定時器的溢出中斷的次數最少,這樣對主程序的干擾
* 也就最小。
* 選擇每秒中斷14次,每次溢出1000000/14=71428.57個機器周期,不為整數且超出65536個機器周期,無效。
* 選擇每秒中斷16次,每次溢出1000000/16=62500個機器周期,小于65536個機器周期,有效。
* 選擇每秒中斷20次,每次溢出1000000/20=50000個機器周期,小于65536個機器周期,有效。
* .
* .
* .
* 通過上面的計算,我們可以發現,我們可以選擇的方式有很多,但是最佳的是每秒中斷16次,每次
* 溢出62500個機器周期,那么賦給T2定時器的初值應為65536-62500=3036,轉換成十六進制值為
* 0x0BDC。
*********************************************************************************************/
void main (void)
{
P1_7=1; // LED11滅
/* T2定時器賦預裝載值,溢出16次就是1秒。 */
RCAP2H=0x0B;
RCAP2L=0xDC;
ET2=1; // 允許T2定時器中斷
EA=1; // 打開總中斷
TR2=1; // 啟動T2定時器
while(1); // 死循環,等待T2定時器的溢出中斷
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -