用PIC16C54做一個LED電子鐘
電子鐘雖然耗電一點,但在夜間也不用打開照明就可以看得清清楚楚,還是很方便的了.
PIC16C54內(nèi)部有512字節(jié)(準確的說是可以放512條指令)的指令空間,對于電子鐘的
應(yīng)用項目來說,資源已經(jīng)足夠了.它具有12個I/O口,剛好可以用來做一個四個數(shù)碼管的電
子鐘.其中PORTA口用作位碼輸出,PORTB用作段碼輸出和按鍵輸入.
54內(nèi)部有一個8位的定時器,但沒有中斷溢出功能,對于用慣了中斷的人來說,可能覺
得定時基準不好做,比如51系列的,只要設(shè)定好中斷溢出時間,一般取整數(shù)指令周期,如每
次溢出時間為50mS,每次溢出時累加器加一,當加到20次時就有1S了,很方便進行系統(tǒng)時鐘
的處理.但PIC16C54沒有中斷功能,只能用判斷定時器溢出的方式來確定定時器的定時.判
斷定量器溢出可以采用比較的方式,當采集到TMR0的計數(shù)值為0-5時,可以認為定時器溢出
了,另一種方式是測試TMR0的最高位是否為1,也就是把TMR0當作7位定時器來用,這樣,就
不會出現(xiàn)前一種方式由于程序錯過捕獲到TMR0的值為0-5的時機而使定時出現(xiàn)誤差了.比
較好的方法是用一個存儲器X0跟蹤TMR0的計數(shù)值,在正常情況下,X0總是會小于TMR0的計
數(shù)值,因為在讀取TMR0的值并把這個值賦值給X0之后,TMR0的計數(shù)值又在累加了,但TMR0是
一個循環(huán)計數(shù)器,當加到255后,其值將會變?yōu)榱?這樣就為判斷TMR0提供了依據(jù),即只要測
試到X0>=TMR0,即可認為TMR0已經(jīng)溢出,這樣就可以進行相應(yīng)的處理了.如時鐘頻率為
4MHz,則一條指令的執(zhí)行時間為1uS,TMR0溢出對應(yīng)于256uS,當測試到TMR0溢出之后,不對
TMR0進行任何賦值操作,因為對TMR0進行寫入,會使TMR0延遲三個指令周期,而每次往
TMR0寫入的時候,不可能它的計數(shù)值都是同一個值,所以只能采用加一個預(yù)定值的方法,如
果TMR0不采用分頻器,則對TMR0執(zhí)行 TMR0=TMR0+9的操作,將使每次TMR0的計數(shù)溢出周期
等效為250個指令周期,也就是250uS,需要注意的是,每次讀入TMR0的值與X0進行比較時的
時間間隔一定不能大于TMR0的溢出時間,否則錯過溢出時刻.判斷TMR0溢出的最短指令為:
MOVF TMR0,W
SUBWF X0,F
MOVWF X0
SKPC
GOTO 沒有溢出...
溢出處理...
對應(yīng)的C語言語句為:
i=TMR0;
x0=x0-i;
x0=i;
if(CARRY)
{TMR0+=9;
}
這里借用了一個臨時存儲器i,如果沒有它,則語句編譯不會最短,程序執(zhí)行會了出錯
,不能保證每次溢出為250uS.
如果選用32768晶振的話,程序的設(shè)計上,不需要再對TMR0作任何寫入,只需用上述程
序判斷TMR0溢出就可以了.因為TMR0每次溢出的時間為0.03125秒,再對其進行32分頻即可
得到秒信號了.
這樣,整個程序的核心部分就完成了,剩下的應(yīng)該不難寫出來.
評論