定時器程序應(yīng)用
了解了定時器相關(guān)的寄存器,那么我們下面就來做一個定時器的程序,鞏固一下我們學到的內(nèi)容。我們這節(jié)課的程序先使用定時器0,在使用定時器的時候,需要以下幾個步驟:
第一步:設(shè)置特殊功能寄存器TMOD,配置好工作模式;
第二步:設(shè)置計數(shù)寄存器TH0和TL0的初值;
第三步:設(shè)置TCON,通過打開TR0位來讓定時器開始計數(shù)。
第四步:判斷TCON寄存器的TF0位,監(jiān)測定時器溢出情況。
寫程序之前,我們要先來學會計算如何用定時器定時時間。我們的晶振是11.0592M,時鐘周期就是1/11059200,機器周期就是12/11059200,我們假如要定時20ms,就是0.02秒,要經(jīng)過x個機器周期得到0.02秒,我們來算一下x*12/11059200=0.02,得到x= 18432。那么我們現(xiàn)在16位的定時器溢出值是65536,我們可以這樣,先給TH0和TL0一個初值,讓他們經(jīng)過18432個機器周期后剛好溢出,溢出后我們可以通過檢測TF0位得知,就剛好是0.02秒。這個初值y = 65536 - 18432 = 47104,轉(zhuǎn)成16進制就是0xB800,那么就是TH0 = 0xB8,TL0 = 0x00。
那0.02秒我們已經(jīng)定時出來了,細心的同學會發(fā)現(xiàn),我們?nèi)绻踔抵苯咏o一個0x0000,一直到65536溢出,定時器定時值最大也就是71ms左右,那么我們想定時更長時間怎么辦呢?用你小學學過的邏輯,倍數(shù)關(guān)系就可以解決此問題。
那好了,我們下面就用程序來實現(xiàn)以下這個功能。
#include
//包含寄存器的庫文件 sbit LED = P0^0;
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
void main()
{
unsigned char counter = 0;
ENLED = 0; ADDR0 = 0; ADDR1 = 1;
ADDR2 = 1; ADDR3 = 1; LED = 1; //74HC138和LED燈初始化部分
TMOD = 0x01; //設(shè)置定時器0為模式1
TH0 = 0xB8;
TL0 = 0x00; //定時值初值
TR0 = 1; //打開定時器0
while(1)
{
if(1 == TF0) //判斷定時器0是否溢出
{
TF0 = 0;
TH0 = 0xB8; //一旦溢出后,重新賦值
TL0 = 0x00;
counter++;
if(50 == counter) //判斷定時器0溢出是否達到50次
{
counter = 0; //counter清0,重新計數(shù)
LED = !LED; //LED取反操作,0-->1,1-->0
}
}
}
}
程序都有注釋,不難理解,這里要解釋一個地方,就是兩次if判斷,細心的同學會發(fā)現(xiàn),if(1 == TF0)這句,我把1寫前邊,這個地方我推薦新手按照我這樣來寫,因為如果我們寫if(TF0 == 1),作為新手來說,不小心丟掉一個’=’號后,寫成if(TF0 = 1),這樣實際上在語法上是可以通過的,我們用的Keil4還會出一個警告說明一下,Keil以前的版本以及一些其他軟件,可能根本不會出任何錯誤或者警告提示,但是這樣產(chǎn)生的Hex文件下載到單片機里邊,程序就錯了,大家可以改改試試看。
本程序?qū)崿F(xiàn)的結(jié)果是我們板子上最右邊的小燈點亮持續(xù)一秒,熄滅持續(xù)一秒,也就是以0.5HZ的頻率進行閃爍。
編輯:admin 最后修改時間:2018-05-08