52單片機比51單片機不僅是在容量上提高,還多一個定時器2。定時器 T2的功能比 T一、T0都強大,但描述它的資料很少, 多是使用得比較少的緣故吧。但好用的東西怎樣放過,下面來盤盤定時器2。編程
定時器 T2是一個 16 位的具備自動重裝和捕獲能力的定時 / 計數器,它的計數時鐘源能夠是內部的機器週期,也能夠是 P1.0 輸入的外部時鐘脈衝。它由兩個寄存器控制,他們是寄存器 T2CON,寄存器T2MOD。內部還有一個陷阱寄存器( RCAPXL,PXAPXH)與之相關。T2定時器有三種工做模式,分別是捕獲,自動重裝和波特率發生器。函數
定時器2控制寄存器T2CON是定時器2的設置寄存器,用來設定與定時器2的一些相關操做。字節地址位C8H,可位尋址。ui
定時器2控制寄存器T2CON
TF2:定時/ 計數器 2 溢出標誌,T2溢出時置位, 並申請中斷。 只能用軟件清除
但 T2 做爲波特率發生器使用的時候, ( 即 RCLK=1或 TCLK=1),T2溢出時不對 TF2置位。
EXF2:當 EXEN2=1時,且 T2EX引腳(P1.0)出現負跳變而形成 T2的捕獲或重裝
的時候, EXF2置位並申請中斷。 EXF2也是隻能經過軟件來清除的。
RCLK:串行接收時鐘標誌, 只能經過軟件的置位或清除; 用來選擇 T1(RCLK=0 )仍是 T2(RCLK=1 )來做爲串行接收的波特率產生器
TCLK:串行發送時鐘標誌, 只能經過軟件的置位或清除; 用來選擇 T1(TCLK=0 )
仍是 T2(TCLK=1 )來做爲串行發送的波特率產生器
EXEN2 :T2的外部容許標誌,只能經過軟件的置位或清除; EXEN2=0 :禁止外部
時鐘觸發 T2;EXEN2=1 :當 T2未用做串行波特率發生器時,容許外部時鐘觸發 T2,當 T2EX引腳輸入一個負跳變的時候,將引發 T2的捕獲或重裝,並置位 EXF2,申請中斷。
TR2:T2的啓動控制標誌; TR2=0:中止 T2;TR2=1:啓動 T2
C/T2:T2 的定時方式或計數方式選擇位。 只能經過軟件的置位或清除; C/T2=0 :
選擇 T2 爲定時器方式; C/T2=1 :選擇 T2 爲計數器方式, 降低沿觸發。
CP/RT2 :捕獲/重裝載標誌,只能經過軟件的置位或清除。 CP/RT2=0 時,選擇重裝載方式,這時若 T2 溢出( EXEN2=0 時)或者 T2EX 引腳(P1.0)出現負跳變(EXEN2=1 時),將會引發 T2 重裝載; CP/RT2=1 時,選擇捕獲方式,這時若 T2EX 引腳( P1.0)出現負跳變( EXEN2=1 時),將會引發 T2 捕獲操做。可是若是 RCLK=1 或 TCLK=1 時,CP/RT2 控制位不起做用的,被強制工做於定時器溢出自動重裝載模式。spa
工做模式設置圖以下,x表示無效,不管高低電平。code
工做模式設置blog
定時器2控制寄存器T2MOD用來設定定時器2自動重轉模式遞增或遞減模式,字節地址爲C9H, 不可位尋址,且可能在頭文件沒有定義,須要自行定義。--表示保留未使用。it
定時器2控制寄存器T2MOD
T2OE :T2 輸出容許位,當 T2OE=1 的時候,容許時鐘輸出到 P1.0。(僅對
80C54/80C58 有效)
DCEN:向下計數容許位。 DCEN=1 是容許 T2 向下計數,不然向上計數。class
這個工做模式與8位自動重裝同樣,只是定時器2是16位。還有功能更增強大。能夠是正常的遞增計數,也能夠是遞減計數。遞增遞減控制位位於寄存器T2MOD的DCEN位。下圖是自動重裝模式邏輯圖。變量
自動重裝模式
TH2,TL2構成16位加1計數器
RCAP2H,RCAP2L構成16位初值寄存器
T2EX引腳即P1.0引腳
當定時器 2 工做於 16 位自動重裝載方式時,能對其編程爲向上或向下計數方式, 這個功能可經過特殊功能寄存器 T2MOD的 DCEN 位(容許向下計數)來選擇的。復位時, DCEN 位置「 0」,定時器 2 默認設置爲向上計數。(遞增計數)當 DCEN置位時,定時器 2 既可向上計數也可向下計數,這取決於 T2EX (P1.1)引腳的值。當 DCEN=0 時,定時器 2 自動設置爲向上計數,在這種方式下, T2CON 中的 EXEN2 控制位有兩種選擇,若 EXEN2=0,定時器 2 爲向上計數至 0FFFFH (65535)溢出,置位 TF2 激活中斷,同時把 16 位計數寄存器 RCAP2H 和 RCAP2L重裝載, RCAP2H 和 RCAP2L 的值軟件預置。若 EXEN2=1,定時器 2 的 16 位重裝載由溢出或外部輸入端 T2EX 從 1 至0 的降低沿觸發。這個脈衝使 EXF2 置位,若是中斷容許,一樣產生中斷。
當 DCEN=1 時,容許定時器 2 向上或向下計數,這種方式下, T2EX 引腳控制計數器方向。 T2EX 引腳爲邏輯「 1」時,定時器向上計數,當計數 0FFFFH 向上溢出時,置位 TF2,同時把 16 位計數寄存器RCAP2H 和 RCAP2L重裝載到 TH2 和 TL2 中。 T2EX 引腳爲邏輯「 0」時,定時器 2 向下計數, 當 TH2 和 TL2 中的數值等於 RCAP2H 和RCAP2L中的值時,計數溢出,置位 TF2,同時將 0FFFFH 數值從新裝入定時寄存器中。
當定時 / 計數器 2 向上溢出或向下溢出時,置位 EXF2 位。原理
寄存器,原理都說完,只差實戰。
#include<reg52.h>
sbit led=P1^1; //位定義
sfr T2MOD=0XC9; //寄存器T2MOD定義
main()
{
//50微秒@11.0592MHz
T2MOD = 0; //---- --00 初始化模式寄存器 默認向上計數
T2CON = 0; //0000 0000 初始化控制寄存器 一箇中斷源,16位自動重裝模式
TL2 = 0x00; //設置定時初值
TH2 = 0x4C; //設置定時初值
RCAP2L = 0x00; //設置定時重載值
RCAP2H = 0x4C; //設置定時重載值
TR2 = 1; //定時器2開始計時
IE=0XA0; //1010 0000 打開全局中斷,定時器2中斷
while(1);
}
void timer_T2() interrupt 5 //中斷函數
{
static unsigned char count; //定義變量,記錄中斷次數
TF2=0; //軟件清零定時器2溢出標誌位
count++;
if(count==20) //時間爲1秒
{
count=0; //清零
led=~led; //狀態取反
}
}
本程序講解定時器2,16位自動重裝模式,只是簡單示範如何操做,更多其餘功能就不展現,但願能融會貫通,解鎖更多新技能。
介紹捕獲模式前,先看一下捕獲的意思。捕獲 ,就是捕捉某一瞬間的值。這個模式一般是用來測量外部某個脈衝的的寬度或週期。使用捕獲功能能夠很是準確測量出脈衝寬度或週期。
捕獲模式
在捕獲模式下,定時器計數,當與捕獲功能相關的引腳產生負跳變時(P1.1),捕獲會會當即將計數器寄存器中的數值準確的獲取,而且存入陷阱寄存器(RCAPXH,RCAPXL),同時向CPU申請中斷,方便軟件記錄。當該引腳產生下一次負跳變,便會產生另外一個捕獲,再次向CPU申請中斷,軟件記錄兩次數據,即可得出脈衝週期。
在捕獲方式下,經過 T2CON 控制位 EXEN2 來選擇兩種方式。若是EXEN2=0,定時器 2 是一個 16 位定時器或計數器, 計數溢出時, 對 T2CON 的溢出標誌 TF2 置位,同時激活中斷。若是 EXEN2=1,定時器 2 完成相同的操做,而當 T2EX(P1.1) 引腳外部輸入信號發生 1 至 0 負跳變時,也出現 TH2 和TL2 中的值分別被捕獲到 RCAP2H 和 RCAP2L 中。另外, T2EX 引腳信號的跳變使得 T2CON 中的 EXF2 置位,與 TF2 相仿, EXF2 也會激活中斷。
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar flag=0;
uint high,low,value; //定義變量高位,低位,輸出值
main()
{
uint temp_1,temp_2,result;
T2CON=0X09; // 0000 1001 設定捕獲模式
IE=0XA0; //1010 0000 打開總中斷,定時器2中斷
TR2=1; //啓動定時器2中斷
while(1)
{
if(flag==1)
{
temp_1=value; //記錄第一次值
}
if(flag==2)
{
temp_2=value; //記錄第二次直
TR2=0; //關閉定時器
flag=0;
}
result=temp_1+temp_2; //最終脈衝週期
}
}
void timer2_T2() interrupt 5
{
EXF2=0; //軟件置定時器外部標誌0
flag++;
high=RCAP2H; //讀取寄存器值
low=RCAP2L;
value=high*256+low; //轉化爲16位
RCAP2L=0x00; //清零
RCAP2H=0x00;
}
波特率發生器模式邏輯結構
當 T2CON 中的 TCLK 和 RCLK 置位時,定時 / 計數器 2 做爲 波特率發生器使用。若是定時 / 計數器 2 做爲發送器或接收器,其發送和接收的波特率能夠是不一樣的。
TCLK 置位,則定時器 2 工做於 波特率發生器 方式。波特率發生器的方式與自動重裝載方式相仿,在此方式下, TH2 翻轉使定時器 2 的寄存器用 RCAP2H 和 RCAP2L 中的 16 位數值從新裝載,該數值由軟件設置。
當定時器配置爲計數方式時,外部時鐘信號由T2引腳進入。在方式 1 和方式 3 中,波特率由定時器 2 的溢出速率根據下式肯定:
方式 1 和 3 的波特率 =定時器的溢出率 /16波特率
定時器既能工做於定時方式也能工做於計數方式,在大多數的應用中,是工做在定時方式( C/T2=0)。定時器 2 做爲波特率發生器時,與做爲定時器的操做是不一樣的,一般做爲定時器時,在每一個機器週期( 1/12 振盪頻率)寄存器的值加 1,而做爲波特率發生器使用時, 在每一個狀態時間 (1/2 振盪頻率)寄存器的值加 1。波特率的計算公式以下:
方式 1 和 3 的波特率 =振盪頻率 /{32*[65536-(RCP2H,RCP2L)]}波特率
式中(RCAP2H ,RCAP2L)是 RCAP2H和 RCAP2L中的 16 位無符號數。
T2CON 中的RCLK 或 TCLK=1 時,波特率工做方式纔有效。 在波特率發生器工做方式中,TH2 翻轉不能使 TF2 置位,故而不產生中斷。 但若 EXEN2 置位,且 T2EX 端產生由 1 至 0 的負跳變,則會使 EXF2 置位,此時並不能將 (RCAP2H,RCAP2L)的內容從新裝入 TH2 和 TL2 中。因此,當定時器 2 做爲波特率發生器使用時,T2EX 可做爲附加的外部中斷源來使用。
須要注意的是,當定時器 2 工做于波特率器時,做爲定時器運行( TR2=1)時,並不能訪問 TH2 和 TL2。由於此時每一個狀態 時間定時器 都會加 1,對其讀寫將獲得一個不肯定的數值。然而,對 RCAP2 則可讀而不可寫,由於寫入操做將是從新裝載,寫入操做可能令寫和 / 或重裝載出錯。在訪問定時器 2 或 RCAP2 寄存器以前,應將定時器關閉(清除 TR2)。
## 示例
void UartInit(void) //9600bps@11.0592MHz
{
SCON = 0x50; // 0000 0101 串行口方式一
TL2 = 0xE8; //設定定時初值
TH2= 0xFF; //設定定時初值
TH2=RCAP2H; //賦值陷阱寄存器
TL2=RCAP2L;
T2CON=0X34; //0011 0100 波特率發生器模式
//TH2溢出不產生中斷,不用設置中斷
}
貼出波特率發生器模式初始化代碼,須要什麼功能自行添加。
定時器2的講解結束,確實使用比定時器0,1稍微困難,但它功能強大,能解決不少問題。在定時器不夠用的狀況下,定時器2不失爲一個好的備用方案。