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