定時器2的使用
前言
52微控制器比51微控制器不只是在容量上提升,還多一個定時器2。定時器 T2的功能比 T1、T0都強大,但描述它的資料不多, 可能是使用得比較少的緣故吧。但好用的東西怎樣放過,下面來盤盤定時器2。
概述
定時器 T2是一個 16 位的具有自動重灌和捕獲能力的定時 / 計數器,它的計數時鐘源可以是內部的機器週期,也可以是 P1.0 輸入的外部時鐘脈衝。它由兩個暫存器控制,他們是暫存器 T2CON,暫存器T2MOD。內部還有一個陷阱暫存器( RCAPXL,PXAPXH)與之相關。T2定時器有三種工作模式,分別是捕獲,自動重灌和波特率發生器。
暫存器介紹
定時器2控制暫存器T2CON
定時器2控制暫存器T2CON是定時器2的設定暫存器,用來設定與定時器2的一些相關操作。位元組地址位C8H,可位定址。

定時器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 控制位不起作用的,被強制工作於定時器溢位自動重灌載模式。
工作模式設定圖如下,x表示無效,無論高低電平。
工作模式設定
定時器2控制暫存器T2MOD
定時器2控制暫存器T2MOD用來設定定時器2自動重轉模式遞增或遞減模式,位元組地址為C9H, 不可位定址,且可能在標頭檔案沒有定義,需要自行定義。 --表示保留未使用。

定時器2控制暫存器T2MOD
T2OE:T2 輸出允許位,當 T2OE=1 的時候,允許時鐘輸出到 P1.0。(僅對
80C54/80C58 有效)
DCEN:向下計數允許位。 DCEN=1 是允許 T2 向下計數,否則向上計數。
自動重灌模式
這個工作模式與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)//[email protected] { SCON = 0x50;// 0000 0101序列口方式一 TL2 = 0xE8;//設定定時初值 TH2= 0xFF;//設定定時初值 TH2=RCAP2H;//賦值陷阱暫存器 TL2=RCAP2L; T2CON=0X34;//0011 0100波特率發生器模式 //TH2溢位不產生中斷,不用設定中斷 }
貼出波特率發生器模式初始化程式碼,需要什麼功能自行新增。
結束語
定時器2的講解結束,確實使用比定時器0,1稍微困難,但它功能強大,能解決很多問題。在定時器不夠用的情況下,定時器2不失為一個好的備用方案。