官术网_书友最值得收藏!

3.13 TIMER0控制單只LED閃爍

此前有關(guān)單只或多只LED閃爍的程序設(shè)計均使用延時子程序使LED按一定延時亮或滅,形成閃爍效果。圖3-15所示電路則通過TIMER0定時器實現(xiàn)了對LED的閃爍控制。TIMER0通常簡稱為T/C0或T0。

圖3-15 TIMER0控制單只LED閃爍電路

1. 程序設(shè)計與調(diào)試

傳統(tǒng)型8051單片機(jī)僅有2個16位定時/計數(shù)器T/C0與T/C1(簡稱T0與T1)。STC15W4K32S4單片機(jī)內(nèi)置了5個16位定時/計數(shù)器:T/C0~T/C4(簡稱T0~T4)。T0~T4均可工作于計數(shù)方式或定時方式。表3-5給出了STC15的定時/計數(shù)器相關(guān)寄存器。

表3-5 STC15的定時/計數(shù)器相關(guān)寄存器

對于T0與T1,無論是STC15系列單片機(jī),還是在傳統(tǒng)型8051單片機(jī),其工作方式均由TMOD寄存器配置,但兩者的模式配置并不完全相同。T0、T1模式寄存器TMOD如表3-6所示。

表3-6 T0、T1模式寄存器TMOD

使用T0、T1時,還涉及控制寄存器TCON,它包括TF1、TF0、TR1、TR0、IT1、IT0、IE1、IE0共8位。其中,TFx為定時器溢出標(biāo)志位;TRx為定時器運行控制位。

使用定時/計數(shù)器,主要有以下兩種方法。

? 溢出中斷處理:定時/計數(shù)寄存器溢出時觸發(fā)中斷,自動調(diào)用預(yù)先設(shè)計的中斷子程序。

? 溢出標(biāo)志位查詢:循環(huán)檢查定時/計數(shù)器溢出標(biāo)志位(TFx);當(dāng)TFx=1時,執(zhí)行指定程序。

本案例通過STC15的T0控制LED閃爍,并使用上述方法2實現(xiàn),要完成的工作如下。

? 設(shè)置輔助寄存器AUXR配置時鐘分頻(僅針對T0~T2)。

? 定時/計數(shù)器工作模式設(shè)置(對于T0、T1的設(shè)置通過TMOD完成)。

? 設(shè)置定時/計數(shù)寄存器初值(對于T0、T1,對應(yīng)為TH0/TL0、TH1/TL1)。

? 允許定時/計數(shù)器中斷(對于T0、T1,可設(shè)置IE,或單獨設(shè)置EA及ET0、ET1)。

? 啟動定時/計數(shù)器(對于T0、T1,可設(shè)置TCON或單獨設(shè)置TR0、TR1)。

對于STC15拓展的其他定時/計數(shù)器,所對應(yīng)的配置寄存器會存在差異。例如,T3與T4的分頻配置使用T4T3M寄存器完成。

