51單片機(jī)是基礎(chǔ)入門的一個(gè)單片機(jī),還是應(yīng)用最廣泛的一種。本文主要介紹51單片機(jī)定時(shí)/計(jì)數(shù)器,首先介紹了51單片機(jī)定時(shí)/計(jì)數(shù)器的工作原理,其次介紹了51單片機(jī)定時(shí)/計(jì)數(shù)器的工作模式,最后闡述了51單片機(jī)定時(shí)/計(jì)數(shù)器的應(yīng)用,具體的跟隨小編一起來了解一下吧。
51單片機(jī)的定時(shí)/計(jì)數(shù)器的概念
單片機(jī)中,脈沖計(jì)數(shù)與時(shí)間之間的關(guān)系十分密切,每輸入一個(gè)脈沖,計(jì)數(shù)器的值就會(huì)自動(dòng)累加1,只要相鄰兩個(gè)計(jì)數(shù)脈沖之間的時(shí)間間隔相等,則計(jì)數(shù)值就代表了時(shí)間的流逝,因此,單片機(jī)中的定時(shí)器和計(jì)數(shù)器其實(shí)是同一個(gè)物理的電子元件,只不過計(jì)數(shù)器記錄的是單片機(jī)外部發(fā)生的事情(接受的是外部脈沖),而定時(shí)器則是由單片機(jī)自身提供的一個(gè)非常穩(wěn)定的計(jì)數(shù)器,這個(gè)穩(wěn)定的計(jì)數(shù)器就是單片機(jī)上連接的晶振部件;MCS-51單片機(jī)的晶振經(jīng)過12分頻之后提供給單片機(jī)穩(wěn)定脈沖;晶振的頻率是非常準(zhǔn)確的,所以單片機(jī)的計(jì)數(shù)脈沖之間的時(shí)間間隔也是非常準(zhǔn)確的。
51單片機(jī)的定時(shí)/計(jì)數(shù)器的工作原理
加1計(jì)數(shù)器輸入的計(jì)數(shù)脈沖有兩個(gè)來源,一個(gè)是由系統(tǒng)的時(shí)鐘振蕩器輸出脈沖經(jīng)12分頻后送來;一個(gè)是T0或T1引腳輸入的外部脈沖源。
作為定時(shí)器使用時(shí),定時(shí)器計(jì)數(shù)8051單片機(jī)片內(nèi)振蕩器輸出經(jīng)過12分頻后的脈沖個(gè)數(shù),即:每個(gè)機(jī)器周期使定時(shí)器T0/T1的寄存器值自動(dòng)累加1,直到溢出,溢出后繼續(xù)從0開始循環(huán)計(jì)數(shù);所以,定時(shí)器的分辨率是時(shí)鐘振蕩頻率的1/12;
作為計(jì)數(shù)器使用時(shí),通過引腳T0(P3.4)或T1(P3.5)對(duì)外部脈沖信號(hào)進(jìn)行計(jì)數(shù),當(dāng)輸入的外部脈沖信號(hào)發(fā)生從1到0的負(fù)跳變時(shí),計(jì)數(shù)器的值就自動(dòng)加1由于檢測(cè)一個(gè)從1到0的下降沿需要2個(gè)機(jī)器周期,因此要求被采樣的電平至少要維持一個(gè)機(jī)器周期。當(dāng)晶振頻率為12MHz時(shí),最高計(jì)數(shù)頻率不超過1/2MHz,即計(jì)數(shù)脈沖的周期要大于2微秒。;計(jì)數(shù)器的最高頻率一般是時(shí)鐘振蕩頻率的1/24;
由此可知,不論是定時(shí)器還是計(jì)數(shù)器工作方式,定時(shí)器T0和T1均不占用CPU的時(shí)間,除非定時(shí)器/計(jì)數(shù)器T0和T1溢出,才可能引起CPU中斷,轉(zhuǎn)而去執(zhí)行中斷處理程序。所以說,定時(shí)器/計(jì)數(shù)器是單片機(jī)中效率高而工作靈活的部件。
51單片機(jī)定時(shí)器工作原理圖:
由上圖可見與定時(shí)器相關(guān)的寄存器主要有下面這幾個(gè):TMOD、 TCON、 TL0、TH0、TL1、TH1。下面介紹一下這幾個(gè)寄存器
16位加法計(jì)數(shù)器:
是定時(shí)計(jì)數(shù)器的核心,其中 TL0、TH0、是定時(shí)計(jì)數(shù)器0的底八位和高八位;TL1、TH1是定時(shí)計(jì)數(shù)器1的底八位和高八位;并且高八位和底八位可單獨(dú)使用。16位加法計(jì)數(shù)器主要是在設(shè)置定時(shí)計(jì)數(shù)器的初值時(shí)候使用
TMOD定時(shí)器工作模式及方式寄存器
GATE :定時(shí)操作開關(guān)控制位,當(dāng)GATE=1時(shí),INT0或INT1引腳為高電平,同時(shí)TCON中的TR0或TR1控制位為1時(shí),計(jì)時(shí)/計(jì)數(shù)器0或1才開始工作。若GATE=0,則只要將TR0或TR1控制位設(shè)為1,計(jì)時(shí)/計(jì)數(shù)器0或1就開始工作。
C/T :定時(shí)器或計(jì)數(shù)器功能的選擇位。C/T=1為計(jì)數(shù)器,通過外部引腳T0或T1輸入計(jì)數(shù)脈沖。C/T=0時(shí)為定時(shí)器,由內(nèi)部系統(tǒng)時(shí)鐘提供計(jì)時(shí)工作脈沖。
M1 M0:T0、T1工作模式選擇位
TCON定時(shí)器控制寄存器
TF1:定時(shí)器T1溢出標(biāo)志,可由程序查詢和清零,TF1也是中斷請(qǐng)求源,當(dāng)CPU響應(yīng)T1中斷時(shí)由硬件清零。
TF0:定時(shí)器T0溢出標(biāo)志,可由程序查詢和清零,TF0也是中斷請(qǐng)求源,當(dāng)CPU響應(yīng)T0中斷時(shí)由硬件清零。
TR1:T1充許計(jì)數(shù)控制位,為1時(shí)充許T1計(jì)數(shù)(定時(shí))。
TR0:T0充許計(jì)數(shù)控制位,為1時(shí)充許T0計(jì)數(shù)(定時(shí))。
IE1:外部中斷1請(qǐng)示源(INT1,P3.3)標(biāo)志。IE1=1,外部中斷1正在向CPU請(qǐng)求中斷,當(dāng)CPU響應(yīng)該中斷時(shí)由硬件清“0”。
IT1:外部中斷源1觸發(fā)方式控制位。此位為1設(shè)置為底電平觸發(fā),為0設(shè)置為下降沿觸發(fā)。
IE0:外部中斷0請(qǐng)示源(INT0,P3.2)標(biāo)志。IE0=1,外部中斷1正在向CPU請(qǐng)求中斷,當(dāng)CPU響應(yīng)該中斷時(shí)由硬件清“0”。
IT0:外部中斷源0觸發(fā)方式控制位。此位為1設(shè)置為底電平觸發(fā),為0設(shè)置為下降沿觸發(fā)。
51單片機(jī)定時(shí)器4種工作模式
工作模式0:
由TL0的低5位和TH0的全部8位共同構(gòu)成一個(gè)13位的定時(shí)器/計(jì)數(shù)器,定時(shí)器/計(jì)數(shù)器啟動(dòng)后,定時(shí)或計(jì)數(shù)脈沖個(gè)數(shù)加到TL0上,從預(yù)先設(shè)置的初值(時(shí)間常數(shù))開始累加,不斷遞增1,當(dāng) TL0計(jì)滿后,向TH0進(jìn)位,直到13位寄存器計(jì)滿溢出,TH0溢出時(shí),置位TCON中的TF0標(biāo)志,向CPU發(fā)出中斷請(qǐng)求。并且定時(shí)器/計(jì)數(shù)器硬件會(huì)自動(dòng)地把13位的寄存器值清0,如果需要進(jìn)一步定時(shí)/計(jì)數(shù),需要使用相關(guān)指令重置時(shí)間常數(shù),并把定時(shí)器/計(jì)數(shù)器的中斷標(biāo)記TF0置0。
工作模式1:最常用的定時(shí)器工作模式
模式1與模式0幾乎完全相同,唯一的區(qū)別就是,模式1中的寄存器TH0和TL0共同構(gòu)成的是一個(gè)16位定時(shí)器/計(jì)數(shù)器來參與操作,因此比模式0中的定時(shí)/計(jì)數(shù)范圍更大
工作模式2: 工作方式2特別適合于用作較精確的脈沖信號(hào)發(fā)生器。
這種模式又稱為自動(dòng)再裝入預(yù)置數(shù)模式。有時(shí)候,我們的定時(shí)/計(jì)數(shù)操作是需要多次重復(fù)定時(shí)/計(jì)數(shù)的,如果溢出時(shí)不做任何處理,那么,在第二輪定時(shí)/計(jì)數(shù)時(shí)就是從0開始定時(shí)/計(jì)數(shù)了,而這并不是我們想要的。所以,要保證每次溢出之后,再重新開始定時(shí)/計(jì)數(shù)的操作是我們想要的,那就要把預(yù)置數(shù)(時(shí)間常數(shù))重新裝入某個(gè)地方,而重新裝入預(yù)置數(shù)的操作是硬件設(shè)備自動(dòng)完成的,不需要人工干預(yù),所以這種工作模式就叫自動(dòng)再裝入預(yù)置數(shù)方式。在工作模式2中,把自動(dòng)重裝入的預(yù)置數(shù)存放在定時(shí)器/計(jì)數(shù)器的寄存器的高8位中,也就是存放在TH0中,而只留下TL0參與定時(shí)/計(jì)數(shù)操作。
這個(gè)工作模式常用于波特率發(fā)生器(串口通訊),T1工作在串口模式2;用于這種方式時(shí),定時(shí)器就是為了提供一個(gè)時(shí)間基準(zhǔn);計(jì)數(shù)溢出之后,不需要做太多的事情,只做一件事就可以,就是重新裝入預(yù)置數(shù),再開始重新計(jì)數(shù),而且中間不需要任何延時(shí)。
工作模式3:
方式3只適用于定時(shí)/計(jì)數(shù)器T0,定時(shí)器T1處于方式3時(shí)相當(dāng)于TR1=0,停止計(jì)數(shù)由于定時(shí)器/計(jì)數(shù)器T1沒有工作模式3,如果把定時(shí)器/計(jì)數(shù)器T0設(shè)置為工作模式3,那么TL0和TH0將被分割成兩個(gè)相互獨(dú)立的8位定時(shí)器/計(jì)數(shù)器。
51單片機(jī)的定時(shí)/計(jì)數(shù)器的應(yīng)用
在protues下搭建仿真環(huán)境:
在這里介紹一下定時(shí)器初值的設(shè)定:
工作方式0:13位定時(shí)器/計(jì)數(shù)器工作模式,最多可計(jì)數(shù)2的13次方次,即:8192次
工作方式1:16位定時(shí)器/計(jì)數(shù)器工作模式,最多可計(jì)數(shù)2的16次方次,即:65536次
工作方式2:8位定時(shí)器/計(jì)數(shù)器工作模式,最多可計(jì)數(shù)2的8次方次,即:256次,
工作方式3:8位定時(shí)器/計(jì)數(shù)器工作模式,最多可計(jì)數(shù)2的8次方次,即:256次
以12M晶振為例:每秒鐘可以執(zhí)行1000000次機(jī)器周期個(gè)機(jī)器周期。而定時(shí)器每次溢出 最多65536 個(gè)機(jī)器周期。
那么對(duì)12MHz的晶振來講
1個(gè)機(jī)器周期 1us ( 12/fosc = 1us)
方式0 13位定時(shí)器最大時(shí)間間隔 = 2^13 = 8.192ms
方式1 16位定時(shí)器最大時(shí)間間隔 = 2^16 = 65.536ms
方式2 8位定時(shí)器最大時(shí)間間隔 = 2^8 = 0.256ms =256 us
方式3 8位定時(shí)器最大時(shí)間間隔 = 2^8 = 0.256ms =256 us
以上是對(duì)定時(shí)器定時(shí)的最大時(shí)間間隔做一個(gè)說明,下面具體說明怎么計(jì)算初值(小于最大時(shí)間間隔)假如定時(shí)10ms那么的定時(shí)器初值計(jì)算如下:
-當(dāng)使用12M晶振,12MHz除12為1MHz,也就是說一秒=1000000次機(jī)器周期。10ms=10000次 機(jī)器周期。
預(yù)置數(shù)的計(jì)算公式:預(yù)置數(shù)=最大值-需要計(jì)數(shù)的次數(shù);(65536-10000)
再將預(yù)置數(shù)裝入16位定時(shí)計(jì)數(shù)器,如下:
TH0=(65536-10000)/256
TL0=(65536-10000)%256
-當(dāng)使用11.0592M晶振,11.0592MHz除12為921600Hz,就是一秒921600次機(jī)器周期,10ms=9216次機(jī)器周期。
預(yù)置數(shù)的計(jì)算公式:預(yù)置數(shù)=最大值-需要計(jì)數(shù)的次數(shù);(65536-9216)
再將預(yù)置數(shù)裝入16位定時(shí)計(jì)數(shù)器,如下:
TH0=(65536-9216)/256
TL0=(65536-9216)%256
介紹完初值的確定,下面介紹定時(shí)器最常見的兩種用法
定時(shí):定時(shí)計(jì)數(shù)器作為定時(shí)器使用,配置步驟如下:
1.模式設(shè)置,配置TMOD寄存器
2.定時(shí)器初值設(shè)置 假設(shè)10ms中斷
3.開定時(shí)器中斷
4.開總中斷
5.打開定時(shí)器
通過以上5步就打開了一個(gè)定時(shí)器,定時(shí)器沒10毫秒發(fā)起一次中斷,即沒10毫秒進(jìn)入一次中斷服務(wù)程序
示例程序如下:
#include《reg51.h》
sbit led=P1^0;
unsigned int flag;
void main()
{
TMOD=0x01;//1.模式設(shè)置,00000001,采用的是定時(shí)器0,工作與式1(M1=0,M0=1)。
TH0=(65536-10000)/256; //2.定時(shí)器設(shè)置,每隔10毫秒發(fā)起一次中斷。
TL0=(65536-10000)%256;
ET0=1; //3.開定時(shí)器0中斷
EA = 1; //4.開總中斷
TR0=1; //5.打開定時(shí)器
while(1)
{
if(flag==100)
{
led=~led;
flag=0;
}
}
}
void TIM0() interrupt 1 //中斷服務(wù)程序
{
TH0=(65536-10000)/256; //進(jìn)入中斷要重新設(shè)置定時(shí)器處置,要注意。
TL0=(65536-10000)%256;
flag++;
}1234567891011121314151617181920212223242526272829
計(jì)數(shù):定時(shí)計(jì)數(shù)器作為計(jì)數(shù)器使用,配置步驟如下:
1.模式設(shè)置,配置TMOD寄存器。
2.開計(jì)數(shù)器中斷
3.開總中斷
4.打開計(jì)數(shù)器
通過這簡(jiǎn)單的四步,我們就打開了一個(gè)計(jì)數(shù)器,可以對(duì)P3.4或者P3.5進(jìn)行下降沿的脈沖計(jì)數(shù),這里有一點(diǎn)要注意就是計(jì)數(shù)器可以不開中斷,這樣溢出時(shí)只是不會(huì)進(jìn)去中斷服務(wù)程序。
示例程序如下:
#include《reg51.h》
sbit led=P1^0;
sbit s=P3^4;
unsigned int count;
void main()
{
TMOD=0x05; //1.模式設(shè)置,00000101,采用的是計(jì)數(shù)器0,工作模式1(M1=0,M0=1)。
TH0=0; //計(jì)數(shù)器清零
TL0=0;
ET0=1; //2.開計(jì)數(shù)器0中斷
EA=1; //3.開總中斷
TR0=1; //4.打開計(jì)數(shù)器
led=1;
while(1)
{
count=(TH0《《8)|TL0;
if((count*10000)==50000)//按5下按鍵led狀態(tài)取反
{
led=0;
TH0=0XFF;
TL0=0XFF; //人為的讓計(jì)數(shù)器進(jìn)入中斷
}
}
}
void TIM0() interrupt 1 //中斷服務(wù)程序
{
led=1;
TH0=0;
TL0=0;
}
-
51單片機(jī)
+關(guān)注
關(guān)注
273文章
5697瀏覽量
122991
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論