定時器之計數器應用
定時器的定時器應用估計大家都略有耳聞,而且都會用。那計數器功能瞭解?說實話,這個功能確實是使用場景少,用途少。但存在即合理,公司設計就會有用途。學習這件事情,不能以用處不大為由而去忽略不看。下面來看看定時器之計數器應用。
概述
計數器是對外來脈衝訊號計數,對來自於外部引腳P3.4(T0),P3.5(T1),P1.1(T2)的外部訊號計數。在設定計數器工作狀態時,每當外部輸入的脈衝發生負跳變(原來正常狀態下是高電平,沒有事件發生,當高電平變為低電平時,即發生負跳變),計數器加1,知道加滿溢位,向cpu申請中斷,以此重複。
計數器
原理
在講解原理之前,先來看幾個概念。方便看懂原理。
機器週期在計算機中,為了便於管理,常把一條指令的執行過程劃分為若干個階段,每一階段完成一項工作。例如,取指令、儲存器讀、儲存器寫等,這每一項工作稱為一個基本操作。完成一個基本操作所需要的時間稱為機器週期。它一般由12個時鐘週期(振盪週期)組成,也是由6個狀態週期組成。而振盪週期=1秒/晶振頻率,因此微控制器的機器週期=12秒/晶振頻率 。
時鐘週期又稱振盪週期,是處理操作的最基本單位。(晶振頻率的倒數)
節拍與狀態把振盪脈衝的週期定義為節拍(用p表示)。振盪脈衝經過二分頻後定義為狀態。一個狀態就包含兩個節拍。

機器週期
如圖所示,一個機器週期包含6個狀態週期,一個狀態週期又分為2個節拍。文字說明和圖片解釋很好理解。下面來開始說正事:
當定時器設定為計數器時,外部引腳輸入脈衝。但輸入訊號產生從1到0的負跳變。計數器加1.每個機器週期的S5P2期間,對外部輸入引腳進行取樣。如在第一個機器週期中採得的值為1,在下個週期採的值為0.則在在再下個機器週期的S3P1期間,計數器加1.由於這個設定,外部輸入訊號頻率有限制,最高為振盪器頻率的1/24。(頻率:單位時間內完成周期性變化的次數)可以這樣理解,確定一次輸入訊號需要兩個機器週期。所以輸入訊號的高低電平變化時間要大於兩個機器週期。舉個例子,外部訊號電平低-高-低變化,在進入低電平狀態至再次進入低電平狀態的時間需要大於兩個機器週期。不然會檢測出錯。還有就是,為了電平在變化之前能檢測到,需要電平狀態至少保持一個機器週期。
機器週期
內部結構

計時器邏輯圖
圖片沒什麼好說的,和定時器一樣。只是C/T位變化而已。
附暫存器資料手冊
暫存器TCON

暫存器TCON
TF1:定時器 1 溢位標誌。當定時器/計數器 1 溢位時,由 硬體置位;當主機響應中斷,
轉向中斷服務程式時,由硬體清零。
TR1:定時器 1 執行控制位, 由軟體置位/ 復位來開啟或關閉定時器/計數器 1。
TF0:定時器 0 溢位標誌。當定時器/計數器 0 溢位時,由 硬體置位;當主機響應中斷,
轉向中斷服務程式時,由硬體清零。
TR0:定時器 0 執行控制位,由 軟體置位/ 復位來開啟或關閉定時器/計數器 0。
IE1:外部中斷 1 跳變中斷請求標誌,當檢測到 INT1 發生 1 到 0 的跳變時,由硬體置位;當主機響應中斷, 轉向中斷服務程式時,由硬體清零。
IT1:外部中斷 1 觸發方式控制位,由 軟體置位或清零來選擇外部中斷 1 的跳變/電平觸發中斷請求。IT1=0 時,外部中斷 1 為電平觸發方式,當 INT1 輸入低電平時,置位 IE1。
採用電平觸發方式時,外部中斷源必須保持低電平有效,直到該中斷被 CPU 響應,同時在該中斷服務程式執行完之前,外部中斷源必須被清除,否則將產生另一次中斷。IT1=1 時,外部中斷 1 為邊沿觸發方式,在對 INT1 的相鄰兩次取樣中,如果一個週期中為高電平,接下來的週期為低電平,則置位 IE1,表示外部中斷 1 正在向 CPU 申請中斷。直到該中斷被CPU 響應時,才被 硬體清零。
IE0:外部中斷 0 跳變中斷請求標誌,當檢測到 INT1 發生 1 到 0 的跳變時,由硬體置位;當主機響應中斷, 轉向中斷服務程式時,由硬體清零。
IT0:外部中斷 0 觸發方式控制位,應用同 IT1。
暫存器TMOD

暫存器TMOD
GATE:門控制位,當 GATEx=1 時,控制暫存器 TCON 的 TRx=1(x=0 或 1)。當 GATEx=0 時,定時器啟動與停止僅受暫存器中的TRx來控制(x=0 或 1)。
C / :定時器、計數器方式選擇位,該位為 1 時為計數器,為 0 時為定時器。
M0:定時器/計數器工作模式選擇位。
M1:定時器/計數器工作模式選擇位。
注:高四位是T1定時器控制位,低四位是T0定時器控制位
工作方式如下圖所示
4種工作方式
應用
/*********************************************** 本程式用定時器0作脈衝源,週期為200us,頻率為5khz 用定時器1作計數器,每當經過20個脈衝,就取反X,輸 出一個新的頻率。 作用:瞭解計數器,懂得如何使用計數器 ************************************************/ #include<reg52.h> sbit X=P1^0;//T1計數器控制位 sbit Y=P1^7;//T0定時器脈衝源控制位 void initialize();//宣告初始化函式 main() //主函式 { initialize(); //呼叫初始化函式 while(1); } void initialize ()//初始化函式 { TMOD=0X62;//0110 0010定時器1計數器模式,工作方式2,定時器0定時器模式,工作方式2 TH1=236;//賦初值,計數20次中斷 TL1=236; TH0=0XA4;//賦初值,定時100us進中斷 TL0=0XA4; EA=1;//開啟總中斷 ET1=1;//開啟定時器1中斷 ET0=1;//開啟定時器0中斷 TR1=1;//啟動定時器1中斷 TR0=1;//啟動定時器0中斷 } void timer_T0() interrupt 1//定時器0中斷 { Y=~Y;//狀態取反 } void timer_T1() interrupt 3 { X=~X;//狀態取反 }

計數器應用
效果圖如上。程式註釋很清楚,這裡不細說了。
總結
計數器和定時器的使用大同小異,只是一個控制位的變化。文章講解清晰明瞭,順著文章細看必會弄懂,部分定義可能略有苦澀,但仔細一讀,並沒有多大難度。