18luck网站

18luck网站電子設計 | 18luck网站Rss 2.0 會員中心 會員注冊
搜索: 您現在的位置: 18luck网站 >> 18luck平台 >> 單片機 >> 正文

用單片機AT89C51設計的數字鍾,AT89C51 Digital Clock

作者:佚名    文章來源:本站原創    點擊數:    更新時間:2018-02-22

用單片機AT89C51設計的數字鍾,AT89C51 Digital Clock

關(guan) 鍵字:AT89C51,電子鍾電路圖,51單片機

1.實驗任務
(1).開機時,顯示12:00:00的時間開始計時;
(2).P0.0/AD0控製“秒”的調整,每按一次加1秒;
(3).P0.1/AD1控製“分”的調整,每按一次加1分;
(4).P0.2/AD2控製“時”的調整,每按一次加1個(ge) 小時;
2.電路原理圖



用單片機AT89C51設計的數字鍾,AT89C51 Digital Clock       


3.係統板上硬件連線
(1).把“單片機係統”區域中的P1.0-P1.7端口用8芯排線連接到“動態數碼顯示”區域中的A-H端口上;
(2).把“單片機係統:區域中的P3.0-P3.7端口用8芯排線連接到“動態數碼顯示”區域中的S1-S8端口上;
(3).把“單片機係統”區域中的P0.0/AD0、P0.1/AD1、P0.2/AD2端口分別用導線連接到“獨立式鍵盤”區域中的SP3、SP2、SP1端口上;
4.相關(guan) 基本知識
(1).動態數碼顯示的方法
(2).獨立式按鍵識別過程
(3).“時”,“分”,“秒”數據送出顯示處理方法
5.程序框圖
6.匯編源程序
SECOND          EQU 30H
MINITE                    EQU 31H
HOUR            EQU 32H
HOURK          BIT P0.0
MINITEK        BIT P0.1
SECONDK        BIT P0.2
DISPBUF            EQU 40H
DISPBIT            EQU 48H
T2SCNTA            EQU 49H
T2SCNTB            EQU 4AH
TEMP              EQU 4BH
 
        ORG 00H
        LJMP START
        ORG 0BH
        LJMP INT_T0
START:  MOV SECOND,#00H
        MOV MINITE,#00H
        MOV HOUR,#12
        MOV DISPBIT,#00H
        MOV T2SCNTA,#00H
        MOV T2SCNTB,#00H
        MOV TEMP,#0FEH
        LCALL DISP
        MOV TMOD,#01H
        MOV TH0,#(65536-2000) / 256
        MOV TL0,#(65536-2000) MOD 256
        SETB TR0
        SETB ET0
        SETB EA
WT:    JB SECONDK,NK1
        LCALL DELY10MS
        JB SECONDK,NK1
        INC SECOND
        MOV A,SECOND
        CJNE A,#60,NS60
        MOV SECOND,#00H
NS60:  LCALL DISP
        JNB SECONDK,$
NK1:    JB MINITEK,NK2
        LCALL DELY10MS
        JB MINITEK,NK2
        INC MINITE
        MOV A,MINITE
        CJNE A,#60,NM60
        MOV MINITE,#00H
NM60:  LCALL DISP
        JNB MINITEK,$
NK2:    JB HOURK,NK3
        LCALL DELY10MS
        JB HOURK,NK3
        INC HOUR
        MOV A,HOUR
        CJNE A,#24,NH24
        MOV HOUR,#00H
NH24:  LCALL DISP
        JNB HOURK,$
NK3:    LJMP WT
DELY10MS:
        MOV R6,#10
D1:    MOV R7,#248
        DJNZ R7,$
        DJNZ R6,D1
        RET
DISP: 
        MOV A,#DISPBUF
        ADD A,#8
        DEC A
        MOV R1,A
        MOV A,HOUR
        MOV B,#10
        p AB
        MOV @R1,A
        DEC R1
        MOV A,B
        MOV @R1,A
        DEC R1
        MOV A,#10
        MOV @R1,A
        DEC R1
        MOV A,MINITE
        MOV B,#10
        p AB
        MOV @R1,A
        DEC R1
        MOV A,B
        MOV @R1,A
        DEC R1
        MOV A,#10
        MOV @R1,A
        DEC R1
        MOV A,SECOND
        MOV B,#10
        p AB
        MOV @R1,A
        DEC R1
        MOV A,B
        MOV @R1,A
        DEC R1
        RET
