- 單片機(jī)C語言程序設(shè)計實訓(xùn)100例:基于STC8051+Proteus仿真與實戰(zhàn)
- 彭偉
- 1994字
- 2022-05-05 20:18:32
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. 源程序代碼

- 數(shù)據(jù)科學(xué)實戰(zhàn)手冊(R+Python)
- 一步一步學(xué)Spring Boot 2:微服務(wù)項目實戰(zhàn)
- 軟件架構(gòu)設(shè)計:大型網(wǎng)站技術(shù)架構(gòu)與業(yè)務(wù)架構(gòu)融合之道
- Learn Scala Programming
- YARN Essentials
- MySQL數(shù)據(jù)庫基礎(chǔ)實例教程(微課版)
- SAP BusinessObjects Dashboards 4.1 Cookbook
- 學(xué)Python也可以這么有趣
- PHP+MySQL+Dreamweaver動態(tài)網(wǎng)站開發(fā)從入門到精通(第3版)
- OpenCV 4計算機(jī)視覺項目實戰(zhàn)(原書第2版)
- HTML5秘籍(第2版)
- Mastering Adobe Captivate 7
- Photoshop CC移動UI設(shè)計案例教程(全彩慕課版·第2版)
- 從零學(xué)Java設(shè)計模式
- 軟件測試技術(shù)