1. 程式人生 > >51微控制器定時器總結

51微控制器定時器總結

1.定時器TMOD暫存器

C/T這一位用來控制定時器工作方式。本來T上面有一橫表示低電平有效。c為計數,也即是及外部脈衝的個數,也會是定時器溢位及中斷。GATE這一位用來設定外部中斷脈衝是否可啟動定時器。 意思就是當GATE=1時,定時器的啟動有二個位控制,即TR0和int0(這是對定時器0來說的,T1的話上二位就是1)。定時器只有在上二位都是一的情況下才會啟動。我們就可以利用這個功能來測量脈衝的寬度。

我們知道在其他微控制器中我們測脈衝寬度可以利用外部中斷在上升沿河下降沿各讀取一次定時器值來測定。但51微控制器沒有上升沿中斷,也就沒有辦法測出高電平寬度。現在我們可以這樣做,令TR0=1,GATE=1,這時定時器的啟動只有INT0控制。當INT0為高電平時定時器啟動,為低電平時定時器關閉。我們設定下降沿中斷,在中斷中就可以讀取高電平所佔的時間了。但是這樣做只能得到高電平時間按。要想得到脈衝週期,可以再開一個定時器,另外一個就正常工作,這樣就可以得到脈衝週期。也就可以求出脈衝寬度了。 

T0的工作方式3相信很少人記得,我還沒有用過,但是我感覺做起碼在我們需要用到的時候,還知道有這個功能。方式3可以把T0當作二個獨立的計數器使用。在高階應用中肯定會有用吧。

定時器會存在誤差,原因是在執行定時器中斷的時候,會佔用3到8個機器週期不等。這段時間我們並沒有算到計數器初值裡面。要想消除誤差:1.可以把定時器低八位設為0,中斷中只要給TH0賦值,因為此時定時器已經開始啟動了,低八位其實已經不是0了。2.將低四位設為0.賦初值時,利用ORL TL1,#        ;加上你設定的初值。還有其他方法。

還有一點T0和T1的工作方式2看似工作方式是一樣的,其實T1在方式2的時候不能中斷,而T0是可以中斷的。