完成上述設(shè)置工作后,余下的最為重要的工作是編寫定時/計數(shù)器中斷子程序,當(dāng)定時/計數(shù)器時間到達(dá)或計數(shù)值溢出即觸發(fā)中斷,所編寫的相應(yīng)中斷子程序?qū)⒈蛔詣诱{(diào)用。

對于STC15的T0,其技術(shù)手冊推薦使用其模式0,即16自動重裝載模式。16位的最大值為216-1=65 535,計數(shù)至65 536時溢出,其16位的原始值將被恢復(fù),計數(shù)重新開始。圖3-16給出了STC15的T0模式0的工作原理。

圖3-16 STC15的T0模式0工作原理

由圖3-16可知,對STC15而言,驅(qū)動T0工作的系統(tǒng)時鐘可以被設(shè)置為8051單片機(jī)的12分頻,也可以被設(shè)置為1分頻。對于12MHz振蕩器頻率,在12分頻模式下,T0計數(shù)周期Tcy=1/(12MHz/12)=11s,如果振蕩器頻率為11.059 2MHz,在12分頻模式下,Tcy=1/(11.059 2MHz/12)≈1.085 11s。在開啟定時/計數(shù)器后,每個計數(shù)周期都將使定時/計數(shù)寄存器累加1。

為使用T0實現(xiàn)12分頻模式下的5ms(5 0000s)定時,使用STC-ISP工具,在定時/計算器中可生成圖3-17所示代碼。

圖3-17 使用STC-ISP工具生成定時器初始化代碼

對于AUXR &=0x7F(01111111),根據(jù)圖3-16可知,AUXR的最高位T0x12被置0,選擇12分頻;對于TMOD &=0xF0,其低4位GATE0、C/T0、M10、M00全部被置0。其中,GATE0=0表示只要TR0=1即可啟動T0;C/T0=0表示T0在內(nèi)部時鐘驅(qū)動下計數(shù);M10 M00=00表示T0工作于模式0,即STC15的16位自動重裝載模式。

在圖3-17中,TL0=0x78,TH0=0xEC,定時初值0xEC78=60 536,它們等價于TL0=(65 536-5 000) & 0x00FF與TH0=(65 536-5 000)>>8,或者是TL0=-5 000 & 0x00FF與TH0=-5 000>>8。

之所以可直接使用“負(fù)數(shù)”,是因為65 536即17位二進(jìn)制數(shù)1 0000 0000 0000 0000的最高位為1,其余16位為0。對于16位的寄存器,65 536與0是相等的。為檢驗這一結(jié)果,可打開Win10附件中的計算器,切換到“程序員”模式,如圖3-18所示,選擇DEC(十進(jìn)制),計算“65 536-5 000”,得到的結(jié)果為60 536;對應(yīng)HEX(十六進(jìn)制)的結(jié)果為EC78,即TL0=0x78,TH0 T 0xEC;如果輸入“0-5 000”,可得結(jié)果為-5 000,即十六進(jìn)制數(shù)FFFF FFFF FFFF EC78。其末尾數(shù)位同樣為EC78,所得結(jié)果中僅有EC78(共4個十六進(jìn)制位,也就是共16位二進(jìn)制位)被分別保存到兩個8位的寄存器TH0與TL0。

圖3-18 使用Win10計算器程序員模式驗算定時初值

在程序中,可直接寫入看似煩瑣的常量表達(dá)式,這樣可提高程序可讀性。

由圖3-16可知,啟動T0開始工作時,可直接置TR0 T 1,在12MHz/12=1MHz計數(shù)時鐘驅(qū)動下,對所設(shè)置的定時/計數(shù)寄存器初值0xEC78(即60 536),該值將會每微秒遞增1,5 0000s后該值為65 536(60 53605 000)。由于模式0為16位,最大值為65 535,定時/計數(shù)寄存器的值遞增至65 536時產(chǎn)生溢出,觸發(fā)T0中斷,硬件置位TF0。

在中斷子程序中,T0和T1的中斷號分別為1、3,不要將其誤設(shè)為0、1。本案例編寫的是T0中斷子程序,該子程序后面添加了interrupt 1。

對于中斷函數(shù)內(nèi)的代碼還有以下兩點說明。

① 由于本案例T0工作于模式0,所設(shè)置TL0與TH0初值將被同時保存至與TL0、TH0共用地址的,被隱藏的RL_TL0、RL_TH0寄存器中,其中RL表示重裝載(ReLoad)。當(dāng)TL0、TH0溢出時將觸發(fā)T0中斷,參照圖3-16可知,RL_TL0、RL_TH0的初值將被重裝回TL0、TH0。8051單片機(jī)的T0模式0為13位模式,且TL0、TH0初值的重裝要通過軟件代碼完成。

② 在當(dāng)前12MHz時鐘、12分頻模式下,T0最大可獨立實現(xiàn)65ms定時,此時定時/計數(shù)初值將為65 536-65 000=536=0x0218,也就是TL0=0x18、TH0=0x02,其中的65 000對應(yīng)65ms(65 0006s),如果要實現(xiàn)更大延時,則要引入靜態(tài)變量或全局變量,如T_Count,通過變量累加來實現(xiàn)更長定時。

2. 實訓(xùn)要求

① 用TIMER0控制LED每隔0.5s被點亮,并在2s后熄滅,如此不斷重復(fù)。

② 用TIMER0控制數(shù)碼管以0.5s的間隔循環(huán)顯示數(shù)字0~9。

3. 源程序代碼

主站蜘蛛池模板: 山阴县| 茌平县| 漳平市| 丘北县| 梁山县| 射阳县| 台中市| 阳东县| 株洲县| 万年县| 漠河县| 云林县| 门源| 福鼎市| 道真| 望城县| 家居| 阿坝县| 青岛市| 大化| 巨野县| 四会市| 奇台县| 洪江市| 静宁县| 济宁市| 搜索| 江都市| 泰安市| 千阳县| 汶上县| 应城市| 礼泉县| 同仁县| 岑巩县| 涞源县| 原阳县| 汶川县| 玉溪市| 华坪县| 甘泉县|