日韩床上生活一级视频|能看毛片的操逼网站|色悠悠网站在线观看视频|国产免费观看A淫色免费|国产av久久久久久久|免费A级视频美女网站黄|国产毛片av日韩小黄片|热久久免费国产视频|中文字幕无码色色|成人在线视频99久久久

機電之家資源網(wǎng)
單片機首頁|單片機基礎|單片機應用|單片機開發(fā)|單片機文案|軟件資料下載|音響制作|電路圖下載 |嵌入式開發(fā)
培訓信息
贊助商
2051的數(shù)字鐘
2051的數(shù)字鐘
 更新時間:2008-7-26 19:53:45  點擊數(shù):3
【字體: 字體顏色
電路特點
這里介紹的電子鐘,電路可稱得上極簡,它僅使用單片的20引腳單片機完成電子鐘的全部功能,而筆者見到的其它設計方案均采用二片以上的多片IC實現(xiàn)。
電路見圖1。
51clock2.jpg (35.38 KB)
2007-11-26 23:23
一片20引腳的單片機AT89C2051為電子鐘主體,其顯示數(shù)據(jù)從P1口分時輸出,P3.0~3.3則輸出對應的位選通信號。由于LED數(shù)碼管點亮時耗電較大,故使用了四只PNP型晶體管VT1~VT4進行放大。本來筆者還有一種更簡的設計方案(見圖2),可省去VT1~VT4及R1~R4八個元件,但這種設計由于テ涑隹詰墓噯氳緦饔邢蓿ㄔ?0mA),數(shù)碼管亮度較暗而不向讀者介紹,除非你采用了高亮度的發(fā)光數(shù)碼管。
51clock3.jpg (29.14 KB)
2007-11-26 23:23
P3.4、P3.5、3.7外接了三個輕觸式按鍵,這里我們分別命名為:模式設定鍵set(P3.4)、時調(diào)整鍵hour(P3.5)、分調(diào)整鍵min(P3.7)。C1、R13組成上電復位電路。VT5及蜂鳴器Bz為鬧時訊響電路。三端穩(wěn)壓器7805輸出的5V電壓供整個系統(tǒng)工作。此電子鐘可與任何9~20V/100mA的交直流電源適配器配合工作,適應性強。

電子鐘功能
1.走時:通過模式設定鍵set選擇為走時,U1、U2顯示小時,U3、U4顯示分。U2的小數(shù)點為秒點,每秒閃爍一次。
2.走時調(diào)整:通過模式設定鍵set選擇為走時調(diào)整,按下hour鍵對U1、U2的走時“時”顯示進行調(diào)整(每0.2秒遞加1)。按下min鍵對U3、U4的走時“分”顯示進行調(diào)整(每0.2秒遞加1)。
3.鬧時調(diào)整:通過模式設定鍵set選擇為鬧時調(diào)整,按下hour鍵對U1、U2的鬧時“時”顯示進行調(diào)整(每0.2秒遞加1)。按下min鍵對U3、U4的鬧時“分”顯示進行調(diào)整(每0.2秒遞加1)。
4.鬧時啟/停設定:通過模式設定鍵set選擇為鬧時啟/停設定,按下min鍵U3的小數(shù)點點亮,鬧時功能啟動;按下hour鍵U3的小數(shù)點熄滅,鬧時功能關停。
由于電路設計得極其簡單,因此豐富的功能只能由軟件完成,這里軟件設計成為了關鍵。下面介紹軟件設計要點。
圖3為主程序狀態(tài)流程。
51clock1.gif (9.63 KB)
2007-11-26 23:23
運行時建立的主要狀態(tài)標志如下:
flag—掉電標志。掉電后,flag內(nèi)為一隨機數(shù);重新設定時間后flag內(nèi)寫入標志數(shù)55H。
set—工作模式設定標志。
hour—走時“時”單元。
min—走時“分”單元。
sec—走時“秒”單元。
deda—走時5mS計數(shù)單元
t_hour—鬧時“時”單元。
t_min—鬧時“分”單元。
d_05s—0.5秒位標志。每秒鐘的前0.5秒置1,后0.5秒置0,以使秒點閃爍。
o_f—鬧時啟/停位標志。鬧時啟動置1,鬧時關停置0。
另外將定時器T0設定為5mS的定時中斷。這里晶振頻率為12MHz,因此5mS的初值為-5000,但實際上程序還要作其它運算,使得時間偏長,經(jīng)調(diào)整為-4800后試驗剛好。計時單元deda每次中斷均加1。走時函數(shù)判斷deda>=200時即令秒單元sec加1。同理秒單元sec滿60后令分單元min加1。分單元min滿60后令時單元hour加1。時單元hour滿24后清0。
上電后,首先進行初始化,對各狀態(tài)標志、輸入輸出口及定時器T0進行初始化工作,以適應后面程序的要求。
隨后程序判斷有無set鍵按下,如按下,則set鍵值從0起加1。set鍵值只能從0加到3,然后又回到0。
接下來,根據(jù)鍵值進行散轉。若set=0,運行走時程序;若set=1,進入調(diào)整鬧時時間程序;若set=2,進入調(diào)整走時時間程序;若set=3,顯示已調(diào)好的鬧時時間,同時進入啟/停鬧時程序。
散轉完后,進行判斷掉電標志flag是否等于55H。若不等,說明剛開機上電或運行過程中掉過電,這時四個數(shù)碼管以1Hz的頻率閃爍四個8字,提示時間不準;若相等,說明未掉電,RAM區(qū)內(nèi)容未變化,時間準確。
再下來程序又轉回到初始化之后進行循環(huán)運行。
由于使用了四只數(shù)碼管密集排列,因此只能采用雙面印刷板設計,圖4、5分別為正面(元件面)、反面的印板圖。尺寸3000milx4000mil(7.62cmx10.16cm)。圖6為計算機輸出的三維仿真印制板。
51clock1.jpg (30.54 KB)
2007-11-26 23:23 51clock2.gif (8.77 KB)
2007-11-26 23:23 51clock3.gif (10.27 KB)
2007-11-26 23:23

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

