新聞中心

第9課 定時(shí)器

作者: 時(shí)間:2016-12-01 來(lái)源:網(wǎng)絡(luò) 收藏
3、定時(shí)器工作方式及賦初值
通過(guò)對(duì)上面TMOD寄存器的介紹,我們知道,通過(guò)設(shè)置M0M1可能選擇定時(shí)器的工作方式。這里可能有的人對(duì)選擇定時(shí)器工作方式及賦初值是什么意思不明白,其實(shí)也很好理解,前面我們不是把加1計(jì)數(shù)器比作裝水的水桶嗎,而51單片機(jī)有4種工作方式就相當(dāng)于有4種不同大小的裝水的水桶,所以我們必須通過(guò)TMOD這個(gè)寄存器選擇哪使用哪一個(gè)水桶(也就是選擇哪一種工作方式);至于為什么要賦初值前面我實(shí)際已經(jīng)有講到過(guò),計(jì)數(shù)器從全是裝0到全部裝1的整個(gè)時(shí)間是固定的,而我們實(shí)際用使用需要不同的定時(shí)間,所以我們必須先在計(jì)數(shù)器內(nèi)先裝一些數(shù),然后在這個(gè)基本上進(jìn)行加1計(jì)數(shù),就可以得到我們想要的定時(shí)時(shí)間。
定時(shí)器總共有四種工作方式,而因?yàn)槎〞r(shí)器工作方式1比較常用,所以這里僅對(duì)定時(shí)器0工作方式1進(jìn)行介紹,并介紹如何賦初值。
方式1的計(jì)數(shù)位數(shù)是16位,由TL0作為低8位、TH0作為高8位,組成了16位加1計(jì)數(shù)器 ,其邏輯結(jié)構(gòu)圖如圖3所示。
圖3 定時(shí)器0工作方式1邏輯結(jié)構(gòu)圖
當(dāng)GATE=0,TR0=1時(shí),TL0便在機(jī)器周期的作用下開(kāi)始自動(dòng)加1,當(dāng)加了256次后自動(dòng)向前進(jìn)一位,直到TH0也計(jì)滿(mǎn),然后溢出,置標(biāo)志寄存器TF0=1,如果此時(shí)設(shè)置了中斷允許,CPU便作進(jìn)入中斷函數(shù)內(nèi)進(jìn)行中斷程序的處理。注意,此時(shí)若TR0=1一直打開(kāi)的話(huà),計(jì)數(shù)器滿(mǎn)后會(huì)全部自動(dòng)清零,然后重新重復(fù)以上過(guò)程,直到TR0=0時(shí)結(jié)束。
接下來(lái)講解如何計(jì)算定時(shí)器的初值問(wèn)題。定時(shí)器一旦啟動(dòng),它便在原來(lái)的數(shù)值基礎(chǔ)上開(kāi)始加1計(jì)數(shù),若在程序開(kāi)始時(shí),我們沒(méi)有設(shè)置TH0和TL0,它們的默認(rèn)值都是0,假設(shè)時(shí)鐘頻率為12MHZ,12個(gè)時(shí)鐘周期為一個(gè)機(jī)器周期,那么此時(shí)的機(jī)器周期就是1us,計(jì)滿(mǎn)TH0和TL0就需要2X16-1,再來(lái)一個(gè)脈沖,計(jì)數(shù)器就溢出,隨即向CPU申請(qǐng)中斷。因此溢出一次的時(shí)間為65536us,約等于65.5ms,如果我們要定時(shí)50ms,此時(shí)就需要向TH0t和TL0里面先賦初值,在這個(gè)初值的基礎(chǔ)上計(jì)50000個(gè)數(shù)后,定時(shí)器溢出,此時(shí)剛好就是50ms中斷一次,如需要定時(shí)1S時(shí),在寫(xiě)程序時(shí)當(dāng)產(chǎn)生20次50ms的定時(shí)器中斷后便認(rèn)定是1s,這樣便可以精確制定定時(shí)時(shí)間了。要定時(shí)50ms,即要計(jì)50000個(gè)數(shù),TH0和TL0中應(yīng)該裝的總數(shù)是65536-50000=15536,把15536對(duì)256求模:15536/256裝入TH0中,把15536對(duì)256求余:15536%256裝入TL0中就可以了。
以上就是定時(shí)器賦初值的計(jì)算方法,總結(jié)后可以得出以下結(jié)論:當(dāng)用定時(shí)器的方式1時(shí),設(shè)機(jī)器周期為t ,定時(shí)器產(chǎn)生一次中斷的時(shí)間為T(mén),那么需要計(jì)數(shù)的個(gè)數(shù)N=T/t,裝放THX和TLX中的數(shù)分別為:
THX=(65536-N)/256 ,TLX=(65536-N)%256
要計(jì)算機(jī)器周期t,就需要知道系統(tǒng)的時(shí)鐘頻率,也就是單片機(jī)外接晶振的頻率,實(shí)驗(yàn)板上的時(shí)鐘頻率為11.0592MHZ,那么機(jī)器周期為12X(1/11059200)=1.09us,若T=50ms.那么N=50000/1.09=45873,如果晶振為12MHX的話(huà),用同樣的方法算出來(lái)N=50000.
4程序舉例
下面我們舉一個(gè)例子,用單片機(jī)的定時(shí)器0、工作方式1和中斷技術(shù)實(shí)現(xiàn)讓L1以間隔1s的時(shí)間閃爍。
這里我們先總結(jié)一下,在使用定時(shí)器主要對(duì)定時(shí)器作相應(yīng)的初始化,其步驟為:
(1)對(duì)TMOD賦值
選擇計(jì)數(shù)或者定時(shí)
確定T0或T1的工作方式。
(2)計(jì)算初值,并將其寫(xiě)入TH0、TL0或TH1、TL1。
(3)使TR0或TR1置位,啟動(dòng)定時(shí)/計(jì)數(shù)器定時(shí)或計(jì)數(shù)。
(4)需使用中斷方式時(shí),則對(duì)IE等賦值,開(kāi)放中斷
下面我們給出相關(guān)程序。
例1:1357燈以間隔1s的時(shí)間閃爍。
#include//頭文件,主要用來(lái)聲明,特殊功能寄存器的地址
#define uint unsigned int//宏定義
#define uchar unsigned char//宏定義
sbit D1=P1^0;//位聲明
uchar time;//定義變量time為無(wú)符號(hào)字符型
void main()//主函數(shù)
{
TMOD=0x01;//設(shè)置定時(shí)器0為工作方式1
TH0=(65535-50000)/256;//定時(shí)50ms賦初值15535
TL0=(65535-50000)%256;
EA=1;//開(kāi)總中斷
ET0=1;//開(kāi)定時(shí)器0中斷
TR0=1;//啟動(dòng)定時(shí)器0
//上面6行為定時(shí)器和中斷初始化程序 
while(1);//停在這里等待中斷產(chǎn)生
}
void tim1() interrupt 1//中斷子函數(shù),功能為500ms燈滅一次
{
time++;//進(jìn)入一次中斷time自加1
if(time==10)//如果自加到10,相當(dāng)于500ms
{
D1=~D1;//燈亮滅交替
time=0;//time清零
}
}
程序下載到51hei實(shí)驗(yàn)板上的現(xiàn)象如圖4所示:
圖4 L1燈以間隔1s的時(shí)間閃爍
上一頁(yè) 1 2 下一頁(yè)

關(guān)鍵詞: 定時(shí)器單片

評(píng)論


技術(shù)專(zhuān)區(qū)

關(guān)閉