定時器/計數(shù)器的應(yīng)用實例
在實時系統(tǒng)中,定時通常使用定時器,這與軟件循環(huán)的定時完全不同。雖然兩者都是依賴系統(tǒng)時鐘,但是在定時器計數(shù)時,其它指令可以繼續(xù)進行,但軟件定時時不允許其它任何事件發(fā)生。
對許多連續(xù)計數(shù)和持續(xù)時間操作,最好使用16位定時/計數(shù)器。當(dāng)計數(shù)器翻轉(zhuǎn)后,它會繼續(xù)計數(shù)。若在計數(shù)開始或定時時間間隔開始讀出計數(shù)器的值,在計數(shù)或時間間隔結(jié)束時從讀出值中減去開始時的讀出值,則所得計數(shù)數(shù)值為其間的計數(shù)或持續(xù)的時間間隔。假設(shè)定時器用于V-F(電壓到頻率)轉(zhuǎn)換器信號的周期測量。若當(dāng)邏輯1到來時計數(shù)值為3754,下一個邏輯1到達時是4586,則V-F轉(zhuǎn)換器的周期是832個機器周期。使用12MHz晶振為832μs(1.202kHz),使用11.0592MHz晶振,計數(shù)值近似903μs(1.071kHz)。當(dāng)計數(shù)值有翻轉(zhuǎn)時,只要計數(shù)值以16位無符號整數(shù)對待就無算術(shù)問題。
例1 設(shè)單片機的fosc=12MHz,要求在P1.0腳上輸出周期為2ms的方波。
解 周期為2ms的方波要求定時間隔1ms,每次時間到P1.0取反。
定時器計數(shù)率=fosc/12。機器周期=12/fosc=1μs
每個機器周期定時器加1,1ms=1000μs
需計數(shù)次數(shù)=1000/(12/fosc)=1000/1=1000
由于計數(shù)器向上計數(shù),所以為得到1000個計數(shù)之后的定時器溢出,必須給定時器置初值-1000。
(1)用定時器0的方式1編程,采用查詢方式,程序名為time32.c
程序代碼如下:
#i nclude
sbit P1_0 = P1^0;
void main(void)
{
TMOD = 0x01; // 定時器0方式1
TR0 = 1; // 啟動T/C0
for(;;)
{
TH0 = -(1000/256); // 裝載計數(shù)初值
TL0 = -(1000%256);
do {} while(!TF0); // 查詢等待TF0置位
P1_0 = !P1_0; // 定時時間到,P1.0反相
TF0 = 0; // 軟件清TF0
}
}
上面的程序,羅畝已經(jīng)在Keil uVision中測試成功,但在拷貝時可能因Html代碼原因而加入其它字符,所以在拷貝上面的程序時,要注意檢查在編輯器中的情況。
擴展閱讀:單片機計數(shù)器與定時器
編輯:admin 最后修改時間:2018-05-18