使用方法
上電后,四個LED數(shù)碼管閃爍四個8字。
按一下set鍵,閃爍現(xiàn)象消失(此時set=1),U1的小數(shù)點亮,說明此刻可以調(diào)整鬧時時間。按下hour鍵,U1、U2作加法;按下min鍵,U3、U4作加法。這些調(diào)整好的數(shù)據(jù)被同時送入RAM區(qū)的鬧時記憶“時”單元t_hour和鬧時記憶“分”單元t_min。
再按一下set鍵,set=2,U2的小數(shù)點亮,此刻可以調(diào)整走時時間。按下hour鍵,U1、U2作加法;按下min鍵,U3、U4作加法。這些調(diào)整好的數(shù)據(jù)也被同步送入RAM區(qū)的“時”記憶單元hour和“分”記憶單元min。
再按一下set鍵,set=3,顯示剛才調(diào)整的鬧時時間,此刻可以選擇啟動/關停鬧時。按下min鍵,o_f位標志置1,U3的小數(shù)點亮,鬧時啟動;按下hour鍵,o_f位標志置0,U3的小數(shù)點滅,鬧時關閉。
若再按一下set鍵,set=0,電路進入走時狀態(tài),U1、U2顯示小時,U3、U4顯示分。U2的小數(shù)點作秒點閃爍。
在鬧時啟動的情況下,走時到達設定鬧時,則蜂鳴器Bz鳴響一分鐘進行提醒。
附:用C51編寫的源程序清單(已由實驗板運行通過)
;***這個程序是C的,我看不懂*** 復制內(nèi)容到剪貼板
代碼:
#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的數(shù)碼管段碼*/
uchar hour=0,min=0,sec=0;                /*時、分、秒單元清零*/
uchar deda=0;                                  /*5mS計數(shù)單元清零*/
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);                              /*延時子函數(shù)*/
void conv();                                       /*走時單元轉換*/
void p_out();                                      /*判別鬧時到否子函數(shù)*/
void dirve();                                       /*走時時間輸出驅動子函數(shù)*/
void t_dirve();                                    /*鬧時時間輸出驅動子函數(shù)*/
/*鬧時啟/停子函數(shù)*/
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);
              }
}

/*走時函數(shù)*/
void time()
{
conv();                                              /*走時單元轉換*/
dirve();                                              /*走時時間輸出驅動子函數(shù)*/
p_out();                                             /*判別鬧時到否子函數(shù)*/
}
/*定時器T0  5mS初始化*/
void init_timer()
{
TMOD=0x01;
TH0=-(4800/256);
TL0=-(4800%256);
IE=0x82;
TR0=1;
}

/*掃描按鍵子函數(shù)*/
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;                      /*按鍵未釋放,在此等候*/
}

/*延時子函數(shù)*/
void delay(uint k)
{
uint i,j;
for(i=0;i<K;I++){< DIV>
for(j=0;j<121;j++)
{;}}
}

/*5mS定時中斷服務子函數(shù)*/
void zd(void) interrupt 1
{
TH0=-(4800/256);
TL0=-(4800%256);
deda++;
}

/*調(diào)整走時時間*/
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);
              }
}

/*調(diào)整鬧時時間*/
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;}
}

/*走時時間輸出驅動子函數(shù)*/
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);
}

/*鬧時時間輸出驅動子函數(shù)*/
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);
}

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

/*主函數(shù)*/
void main()
{
       init_timer();                       /*定時器T0初始化*/
       while(1)                                     /*無限循環(huán)*/
       {
       if(P3_4==0)scan_key();               /*有按鍵,調(diào)用按鍵掃描子函數(shù)*/
switch(set)                                        /*根據(jù)set鍵值散轉*/
{
case 0:time();break;                                   /*走時時間程序*/
case 1:time1_adj();break;                     /*鬧時時間調(diào)整*/
case 2:time_adj();break;                      /*走時時間調(diào)整*/
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*/
       }
       }
}
  • 上一篇: 第一課:初識單片機
  • 下一篇: 8X8 LED點陣顯示原理與編程技術
  • 發(fā)表評論   告訴好友   打印此文  收藏此頁  關閉窗口  返回頂部
    熱點文章
     
    推薦文章
     
    相關文章
    網(wǎng)友評論:(只顯示最新5條。)
    關于我們 | 聯(lián)系我們 | 廣告合作 | 付款方式 | 使用幫助 | 機電之家 | 會員助手 | 免費鏈接

    點擊這里給我發(fā)消息66821730(技術支持)點擊這里給我發(fā)消息66821730(廣告投放) 點擊這里給我發(fā)消息41031197(編輯) 點擊這里給我發(fā)消息58733127(審核)
    本站提供的機電設備,機電供求等信息由機電企業(yè)自行提供,該企業(yè)負責信息內(nèi)容的真實性、準確性和合法性。
    機電之家對此不承擔任何保證責任,有侵犯您利益的地方請聯(lián)系機電之家,機電之家將及時作出處理。
    Copyright 2007 機電之家 Inc All Rights Reserved.機電之家-由機電一體化網(wǎng)更名-聲明
    電話:0571-87774297 傳真:0571-87774298
    杭州濱興科技有限公司提供技術支持

    主辦:杭州市高新區(qū)(濱江)機電一體化學會
    中國行業(yè)電子商務100強網(wǎng)站

    網(wǎng)站經(jīng)營許可證:浙B2-20080178-1