新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 基于AT89C2051的電子鐘設計

        基于AT89C2051的電子鐘設計

        作者: 時間:2014-05-07 來源:網絡 收藏

        電路見圖1.

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

         

         

        一片20引腳的單片機主體,其顯示數據從P1口分時輸出,P3.0~3.3則輸出對應的位選通信號。由于LED數碼管點亮時耗電較大,故使用了四只PNP型晶體管VT1~VT4進行放大。本來筆者還有一種更簡的設計方案(見圖2),可省去VT1~VT4及R1~R4八個元件,但這種設計由于單片機輸出口的灌入電流有限(約20mA),數碼管亮度較暗而不向讀者介紹,除非你采用了高亮度的發光數碼管。

         

         

        P3.4、P3.5、3.7外接了三個輕觸式按鍵,這里我們分別命名為:模式設定鍵set(P3.4)、時調整鍵hour(P3.5)、分調整鍵min(P3.7)。C1、R13組成上電復位電路。VT5及蜂鳴器Bz為鬧時訊響電路。三端穩壓器7805輸出的5V電壓供整個系統工作。此可與任何9~20V/100mA的交直流電源適配器配合工作,適應性強。

        功能

        1.走時:通過模式設定鍵set選擇為走時,U1、U2顯示小時,U3、U4顯示分。U2的小數點為秒點,每秒閃爍一次。

        2.走時調整:通過模式設定鍵set選擇為走時調整,按下hour鍵對U1、U2的走時“時”顯示進行調整(每0.2秒遞加1)。按下min鍵對U3、U4的走時“分”顯示進行調整(每0.2秒遞加1)。

        3.鬧時調整:通過模式設定鍵set選擇為鬧時調整,按下hour鍵對U1、U2的鬧時“時”顯示進行調整(每0.2秒遞加1)。按下min鍵對U3、U4的鬧時“分”顯示進行調整(每0.2秒遞加1)。

        4.鬧時啟/停設定:通過模式設定鍵set選擇為鬧時啟/停設定,按下min鍵U3的小數點點亮,鬧時功能啟動;按下hour鍵U3的小數點熄滅,鬧時功能關停。

        由于電路設計得極其簡單,因此豐富的功能只能由軟件完成,這里軟件設計成為了關鍵。下面介紹軟件設計要點。

        圖3為主程序狀態流程。

         

         

        運行時建立的主要狀態標志如下:

        flag-掉電標志。掉電后,flag內為一隨機數;重新設定時間后flag內寫入標志數55H.

        set-工作模式設定標志。

        hour-走時“時”單元。

        min-走時“分”單元。

        sec-走時“秒”單元。

        dEDA-走時5mS計數單元

        t_hour-鬧時“時”單元。

        t_min-鬧時“分”單元。

        d_05s-0.5秒位標志。每秒鐘的前0.5秒置1,后0.5秒置0,以使秒點閃爍。

        o_f-鬧時啟/停位標志。鬧時啟動置1,鬧時關停置0.

        另外將定時器T0設定為5mS的定時中斷。這里晶振頻率為12MHz,因此5mS的初值為-5000,但實際上程序還要作其它運算,使得時間偏長,經調整為-4800后試驗剛好。計時單元deda每次中斷均加1.走時函數判斷deda>=200時即令秒單元sec加1.同理秒單元sec滿60后令分單元min加1.分單元min滿60后令時單元hour加1.時單元hour滿24后清0.

        上電后,首先進行初始化,對各狀態標志、輸入輸出口及定時器T0進行初始化工作,以適應后面程序的要求。

        隨后程序判斷有無set鍵按下,如按下,則set鍵值從0起加1.set鍵值只能從0加到3,然后又回到0.

        接下來,根據鍵值進行散轉。若set=0,運行走時程序;若set=1,進入調整鬧時時間程序;若set=2,進入調整走時時間程序;若set=3,顯示已調好的鬧時時間,同時進入啟/停鬧時程序。

        散轉完后,進行判斷掉電標志flag是否等于55H.若不等,說明剛開機上電或運行過程中掉過電,這時四個數碼管以1Hz的頻率閃爍四個8字,提示時間不準;若相等,說明未掉電,RAM區內容未變化,時間準確。

        再下來程序又轉回到初始化之后進行循環運行。

        由于使用了四只數碼管密集排列,因此只能采用雙面印刷板設計,圖4、5分別為正面(元件面)、反面的印板圖。尺寸3000milx4000mil(7.62cmx10.16cm)。圖6為計算機輸出的三維仿真印制板。

         

         

         

         

         

         

        元件選用

        為了走時準確,晶振X最好選用溫漂小的。四個數碼管U1~U4可選用發綠光的,這樣光澤較柔和。蜂鳴器Bz要購買繞線型的電動式蜂鳴器(市場上有一種加電壓即工作的蜂鳴器這里不適用),因驅動信號為脈沖信號。其它元件一般無特殊要求。

        使用方法

        上電后,四個LED數碼管閃爍四個8字。

        按一下set鍵,閃爍現象消失(此時set=1),U1的小數點亮,說明此刻可以調整鬧時時間。按下hour鍵,U1、U2作加法;按下min鍵,U3、U4作加法。這些調整好的數據被同時送入RAM區的鬧時記憶“時”單元t_hour和鬧時記憶“分”單元t_min.

        再按一下set鍵,set=2,U2的小數點亮,此刻可以調整走時時間。按下hour鍵,U1、U2作加法;按下min鍵,U3、U4作加法。這些調整好的數據也被同步送入RAM區的“時”記憶單元hour和“分”記憶單元min.

        再按一下set鍵,set=3,顯示剛才調整的鬧時時間,此刻可以選擇啟動/關停鬧時。按下min鍵,o_f位標志置1,U3的小數點亮,鬧時啟動;按下hour鍵,o_f位標志置0,U3的小數點滅,鬧時關閉。

        若再按一下set鍵,set=0,電路進入走時狀態,U1、U2顯示小時,U3、U4顯示分。U2的小數點作秒點閃爍。

        在鬧時啟動的情況下,走時到達設定鬧時,則蜂鳴器Bz鳴響一分鐘進行提醒。

        附:用C51編寫的源程序清單(已由實驗板運行通過)

        #include /*包含器件配置文件*/

        #define uchar unsigned char

        #define uint unsigned int

        char DATA_7SEG[10]={0xC0,0xF9,0xA4,0xB0,0x99,

        0x92,0x82,0xF8,0x80,0x90,};/*0~9的數碼管段碼*/

        uchar hour=0,min=0,sec=0; /*時、分、秒單元清零*/

        uchar deda=0; /*5mS計數單元清零*/

        uchar t_hour=0,t_min=0; /*鬧時時、分單元清零*/

        bit d_05s=0; /*0.5秒標志*/

        bit o_f=0; /*鬧時啟/停標志*/

        uchar set=0; /*模式設定標志*/

        uchar m=0;

        uchar flag=0; /*RAM掉電標志*/

        void delay(uint k); /*延時子函數*/

        void conv(); /*走時單元轉換*/

        void p_out(); /*判別鬧時到否子函數*/

        void dirve(); /*走時時間輸出驅動子函數*/

        void t_dirve(); /*鬧時時間輸出驅動子函數*/

        /*鬧時啟/停子函數*/

        void time1_of()

        {uchar m;

        if(P3_7==0)delay(1);

        if(P3_7==0)o_f=1;

        for(m=0;m<30;m++)

        {

        t_dirve();

        P1=DATA_7SEG[t_min/10];P3=0xfd;delay(1);

        if(P3_1==0){if(o_f==1)P1_7=0;}else P1_7=1;

        delay(1);

        }

        if(P3_5==0)delay(1);

        if(P3_5==0) o_f=0;

        for(m=0;m<30;m++)

        {

        t_dirve();

        P1=DATA_7SEG[t_min/10];P3=0xfd;delay(1);

        if(P3_1==0){if(o_f==1)P1_7=0;else P1_7=1;}

        delay(1);

        }

        }

        /*走時函數*/

        void time()

        {

        conv(); /*走時單元轉換*/

        dirve(); /*走時時間輸出驅動子函數*/

        p_out(); /*判別鬧時到否子函數*/

        蜂鳴器相關文章:蜂鳴器原理
        晶振相關文章:晶振原理

        上一頁 1 2 下一頁

        關鍵詞: AT89C2051 電子鐘

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 玛多县| 吉首市| 江山市| 巴中市| 胶州市| 麻阳| 海盐县| 慈利县| 长阳| 青浦区| 东平县| 怀集县| 赫章县| 昌黎县| 门源| 南投市| 阿克陶县| 宝应县| 南安市| 包头市| 绥棱县| 乌拉特前旗| 襄樊市| 栾川县| 克东县| 拉萨市| 资源县| 花莲县| 蓝山县| 文安县| 徐闻县| 肥乡县| 清丰县| 日土县| 正定县| 凤城市| 靖西县| 犍为县| 富民县| 石柱| 西贡区|