51-單片機-第四話-Timer

一.寫在前面
stc89c51有兩個定時/計數(shù)器,今天主要測試它的定時功能。使用定時器來進行時間計算要比使用循環(huán)來的更精準一些。
這里我使用的晶振為12MHz,至于為什么使用12MHz的晶振,原因是stc89c51的機器周期是12個時鐘周期,選用12MHz晶振后單片機執(zhí)行一個機器周期的時間剛好是1us。而定時器的工作原理就是每過一個機器周期就自動加一直到溢出。
stc89c51的定時器為16位,下圖給出的是定時/計數(shù)器相關(guān)的寄存器TCON


此寄存器可以按位尋址,就是說你可以這樣賦值TR1 = 1(開啟定時器1);對于那些不能按位尋址的寄存器比如TMOD就不能這樣賦值了。
TF1:定時器/計數(shù)器T1溢出標志。T1被允許計數(shù)以后,從初值開始加1計數(shù)。當最高位產(chǎn)生溢出時由硬件置‘1’TF1,向CPU發(fā)送中斷請求,一直保持到CPU響應(yīng)中斷時,由硬件自動清零,當不執(zhí)行中斷時,也可以通過查詢的方式對TF1標志位進行軟件清零
TR1:定時器T1的運行控制位。由軟件置位和清零。當GATE(TMOD.7)=0,TR1=1時就運行T1開始計數(shù),TR1=0時禁止T1計數(shù)。當GATE(TMOD.7)=1,TR1=1且INTI外部輸入高電平時,才允許T1計數(shù)
TF0:同TF1擁有兩種清零方式。
本次測試只使用TCON的高四位,低四位為中斷使用,下一次在測試。
還有一個寄存器TMOD需要使用


對于TMOD的模式選擇
?模式 1(M1=0,M0=1),是THn和TLn組成了一個16位的定時器,計數(shù)范圍是0~65535,溢出后,只要不對THn和TLn重新賦值,則從0開始計數(shù)。(最常用的一種定時模式)
?模式 2 (M1=1,M0=0),是8位自動重裝載模式,只有TLn做加1計數(shù),計數(shù)范圍0~255,THn的值并不發(fā)生變化,而是保持原值,TLn溢出后,TFn就直接置1了,并且THn原先的值直接賦給TLn,然后TLn從新賦值的這個數(shù)字開始計數(shù)。 (常用于串口通信)


二.具體使用方法
本次在P0^0口接上一個LED燈希望LED燈能夠1s亮,1s滅。

說明:由于定時器是16位的所以當計數(shù)到65536時就會溢出,單片機會置TF0 = 1作為溢出標志。
因為我們希望一次溢出為50ms所以要對它設(shè)置初始值即(65536 - 50000)
為該十六位寄存器的初始值,
但是我們不能直接對該十六位寄存器賦值,只能通過高位TH0和低位TL0進行賦值
此時就會有初始值的求模運算結(jié)果賦值給TH0;求余運算結(jié)果賦值給TL0。
