1. 程式人生 > >定時器之計數器應用

定時器之計數器應用

nbsp csdn 計數器 邏輯 平時 tex 周期 存在 type

定時器的定時器應用估計大家都略有耳聞,而且都會用。那計數器功能了解?說實話,這個功能確實是使用場景少,用途少。但存在即合理,公司設計就會有用途。學習這件事情,不能以用處不大為由而去忽略不看。下面來看看定時器之計數器應用。

概述

計數器是對外來脈沖信號計數,對來自於外部引腳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; //狀態取反
}

技術分享圖片計數器應用
效果圖如上。程序註釋很清楚,這裏不細說了。

總結

計數器和定時器的使用大同小異,只是一個控制位的變化。文章講解清晰明了,順著文章細看必會弄懂,部分定義可能略有苦澀,但仔細一讀,並沒有多大難度。

定時器之計數器應用