• <rp id="wfxtb"><acronym id="wfxtb"></acronym></rp><em id="wfxtb"></em><dd id="wfxtb"><big id="wfxtb"><video id="wfxtb"></video></big></dd>
  • <rp id="wfxtb"></rp>

    <mark id="wfxtb"><center id="wfxtb"></center></mark>

      <rp id="wfxtb"><span id="wfxtb"><u id="wfxtb"></u></span></rp>

      <rp id="wfxtb"><object id="wfxtb"></object></rp>

      注意:訪問本站需要Cookie和JavaScript支持!請設置您的瀏覽器! 打開購物車 查看留言付款方式聯系我們
      初中電子 單片機教材一 單片機教材二
      搜索上次看見的商品或文章:
      商品名、介紹 文章名、內容
      首頁 電子入門 學單片機 免費資源 下載中心 商品列表 象棋在線 在線繪圖 加盟五一 加入收藏 設為首頁
      本站推薦:
      小小電子鬧鐘 生活學習良伴
      文章長度[20412] 加入時間[2006/7/1] 更新時間[2023/10/28 13:15:28] 級別[3] [評論] [收藏]

      小小電子鬧鐘 生活學習良伴

      ———  一款電路極簡的單片機電子鐘設計詳解

      電路特點

      這里介紹的電子鐘,電路可稱得上極簡,它僅使用單片的20引腳單片機完成電子鐘的全部功能,而筆者見到的其它設計方案均采用二片以上的多片IC實現。

      電路見圖1。


      一片20引腳的單片機AT89C2051為電子鐘主體,其顯示數據從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為主程序狀態流程。


       

      圖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為計算機輸出的三維仿真印制板。


      圖4

       


      圖5

       


      圖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();                                             /*判別鬧時到否子函數*/

      }

       

       

      /*定時器T0  5mS初始化*/

      void init_timer()

      {

      TMOD=0x01;

      TH0=-(4800/256);

      TL0=-(4800%256);

      IE=0x82;

      TR0=1;

      }

       

      /*掃描按鍵子函數*/

      void scan_key()

      {

      delay(1);

      if(P3_4==0)set++;

      if(set>=4)set=0;

      if(set==1)flag=0x55;

      F0:if(P3_4==0)goto F0;                      /*按鍵未釋放,在此等候*/

      }

       

       

      /*延時子函數*/

      void delay(uint k)

      {

      uint i,j;

      for(i=0;i
      for(j=0;j<121;j++)

      {;}}

      }

       

      /*5mS定時中斷服務子函數*/

      void zd(void) interrupt 1

      {

      TH0=-(4800/256);

      TL0=-(4800%256);

      deda++;

      }

       

      /*調整走時時間*/

      void time_adj()

      {uchar m;

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

             if(P3_5==0)hour++;

             if(hour==24)hour=0;

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

                    {

                    dirve();

                    if(P3_2==0)P1_7=0;

                    else P1_7=1;

                    delay(1);

                    }

                   

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

             if(P3_7==0)min++;

             if(min==60)min=0;

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

                    {

                    dirve();

                           if(P3_2==0)P1_7=0;

                    else P1_7=1;

                    delay(1);

                    }

      }

       

       

      /*調整鬧時時間*/

      void time1_adj()

      {uchar m;

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

             if(P3_5==0)t_hour++;

             if(t_hour==24)t_hour=0;

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

                    {

                    t_dirve();

                    }

            

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

             if(P3_7==0)t_min++;

             if(t_min==60)t_min=0;

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

                    {

                    t_dirve();

                    }

      }    

       

      /*時、分、秒單元及走時單元轉換*/

      void conv()

      {

      if(deda<=100)d_05s=0;

             else d_05s=1;

      if(deda>=200){sec++;deda=0;}

      if(sec==60){min++;sec=0;}

      if(min==60){hour++;min=0;}

      if(hour==24){hour=0;}

      }

       

      /*走時時間輸出驅動子函數*/

      void dirve()

      {

      P1=DATA_7SEG[hour/10];P3=0xf7;delay(1);

      P1=DATA_7SEG[hour%10];P3=0xfb;delay(1);

      if(d_05s==1){if(P3_2==0)P1_7=0;else P1_7=1;}

      delay(1);

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

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

      P1=DATA_7SEG[min%10];P3=0xfe;delay(1);

      }

       

      /*鬧時時間輸出驅動子函數*/

      void t_dirve()

      {

      P1=DATA_7SEG[t_hour/10];P3=0xf7;delay(1);

      if(P3_3==0)P1_7=0;else P1_7=1;

      delay(1);

      P1=DATA_7SEG[t_hour%10];P3=0xfb;delay(1);

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

      P1=DATA_7SEG[t_min%10];P3=0xfe;delay(1);

      }

       

       

      /*判別鬧時到否子函數*/

      void p_out()

      {

      if(o_f==1){

             if(t_hour==hour){if(t_min==min)

                    if(P3_0==0){P1_7=0;delay(1);}

                    else P1_7=1;

                                         }

                    }

      }

       

      /*主函數*/

      void main()

      {

             init_timer();                       /*定時器T0初始化*/

             while(1)                                     /*無限循環*/

             {

             if(P3_4==0)scan_key();               /*有按鍵,調用按鍵掃描子函數*/

      switch(set)                                        /*根據set鍵值散轉*/

      {

      case 0:time();break;                                   /*走時時間程序*/

      case 1:time1_adj();break;                     /*鬧時時間調整*/

      case 2:time_adj();break;                      /*走時時間調整*/

      case 3:time1_of();break;                      /*啟/停鬧時*/

      default:break;                                     /*其它退出*/

      }

             if(flag!=0x55)                             /*判斷掉電標志*/

             {for(m=0;m<100;m++)               /*點亮四個8字400mS*/

                    {

                    P1=0x80;P3=0xf7;delay(1);

                    P1=0x80;P3=0xfb;delay(1);

                    P1=0x80;P3=0xfd;delay(1);

                    P1=0x80;P3=0xfe;delay(1);

                    }

                   

                    P1=0xff;P3=0xff;delay(400); /*熄滅四個8字400mS*/

             }

             }

      }

       

       

      于老師:祝工作順利!身體安康!

      201103    上海市虹中路399號  上海忠能電子有限公司   周興華  6-23

      (此稿剛完成)
      1、 本站不保證以上觀點正確,就算是本站原創作品,本站也不保證內容正確。
      2、如果您擁有本文版權,并且不想在本站轉載,請書面通知本站立即刪除并且向您公開道歉! 以上可能是本站收集或者轉載的文章,本站可能沒有文章中的元件或產品,如果您需要類似的商品請 點這里查看商品列表!
      本站協議。 版權信息。 關于我們。 本站地圖。 營業執照。 發票說明。 付款方式。 聯系方式
      深圳市寶安區西鄉五壹電子商行——粵ICP備16073394號-1;地址:深圳西鄉河西四坊183號;郵編:518102
      E-mail:51dz$163.com($改為@);Tel:(0755)27947428
      工作時間:9:30-12:00和13:30-17:30和18:30-20:30,無人接聽時可以再打手機13537585389
      91嫩草黄片动漫版,91色色天堂网,91小伙大屁股熟女高潮系列,97年轻水嫩的漂亮大学美女