定時(shí)器的定時(shí)器應(yīng)用估計(jì)大家都略有耳聞,而且都會(huì)用。那計(jì)數(shù)器功能了解?說(shuō)實(shí)話,這個(gè)功能確實(shí)是使用場(chǎng)景少,用途少。但存在即合理,公司設(shè)計(jì)就會(huì)有用途。學(xué)習(xí)這件事情,不能以用處不大為由而去忽略不看。下面來(lái)看看定時(shí)器之計(jì)數(shù)器應(yīng)用。
概述
計(jì)數(shù)器是對(duì)外來(lái)脈沖信號(hào)計(jì)數(shù),對(duì)來(lái)自于外部引腳P3.4(T0),P3.5(T1),P1.1(T2)的外部信號(hào)計(jì)數(shù)。在設(shè)置計(jì)數(shù)器工作狀態(tài)時(shí),每當(dāng)外部輸入的脈沖發(fā)生負(fù)跳變(原來(lái)正常狀態(tài)下是高電平,沒(méi)有事件發(fā)生,當(dāng)高電平變?yōu)榈碗娖綍r(shí),即發(fā)生負(fù)跳變),計(jì)數(shù)器加1,知道加滿(mǎn)溢出,向cpu申請(qǐng)中斷,以此重復(fù)。原理
在講解原理之前,先來(lái)看幾個(gè)概念。方便看懂原理。
機(jī)器周期 在計(jì)算機(jī)中,為了便于管理,常把一條指令的執(zhí)行過(guò)程劃分為若干個(gè)階段,每一階段完成一項(xiàng)工作。例如,取指令、存儲(chǔ)器讀、存儲(chǔ)器寫(xiě)等,這每一項(xiàng)工作稱(chēng)為一個(gè)基本操作。完成一個(gè)基本操作所需要的時(shí)間稱(chēng)為機(jī)器周期。它一般由12個(gè)時(shí)鐘周期(振蕩周期)組成,也是由6個(gè)狀態(tài)周期組成。而振蕩周期=1秒/晶振頻率,因此單片機(jī)的機(jī)器周期=12秒/晶振頻率 。
時(shí)鐘周期 又稱(chēng)振蕩周期,是處理操作的最基本單位。(晶振頻率的倒數(shù))
節(jié)拍與狀態(tài) 把振蕩脈沖的周期定義為節(jié)拍(用p表示)。振蕩脈沖經(jīng)過(guò)二分頻后定義為狀態(tài)。一個(gè)狀態(tài)就包含兩個(gè)節(jié)拍。
如圖所示,一個(gè)機(jī)器周期包含6個(gè)狀態(tài)周期,一個(gè)狀態(tài)周期又分為2個(gè)節(jié)拍。文字說(shuō)明和圖片解釋很好理解。下面來(lái)開(kāi)始說(shuō)正事:
當(dāng)定時(shí)器設(shè)定為計(jì)數(shù)器時(shí),外部引腳輸入脈沖。但輸入信號(hào)產(chǎn)生從1到0的負(fù)跳變。計(jì)數(shù)器加1.每個(gè)機(jī)器周期的S5P2期間,對(duì)外部輸入引腳進(jìn)行采樣。如在第一個(gè)機(jī)器周期中采得的值為1,在下個(gè)周期采的值為0.則在在再下個(gè)機(jī)器周期的S3P1期間,計(jì)數(shù)器加1.由于這個(gè)設(shè)定,外部輸入信號(hào)頻率有限制,最高為振蕩器頻率的1/24。(頻率:?jiǎn)挝粫r(shí)間內(nèi)完成周期性變化的次數(shù))可以這樣理解,確定一次輸入信號(hào)需要兩個(gè)機(jī)器周期。所以輸入信號(hào)的高低電平變化時(shí)間要大于兩個(gè)機(jī)器周期。舉個(gè)例子,外部信號(hào)電平低-高-低變化,在進(jìn)入低電平狀態(tài)至再次進(jìn)入低電平狀態(tài)的時(shí)間需要大于兩個(gè)機(jī)器周期。不然會(huì)檢測(cè)出錯(cuò)。還有就是,為了電平在變化之前能檢測(cè)到,需要電平狀態(tài)至少保持一個(gè)機(jī)器周期。
內(nèi)部結(jié)構(gòu)
圖片沒(méi)什么好說(shuō)的,和定時(shí)器一樣。只是C/T位變化而已。
附寄存器數(shù)據(jù)手冊(cè)
寄存器TCON

