新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 用PIC16C54做一個LED電子鐘

        用PIC16C54做一個LED電子鐘

        作者: 時間:2016-12-02 來源:網絡 收藏
        對于很多電子愛好者來說,自己制作一款LED電子鐘,是很有意思的一件事情,LED的

        電子鐘雖然耗電一點,但在夜間也不用打開照明就可以看得清清楚楚,還是很方便的了.

        PIC16C54內部有512字節(準確的說是可以放512條指令)的指令空間,對于電子鐘的

        應用項目來說,資源已經足夠了.它具有12個I/O口,剛好可以用來做一個四個數碼管的電

        子鐘.其中PORTA口用作位碼輸出,PORTB用作段碼輸出和按鍵輸入.

        54內部有一個8位的定時器,但沒有中斷溢出功能,對于用慣了中斷的人來說,可能覺

        得定時基準不好做,比如51系列的,只要設定好中斷溢出時間,一般取整數指令周期,如每

        次溢出時間為50mS,每次溢出時累加器加一,當加到20次時就有1S了,很方便進行系統時鐘

        的處理.但PIC16C54沒有中斷功能,只能用判斷定時器溢出的方式來確定定時器的定時.判

        斷定量器溢出可以采用比較的方式,當采集到TMR0的計數值為0-5時,可以認為定時器溢出

        了,另一種方式是測試TMR0的最高位是否為1,也就是把TMR0當作7位定時器來用,這樣,就

        不會出現前一種方式由于程序錯過捕獲到TMR0的值為0-5的時機而使定時出現誤差了.比

        較好的方法是用一個存儲器X0跟蹤TMR0的計數值,在正常情況下,X0總是會小于TMR0的計

        數值,因為在讀取TMR0的值并把這個值賦值給X0之后,TMR0的計數值又在累加了,但TMR0是

        一個循環計數器,當加到255后,其值將會變為零,這樣就為判斷TMR0提供了依據,即只要測

        試到X0>=TMR0,即可認為TMR0已經溢出,這樣就可以進行相應的處理了.如時鐘頻率為

        4MHz,則一條指令的執行時間為1uS,TMR0溢出對應于256uS,當測試到TMR0溢出之后,不對

        TMR0進行任何賦值操作,因為對TMR0進行寫入,會使TMR0延遲三個指令周期,而每次往

        TMR0寫入的時候,不可能它的計數值都是同一個值,所以只能采用加一個預定值的方法,如

        果TMR0不采用分頻器,則對TMR0執行 TMR0=TMR0+9的操作,將使每次TMR0的計數溢出周期

        等效為250個指令周期,也就是250uS,需要注意的是,每次讀入TMR0的值與X0進行比較時的

        時間間隔一定不能大于TMR0的溢出時間,否則錯過溢出時刻.判斷TMR0溢出的最短指令為:

        MOVF TMR0,W

        SUBWF X0,F

        MOVWF X0

        SKPC

        GOTO 沒有溢出...

        溢出處理...

        對應的C語言語句為:

        i=TMR0;

        x0=x0-i;

        x0=i;

        if(CARRY)

        {TMR0+=9;
        }
        這里借用了一個臨時存儲器i,如果沒有它,則語句編譯不會最短,程序執行會了出錯

        ,不能保證每次溢出為250uS.

        如果選用32768晶振的話,程序的設計上,不需要再對TMR0作任何寫入,只需用上述程

        序判斷TMR0溢出就可以了.因為TMR0每次溢出的時間為0.03125秒,再對其進行32分頻即可

        得到秒信號了.

        這樣,整個程序的核心部分就完成了,剩下的應該不難寫出來.

        本文引用地址:http://www.104case.com/article/201612/324733.htm


        關鍵詞: PIC16C54LED電子

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 乐安县| 嘉峪关市| 湘乡市| 福建省| 海伦市| 西安市| 鄢陵县| 偏关县| 平阴县| 安仁县| 社会| 武平县| 安福县| 永兴县| 岑溪市| 湖南省| 沙田区| 玉树县| 宜宾市| 肥城市| 沛县| 泊头市| 罗甸县| 临澧县| 凤城市| 武安市| 施秉县| 泗水县| 延川县| 临颍县| 定兴县| 东明县| 岐山县| 黄骅市| 札达县| 肃南| 正定县| 托克托县| 京山县| 渝中区| 江达县|