INT_T0:
        MOV TH0,#(65536-2000) / 256
        MOV TL0,#(65536-2000) MOD 256
        MOV A,#DISPBUF
        ADD A,DISPBIT
        MOV R0,A
        MOV A,@R0
        MOV DPTR,#TABLE
        MOVC A,@A+DPTR
        MOV P1,A
        MOV A,DISPBIT
        MOV DPTR,#TAB
        MOVC A,@A+DPTR
        MOV P3,A
        INC DISPBIT
        MOV A,DISPBIT
        CJNE A,#08H,KNA
        MOV DISPBIT,#00H
KNA:    INC T2SCNTA
        MOV A,T2SCNTA
        CJNE A,#100,DONE
        MOV T2SCNTA,#00H
        INC T2SCNTB
        MOV A,T2SCNTB
        CJNE A,#05H,DONE
        MOV T2SCNTB,#00H
        INC SECOND
        MOV A,SECOND
        CJNE A,#60,NEXT
        MOV SECOND,#00H
        INC MINITE
        MOV A,MINITE
        CJNE A,#60,NEXT
        MOV MINITE,#00H
        INC HOUR
        MOV A,HOUR
        CJNE A,#24,NEXT
        MOV HOUR,#00H
NEXT:  LCALL DISP
DONE:  RETI
TABLE:  DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,40H
TAB:    DB 0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,07FH
        END

程序:7.C語言源程序

7.C語言源程序
#include
unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,
                              0x66,0x6d,0x7d,0x07,
                              0x7f,0x6f,0x77,0x7c,
                              0x39,0x5e,0x79,0x71,0x00};
unsigned char dispbitcode[]={0xfe,0xfd,0xfb,0xf7,
                            0xef,0xdf,0xbf,0x7f};
unsigned char dispbuf[8]={0,0,16,0,0,16,0,0};
unsigned char dispbitcnt;
unsigned char second;
unsigned char minite;
unsigned char hour;
unsigned int tcnt;
unsigned char mstcnt;
unsigned char i,j;
void main(void)
{
  TMOD=0x02;
  TH0=0x06;
  TL0=0x06;
  TR0=1;
  ET0=1;
  EA=1;
  while(1)
    {
      if(P0_0==0)
        {
          for(i=5;i>0;i--)
          for(j=248;j>0;j--);
          if(P0_0==0)
            {
              second++;
              if(second==60)
                {
                  second=0;
                }
              dispbuf[0]=second;
              dispbuf[1]=second/10;
              while(P0_0==0);
            }
        }
      if(P0_1==0)
        {
          for(i=5;i>0;i--)
          for(j=248;j>0;j--);
          if(P0_1==0)
            {
              minite++;
              if(minite==60)
                {
                  minite=0;
                }
              dispbuf[3]=minite;
              dispbuf[4]=minite/10;
              while(P0_1==0);
            }
        }
      if(P0_2==0)
        {
          for(i=5;i>0;i--)
          for(j=248;j>0;j--);
          if(P0_2==0)
            {
              hour++;
              if(hour==24)
                {
                  hour=0;
                }
              dispbuf[6]=hour;
              dispbuf[7]=hour/10;
              while(P0_2==0);
            }
        }
    }
}
void t0(void) interrupt 1 using 0
{
  mstcnt++;
  if(mstcnt==8)
    {
      mstcnt=0;
      P1=dispcode[dispbuf[dispbitcnt]];
      P3=dispbitcode[dispbitcnt];
      dispbitcnt++;
      if(dispbitcnt==8)
        {
          dispbitcnt=0;
        }
    }
  tcnt++;
  if(tcnt==4000)
    {
      tcnt=0;
      second++;
      if(second==60)
        {
          second=0;
          minite++;
          if(minite==60)
            {
              minite=0;
              hour++;
              if(hour==24)
                {
                  hour=0;
                }
            }
        }
      dispbuf[0]=second;
      dispbuf[1]=second/10;
      dispbuf[3]=minite;
      dispbuf[4]=minite/10;
      dispbuf[6]=hour;
      dispbuf[7]=hour/10;
    }
}

 

Tags:單片機,數字時鍾,c語言程序  
責任編輯:admin
  • 上一篇文章:
  • 下一篇文章: 沒有了
  • 請文明參與討論,禁止漫罵攻擊,不要惡意評論、違禁詞語。 昵稱:
    1分 2分 3分 4分 5分

    還可以輸入 200 個字
    [ 查看全部 ] 網友評論
    關於我們 - 聯係我們 - 廣告服務 - 友情鏈接 - 網站地圖 - 版權聲明 - 在線幫助 - 文章列表
    返回頂部
    刷新頁麵
    下到頁底
    晶體管查詢