TF1:定時(shí)器 1 溢出標(biāo)志。當(dāng)定時(shí)器/計(jì)數(shù)器 1 溢出時(shí),由 硬件置位;當(dāng)主機(jī)響應(yīng)中斷,
轉(zhuǎn)向中斷服務(wù)程序時(shí),由硬件清零。
TR1:定時(shí)器 1 運(yùn)行控制位, 由軟件置位/ 復(fù)位來(lái)開(kāi)啟或關(guān)閉定時(shí)器/計(jì)數(shù)器 1。
TF0:定時(shí)器 0 溢出標(biāo)志。當(dāng)定時(shí)器/計(jì)數(shù)器 0 溢出時(shí),由 硬件置位;當(dāng)主機(jī)響應(yīng)中斷,
轉(zhuǎn)向中斷服務(wù)程序時(shí),由硬件清零。
TR0:定時(shí)器 0 運(yùn)行控制位,由 軟件置位/ 復(fù)位來(lái)開(kāi)啟或關(guān)閉定時(shí)器/計(jì)數(shù)器 0。
IE1:外部中斷 1 跳變中斷請(qǐng)求標(biāo)志,當(dāng)檢測(cè)到 INT1 發(fā)生 1 到 0 的跳變時(shí),由硬件置位;當(dāng)主機(jī)響應(yīng)中斷, 轉(zhuǎn)向中斷服務(wù)程序時(shí),由硬件清零。
IT1:外部中斷 1 觸發(fā)方式控制位,由 軟件置位或清零來(lái)選擇外部中斷 1 的跳變/電平觸發(fā)中斷請(qǐng)求。IT1=0 時(shí),外部中斷 1 為電平觸發(fā)方式,當(dāng) INT1 輸入低電平時(shí),置位 IE1。
采用電平觸發(fā)方式時(shí),外部中斷源必須保持低電平有效,直到該中斷被 CPU 響應(yīng),同時(shí)在該中斷服務(wù)程序執(zhí)行完之前,外部中斷源必須被清除,否則將產(chǎn)生另一次中斷。IT1=1 時(shí),外部中斷 1 為邊沿觸發(fā)方式,在對(duì) INT1 的相鄰兩次采樣中,如果一個(gè)周期中為高電平,接下來(lái)的周期為低電平,則置位 IE1,表示外部中斷 1 正在向 CPU 申請(qǐng)中斷。直到該中斷被CPU 響應(yīng)時(shí),才被 硬件清零。
IE0:外部中斷 0 跳變中斷請(qǐng)求標(biāo)志,當(dāng)檢測(cè)到 INT1 發(fā)生 1 到 0 的跳變時(shí),由硬件置位;當(dāng)主機(jī)響應(yīng)中斷, 轉(zhuǎn)向中斷服務(wù)程序時(shí),由硬件清零。
IT0:外部中斷 0 觸發(fā)方式控制位,應(yīng)用同 IT1。
寄存器TMOD

GATE:門(mén)控制位,當(dāng) GATEx=1 時(shí),控制寄存器 TCON 的 TRx=1(x=0 或 1)。當(dāng) GATEx=0 時(shí),定時(shí)器啟動(dòng)與停止僅受寄存器中的TRx來(lái)控制(x=0 或 1)。
C / :定時(shí)器、計(jì)數(shù)器方式選擇位,該位為 1 時(shí)為計(jì)數(shù)器,為 0 時(shí)為定時(shí)器。
M0:定時(shí)器/計(jì)數(shù)器工作模式選擇位。
M1:定時(shí)器/計(jì)數(shù)器工作模式選擇位。
注:高四位是T1定時(shí)器控制位,低四位是T0定時(shí)器控制位
工作方式如下圖所示
應(yīng)用
/***********************************************
本程序用定時(shí)器0作脈沖源,周期為200us,頻率為5khz
用定時(shí)器1作計(jì)數(shù)器,每當(dāng)經(jīng)過(guò)20個(gè)脈沖,就取反X,輸
出一個(gè)新的頻率。
作用:了解計(jì)數(shù)器,懂得如何使用計(jì)數(shù)器
************************************************/
#include<reg52.h>
sbit X=P1^0; //T1計(jì)數(shù)器控制位
sbit Y=P1^7; //T0定時(shí)器脈沖源控制位
void initialize();//聲明初始化函數(shù)
main() //主函數(shù)
{
initialize(); //調(diào)用初始化函數(shù)
while(1);
}
void initialize () //初始化函數(shù)
{
TMOD=0X62; //0110 0010 定時(shí)器1計(jì)數(shù)器模式,工作方式2,定時(shí)器0定時(shí)器模式,工作方式2
TH1=236; //賦初值,計(jì)數(shù)20次中斷
TL1=236;
TH0=0XA4; //賦初值,定時(shí)100us進(jìn)中斷
TL0=0XA4;
EA=1; //打開(kāi)總中斷
ET1=1; //打開(kāi)定時(shí)器1中斷
ET0=1; //打開(kāi)定時(shí)器0中斷
TR1=1; //啟動(dòng)定時(shí)器1中斷
TR0=1; //啟動(dòng)定時(shí)器0中斷
}
void timer_T0() interrupt 1 //定時(shí)器0中斷
{
Y=~Y; //狀態(tài)取反
}
void timer_T1() interrupt 3
{
X=~X; //狀態(tài)取反
}
效果圖如上。程序注釋很清楚,這里不細(xì)說(shuō)了。
總結(jié)
計(jì)數(shù)器和定時(shí)器的使用大同小異,只是一個(gè)控制位的變化。文章講解清晰明了,順著文章細(xì)看必會(huì)弄懂,部分定義可能略有苦澀,但仔細(xì)一讀,并沒(méi)有多大難度。