定時器/計(jì)數(shù)器的初始化值的計(jì)算與計(jì)數(shù)程序舉例
由于定時器/計(jì)數(shù)器的功能是由軟件編程確定的,所以一般在使用定時/計(jì)數(shù)器前都要對其進(jìn)行初始化,使其按設(shè)定的功能工作。初始貨的步驟一般如下:
1、確定工作方式(即對TMOD賦值);
2、預(yù)置定時或計(jì)數(shù)的初值(可直接將初值寫入TH0、TL0或TH1、TL1);
3、根據(jù)需要開放定時器/計(jì)數(shù)器的中斷(直接對IE位賦值);
4、啟動定時器/計(jì)數(shù)器(若已規(guī)定用軟件啟動,則可把TR0或TR1置“1”;若已規(guī)定由外中斷引腳電平啟動,則需給外引腳步加啟動電平。當(dāng)實(shí)現(xiàn)了啟動要求后,定時器即按規(guī)定的工作方式和初值開始計(jì)數(shù)或定時)。
下面介紹一下確定時時/計(jì)數(shù)器初值的具體方法。
因?yàn)樵诓煌ぷ鞣绞较掠?jì)數(shù)器位數(shù)不同,因而最大計(jì)數(shù)值也不同。
現(xiàn)假設(shè)最大計(jì)數(shù)值為M,那么各方式下的最大值M值如下:
方式0:M=213=8 192
方式1:M=216=65 536
方式2:M=28=256
方式3:定時器0分成兩個8位計(jì)數(shù)器,所以兩個M均為256。
因?yàn)槎〞r器/計(jì)數(shù)器是作“加1”計(jì)數(shù),并在計(jì)數(shù)滿溢出時產(chǎn)生中斷,因此初值X可以這樣計(jì)算:
X=M-計(jì)數(shù)值
下面舉例說明初值的確定方法。
例1、選擇T1方式0用于定時,在P1.1輸出周期為1ms方波,晶振fosc=6MHz。
解:根據(jù)題意,只要使P1.1每隔500us取反一次即可得到1ms的方波,因而T1的定時時間為500us,因定時時間不長,取方式0即可。則M1 M0=0;因是定時器方式,所以C/T=0;在此用軟件啟動T1,所以GATE=0。T0不用,方式字可任意設(shè)置,只要不使其進(jìn)入方式3即可,一般取0,故TMOD=00H。系統(tǒng)復(fù)位后TMOD為0,可不對TMOD重新清0。內(nèi)容來自單片機(jī)之家www.dpj100.com
下面計(jì)算500us定時T1初始值:
機(jī)器周期T=12/fosc=12/(6×106)Hz=2μs
設(shè)初值為X,則:
(1013-X)×2×10-6s=500×10-6s
X=7942D=1111100000110B=1F06H
因?yàn)樵谧?3位計(jì)數(shù)器用時,TL1的高3位未用,應(yīng)填寫0,TH1占用高8位,所以X的實(shí)際填寫應(yīng)為:
X=111100000000110B=F806H
結(jié)果:TH1=F8H,TL1=06H
源程序如下:
ORG2000H
MOVTL1,#06H;給TL1置初值
MOVTH1,#0F8H;給TH1置初值
SETBTR1;啟動T1
LP1:JBCTF1,LP2;查詢計(jì)數(shù)溢出否?
AJMPLP1
LP2:MOVTL1,#06H;重新設(shè)置計(jì)數(shù)初值
MOVTH1,#0F8H
CPLP1.1;輸出取反
AJMPLP1;重復(fù)循環(huán)