51單片機的定時/計數(shù)器是一種可編程部件。它的工作方式、計數(shù)初值以及啟停操作均應在定時/計數(shù)器工作前進行初始化,即向相應的寄存器寫入相應的控制字。
標準的51單片機內(nèi)部有T0和T1兩個定時器,與這兩個定時器有關(guān)的特殊功能寄存器主要由定時值存儲寄存器、定時器控制寄存器和定時器模式寄存器。
在使用定時器的時候,需要完成對定時器配置,配置步驟如下:
第一:設置特殊功能寄存器TMOD,配置好工作模式。
第二:設置計數(shù)寄存器TH0和TL0的初值。
第三:設置TCON,通過TRX置1來讓定時器開始計數(shù)。
第四:判斷TCON寄存器的TFX位,監(jiān)測定時器溢出情況
這里TRX和TFX中的X指的是0或者1。
下面程序使用定時器0,工作模式1,實現(xiàn)20ms的定時功能,控制單片機的P1.0輸出周期為40ms的方波信號。
1.首先設置特殊功能寄存器TMOD,配置定時器0工作在模式1。TMOD寄存器的各位如下表所示,根據(jù)要求,采用定時器0,而高四位是定時器1的控制位,所以TMOD的高四位置0,TMOD的低四位為定時0的控制位。根據(jù)要求定時器0工作在定時器模式,所以C/T(T0)位因該是置0,表示工作在定時模式。本定時器啟動不受到單片機引腳INT0外部信號的控制,所以GATA(T0)為清零即可。要求定時器0工作在模式1,則M1(T0)位置0,M0(T0)位置1即可。因此通過以上分析,可知TMOD的各位如下TMOD=0B00000001即,TMOD=0X01.
2.設置計數(shù)寄存器TH0和TL0的初值,根據(jù)定時時間20ms,確定TH0和TL0的初值。單片機的晶振為11.0592M,時鐘周期就是1/11059200,機器周期是12/11059200 秒,定時間20ms,就是要經(jīng)過X個機器周期得到0.02秒,即X* 12/11059200=0.02,得到X=18432.16位定時器的溢出值是65536(因65535加1才是溢出),這樣先給TH0和TL0一個初始值,讓它們經(jīng)過18432個機器周期后剛好達到65536溢出,溢出之后TF0置1,通過TF0就可以得知0.02秒時間到。那么初值y=65536-18432=47104,轉(zhuǎn)換為十六進制就是0XB800;即TH0=0XB8;TL0=0X00;
3.設置TCON,通過TR0置1來讓定時器開始計數(shù),即通過TR0=1啟動定時器。
?
4.判斷TCON寄存器的TF0位,監(jiān)測定時器溢出情況,TF0為1則定時器溢出,定時時間到,就可以做相應的處理,比如改變P10引腳電平狀態(tài)實現(xiàn)40ms方波信號。
將上述定時器初始化設置的流程,封裝成一個函數(shù)如下:
void timer0_init()
{
???? TMOD=0X01;
???? TH0=0XB8;
???? TL0=0X00;
???? TR0=1;
?
}
然后在主函數(shù)調(diào)用timer0_init()函數(shù)實現(xiàn)對定時器的初始化。并在主函數(shù)中查詢定時器是否溢出,溢出說明定時間到,進行響應的處理,main函數(shù)如下
void?? main()?????????????? ??? ???? //主函數(shù)
{
?? ? timer0_init();//調(diào)用定時器初始化函數(shù)
? ? while(1)
?? ? {
?? ??? ? if(1==TF0)//判斷定時器是否溢出
?? ??? ? {
?? ?????? TH0=0XB8;//
?? ?????? TL0=0X00;//對于定時器0工作1需要溢出之后,重新裝入初始值
?? ?????? P10=~P10;//P10電平狀態(tài)反轉(zhuǎn),實現(xiàn)高低電平切換
?? ??? ? }
?? ?
?? ? }
?}
?
仿真結(jié)果如圖所示,一個格子是10ms,一個方波周期是4個格子,正好是40ms。
這是一個定時器最簡單的一個例子,通過這個例子掌握定時器的使用方法,稍加修改就可以實現(xiàn)一些功能,比如:賽事活動中使用的秒表、智能定時斷電插座、通過對單片機端口引腳上輸入的由外部事件產(chǎn)生的“觸發(fā)脈沖信號”進行計數(shù),從而根據(jù)計數(shù)結(jié)果實現(xiàn)相應的功能控制,比如頻率計等。
審核編輯:劉清
評論