畢業(yè)設(shè)計要用到外部中斷和定時器,定時器和外部中斷都要三個,當(dāng)時暈,定時器可以弄三個,但是外部中斷不好弄。而且外部中斷是下降沿中斷的那種而且三個中斷信號還有那種不是特別固定的關(guān)系,想了想中斷擴展,想了很久也沒想出個法子來。后來根據(jù)實際情況,找到52定時器2可以用作外部中斷使用,特別是下降沿中斷的那種。因為我做的東西剛好是中斷后開始定時的那種,因此定時和中斷也不沖突。
網(wǎng)上關(guān)于講52單片機定時/計數(shù)器2的資料不是很多,因為它被用得較少,后來我只能根據(jù)網(wǎng)上的資料和我的不斷的嘗試,從簡單實例入手去研究,才才搞透定時/計數(shù)器2的使用,才實現(xiàn)了中斷和定時的復(fù)用。下面是我搜到的定時器2寄存器的一些資料,比較可靠。
定時器T2的功能比T1、T0都強大,但描述它的資料不多,可能是使用得比較少的緣故吧。它是一個16位的具有自動重裝和捕獲能力的定時/計數(shù)器,它的計數(shù)時鐘源可以是內(nèi)部的機器周期,也可以是P1.0輸入的外部時鐘脈沖。T2的控制寄存器的功能描述如下:
T2CON(T2的控制寄存器),字節(jié)地址0C8H:
位地址 0CFH 0CEH 0CDH 0CCH 0CBH 0CAH 0C9H 0C8H
符 號 TF2 EXF2 RCLK TCLK EXEN2 TR2 C/T2 CP/RT2
各位的定義如下:
TF2:定時/計數(shù)器2溢出標(biāo)志,T2溢出時置位,并申請中斷。只能用軟件清除,但T2作為波特率發(fā)生器使用的時候,(即RCLK=1或TCLK=1),T2溢出時不對TF2置位。
EXF2:當(dāng)EXEN2=1時,且T2EX引腳(P1.0)出現(xiàn)負(fù)跳變而造成T2的捕獲或重裝的時候,EXF2置位并申請中斷。EXF2也是只能通過軟件來清除的。
RCLK:串行接收時鐘標(biāo)志,只能通過軟件的置位或清除;用來選擇T1(RCLK=0)還是T2(RCLK=1)來作為串行接收的波特率產(chǎn)生器
TCLK:串行發(fā)送時鐘標(biāo)志,只能通過軟件的置位或清除;用來選擇T1(TCLK=0)還是T2(TCLK=1)來作為串行發(fā)送的波特率產(chǎn)生器
EXEN2:T2的外部允許標(biāo)志,只能通過軟件的置位或清除;EXEN2=0:禁止外部時鐘觸發(fā)T2;EXEN2=1:當(dāng)T2未用作串行波特率發(fā)生器時,允許外部時鐘觸發(fā)T2,當(dāng)T2EX引腳輸入一個負(fù)跳變的時候,將引起T2的捕獲或重裝,并置位EXF2,申請中斷。
TR2:T2的啟動控制標(biāo)志;TR2=0:停止T2;TR2=1:啟動T2
C/T2:T2的定時方式或計數(shù)方式選擇位。只能通過軟件的置位或清除;C/T2=0:選擇T2為定時器方式;C/T2=1:選擇T2為計數(shù)器方式,下降沿觸發(fā)。
CP/RT2:捕獲/重裝載標(biāo)志,只能通過軟件的置位或清除。CP/RT2=0時,選擇重裝載方式,這時若T2溢出(EXEN2=0時)或者T2EX引腳(P1.0)出現(xiàn)負(fù)跳變(EXEN2=1時),將會引起T2重裝載;CP/RT2=1時,選擇捕獲方式,這時若T2EX引腳(P1.0)出現(xiàn)負(fù)跳變(EXEN2=1時),將會引起T2捕獲操作。但是如果RCLK=1或TCLK=1時,CP/RT2控制位不起作用的,被強制工作于定時器溢出自動重裝載模式。
T2MOD(方式寄存器),字節(jié)地址0C9H:
D7D6 D5 D4 D3 D2 D1 D0
---- -- -- -- -- T2OE DCEN
T2OE:T2輸出允許位,當(dāng)T2OE=1的時候,允許時鐘輸出到P1.0。(僅對80C54/80C58有效)
DCEN:向下計數(shù)允許位。DCEN=1是允許T2向下計數(shù),否則向上計數(shù)。
T2的數(shù)據(jù)寄存器TH2、TL2和T0、T1的用法一樣,而捕獲寄存器RCAP2H、RCAP2L只是在捕獲方式下,產(chǎn)生捕獲操作時自動保存TH2、TL2的值。
以上是T2的相關(guān)寄存器的描述,其實用法上跟T0、T1是差不多的,只是功能增強了,設(shè)置的東西多了而已。
定時/計數(shù)器2其實用到最多的就是T2CON這個寄存器啦,它設(shè)定的定時和計數(shù)的方式。有三種工作方式,捕獲,自動重裝,波特率發(fā)生器。下面我是在百度百科里面找的少許資料:
捕獲方式:
在捕獲方式下,通過T2CON控制位EXEN2來選擇兩種方式。如果EXEN2=0,定時器2 是一個16 位定時器或計數(shù)器,計數(shù)溢出時,對T2CON 的溢出標(biāo)志TF2 置位,同時激活中斷。如果EXEN2=1,定時器2 完成相同的操作,而當(dāng)T2EX 引腳外部輸入信號發(fā)生1 至0 負(fù)跳變時,也出現(xiàn)TH2 和TL2 中的值分別被捕獲到RCAP2H 和RCAP2L 中。另外,T2EX 引腳信號的跳變使得T2CON 中的EXF2 置位,與TF2 相仿,EXF2 也會激活中斷。捕獲方式如圖4 所示。
自動重裝載(向上或向下計數(shù)器)方式:
當(dāng)定時器2工作于16位自動重裝載方式時,能對其編程為向上或向下計數(shù)方式,這個功能可通過特殊功能寄存器T2CON(見表5)的DCEN 位(允許向下計數(shù))來選擇的。復(fù)位時,DCEN 位置“0”,定時器2 默認(rèn)設(shè)置為向上計數(shù)。當(dāng)DCEN置位時,定時器2 既可向上計數(shù)也可向下計數(shù),這取決于T2EX 引腳的值,參見圖5,當(dāng)DCEN=0 時,定時器2 自動設(shè)置為向上計數(shù),在這種方式下,T2CON 中的EXEN2 控制位有兩種選擇,若EXEN2=0,定時器2 為向上計數(shù)至0FFFFH 溢出,置位TF2 激活中斷,同時把16 位計數(shù)寄存器RCAP2H 和RCAP2L重裝載,RCAP2H 和RCAP2L 的值可由軟件預(yù)置。若EXEN2=1,定時器2 的16 位重裝載由溢出或外部輸入端T2EX 從1 至0 的下降沿觸發(fā)。這個脈沖使EXF2 置位,如果中斷允許,同樣產(chǎn)生中斷。
定時器2的中斷入口地址是:002BH ——0032H。
當(dāng)DCEN=1時,允許定時器2向上或向下計數(shù),如圖6 所示。這種方式下,T2EX 引腳控制計數(shù)器方向。T2EX 引腳為邏輯“1”時,定時器向上計數(shù),當(dāng)計數(shù)0FFFFH 向上溢出時,置位TF2,同時把16 位計數(shù)寄存器RCAP2H 和RCAP2L重裝載到TH2 和TL2 中。 T2EX 引腳為邏輯“0”時,定時器2 向下計數(shù),當(dāng)TH2 和TL2 中的數(shù)值等于RCAP2H 和RCAP2L中的值時,計數(shù)溢出,置位TF2,同時將0FFFFH 數(shù)值重新裝入定時寄存器中。
當(dāng)定時/計數(shù)器2向上溢出或向下溢出時,置位EXF2 位。
波特率發(fā)生器:
當(dāng)T2CON(表3)中的TCLK 和RCLK 置位時,定時/計數(shù)器2 作為波特率發(fā)生器使用。如果定時/計數(shù)器2 作為發(fā)送器或接收器,其發(fā)送和接收的波特率可以是不同的,定時器1 用于其它功能,如圖7 所示。若RCLK 和TCLK 置位,則定時器2工作于波特率發(fā)生器方式。
波特率發(fā)生器的方式與自動重裝載方式相仿,在此方式下,TH2翻轉(zhuǎn)使定時器2的寄存器用RCAP2H 和RCAP2L 中的16位數(shù)值重新裝載,該數(shù)值由軟件設(shè)置。
在方式1和方式3中,波特率由定時器2 的溢出速率根據(jù)下式確定:
方式1和3的波特率=定時器的溢出率/16
定時器既能工作于定時方式也能工作于計數(shù)方式,在大多數(shù)的應(yīng)用中,是工作在定時方式(C/T2=0)。定時器2 作為波特率發(fā)生器時,與作為定時器的操作是不同的,通常作為定時器時,在每個機器周期(1/12 振蕩頻率)寄存器的值加1,而作為波特率發(fā)生器使用時,在每個狀態(tài)時間(1/2 振蕩頻率)寄存器的值加1。波特率的計算公式如下:
方式1和3的波特率=振蕩頻率/{32*[65536-(RCP2H,RCP2L)]}式中(RCAP2H,RCAP2L)是RCAP2H 和RCAP2L中的16 位無符號數(shù)。
定時器2作為波特率發(fā)生器使用的電路如圖7 所示。T2CON 中的RCLK 或TCLK=1 時,波特率工作方式才有效。在波特率發(fā)生器工作方式中,TH2 翻轉(zhuǎn)不能使TF2 置位,故而不產(chǎn)生中斷。但若EXEN2 置位,且T2EX 端產(chǎn)生由1 至0 的負(fù)跳變,則會使EXF2 置位,此時并不能將(RCAP2H,RCAP2L)的內(nèi)容重新裝入TH2 和TL2 中。所以,當(dāng)定時器2 作為波特率發(fā)生器使用時,T2EX 可作為附加的外部中斷源來使用。需要注意的是,當(dāng)定時器2 工作于波特率器時,作為定時器運行(TR2=1)時,并不能訪問TH2 和TL2。因為此時每個狀態(tài)時間定時器都會加1,對其讀寫將得到一個不確定的數(shù)值。
然而,對RCAP2則可讀而不可寫,因為寫入操作將是重新裝載,寫入操作可能令寫和/或重裝載出錯。在訪問定時器2或RCAP2 寄存器之前,應(yīng)將定時器關(guān)閉(清除TR2)。
回到主題,其實我要研究,是如何先讓定時器先產(chǎn)生下降沿中斷,軟后中斷函數(shù)里面又開始定時。其實說來也很簡單,因為只要置EXEN2=1,而且不開啟定時功能,也就是置TR2=0后,如果有外部下降沿脈沖輸入T2EX(P1.1)引腳,那么就產(chǎn)生中斷,那么就可以在中斷函數(shù)中置TR2=1,設(shè)置定時器初值,這樣就開啟了定時器,實現(xiàn)了定時功能??傊@個TR2設(shè)置很關(guān)鍵。這樣就實現(xiàn)了先中斷,軟后立即定時。其實也可以用T2EX口完全做外部下降沿脈沖的中斷的,只要一直設(shè)置TR2=0就行了,我這里只不過是要用到定時功能而已。
下面我是用匯編語言寫的一個單片機程序,實現(xiàn)了先做外部中斷后定時的功能。
T2CONEQU0C8H
T2MODEQU0C9H
CPEQUT2CON.0
TR2