單片機(jī)定時(shí)功能示例總結(jié)
【例1】利用定時(shí)功能產(chǎn)生方波信號(hào)。假設(shè):單片機(jī)晶振頻率為fosc=6MHz。要求:利用定時(shí)/計(jì)數(shù)器T0的工作方式1控制定時(shí),在單片機(jī)P1.1引腳產(chǎn)生頻率f=50Hz的方波。
解:
(1)任務(wù)分析
由方波信號(hào)的頻率可知信號(hào)的周期T=1/f=1/(50Hz)=0.02s,信號(hào)的波形如圖4-12所示。由圖4-12可知,50Hz的方波信號(hào)每0.01s發(fā)生一次電平反轉(zhuǎn)(即電平由0到1或由1到0的變化)。因此,可以利用T0定時(shí)0.01s,每0.01s改變一次P1.1引腳上的電平狀態(tài)。
圖4-12 50Hz方波信號(hào)波形
(2)T0初值的計(jì)算
單片機(jī)機(jī)器周期Tm=12/fosc=12/(6MHz)=2μs,T0在工作方式1時(shí)的位數(shù)N=16。由式(4-2)可知T0的初值M=216-0.01s/2μs=65536-0.01/(2×10-6)=60536=0EC78H。在定時(shí)器的初始化時(shí),0ECH和78H需分別送入T0的寄存器TH0和TL0中。
(3)確定定時(shí)/計(jì)數(shù)器方式控制字TMOD的值
TMOD的高4位屬于T1,低4位屬于T0,因?yàn)楸纠形瓷婕癟1,所以TMOD的高4位可以均設(shè)置為0。在TMOD的低4位中,因?yàn)椴贿M(jìn)行引腳電平的測(cè)量,所以GATE=0;采用T0的定時(shí)功能,所以C/T=0;T0工作于方式1,所以M1M0=01B。最后,可得TMOD=01H。
(4)程序設(shè)計(jì)
定時(shí)時(shí)間到的標(biāo)志是TF0被置1,因此當(dāng)TF0由0變成1時(shí),可知定時(shí)時(shí)間到。檢測(cè)TF0由0變1的方式有以下兩種,即:
1)查詢法。利用單片機(jī)的位判斷轉(zhuǎn)移指令,不斷地檢測(cè)TF0的狀態(tài)。當(dāng)檢測(cè)到TF0為1時(shí),控制P1.1引腳電平反轉(zhuǎn)。
2)中斷法。利用定時(shí)/計(jì)時(shí)器的溢出中斷來(lái)判斷定時(shí)間是否達(dá)到。在允許定時(shí)/計(jì)數(shù)器中斷的情況下,若溢出中斷發(fā)生,單片機(jī)將自動(dòng)執(zhí)行定時(shí)/計(jì)數(shù)器中斷的中斷服務(wù)處理程序,可以在該程序中完成P1.1引腳電平反轉(zhuǎn)的操作。
無(wú)論采用何種方法設(shè)計(jì)定時(shí)程序,一定要注意:定時(shí)/計(jì)數(shù)器工作在方式1時(shí),溢出將使其初值寄存器TH0和TL0清0。因此,每次溢出后都需要通過(guò)指令重新給定時(shí)/計(jì)數(shù)器賦初值。
下面分別給出查詢法和中斷法的參考程序。
查詢法程序如下:
【例2】定時(shí)中“軟時(shí)鐘”的使用。假設(shè):?jiǎn)纹瑱C(jī)晶振頻率為focs=12MHz。要求:利用定時(shí)/計(jì)數(shù)器T1的方式2控制定時(shí),在單片機(jī)P1.1引腳產(chǎn)生頻率f=1kHz的方波。
解:
(1)任務(wù)分析
由方波信號(hào)的頻率可知信號(hào)的周期T=1/f=1/(1kHz)=1ms。類(lèi)似于例4-8的分析過(guò)程,可知需要T1產(chǎn)生的定時(shí)時(shí)間是T/2=0.5ms=500μs。但是由例4-6可知,定時(shí)/計(jì)數(shù)器工作在方式2時(shí)的最大定時(shí)時(shí)間為256μs。因此,在本例中無(wú)法通過(guò)簡(jiǎn)單的定時(shí)器初值設(shè)置達(dá)到定時(shí)0.5s的要求。解決這一問(wèn)題的方法是,將500μs定時(shí)轉(zhuǎn)化為5個(gè)100μs定時(shí),即將定時(shí)/計(jì)數(shù)器的定時(shí)時(shí)間設(shè)定為100μs,當(dāng)100μs的個(gè)數(shù)達(dá)到5個(gè)時(shí),控制P1.1引腳上的電平發(fā)生反轉(zhuǎn)。而“軟時(shí)鐘”是用于記錄100μs個(gè)數(shù)的寄存器或數(shù)據(jù)存儲(chǔ)器單元。
(2)T1初值的計(jì)算
根據(jù)已知可得:單片機(jī)機(jī)器周期Tosc=12/fosc=12/(12MHz)=1μs,T1在工作方式2時(shí)的位數(shù)N=8。由式(4-2)可知定時(shí)100μs所需的T1初值M=28-100μs/1μs=156=9CH。在定時(shí)器初始化時(shí),9CH被送入T1的寄存器TH1和TL1中。在方式2時(shí),TL1的值每個(gè)機(jī)器周期加1,而TH1的值保持不變,每當(dāng)TL1溢出時(shí),TH1的值被重新送入TL1。
(3)確定定時(shí)/計(jì)數(shù)器方式控制字TMOD
由于本例中只用到T1,所以TMOD的低4位均清0即可,僅需設(shè)置與T1有關(guān)的高4位。因?yàn)椴粶y(cè)量引腳電平,所以GATE=0;使用定時(shí)功能,所以C/T=0;工作于方式2,所以M1M0=10。最后,可得TMOD=20H。
(4)程序設(shè)計(jì)
以下參考程序采用中斷的方法控制定時(shí)。
在本例的程序中,“現(xiàn)場(chǎng)保護(hù)”的作用是將主程序和子程序共用的資源(包括特殊功能寄存器或數(shù)據(jù)存儲(chǔ)器中的存儲(chǔ)單元)臨時(shí)存入堆棧中,而“現(xiàn)場(chǎng)恢復(fù)”的作用是將上述資源從堆棧中還原。堆棧采用“先入后出”的存取方式,所以先被“PUSH”的數(shù)需后被“POP”。另外,“PUSH”和“POP”通常成對(duì)使用,否則可能導(dǎo)致堆棧中的數(shù)據(jù)混亂。