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