• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    數字鐘

    作者: 時間:2011-02-27 來源:網絡 收藏

    1.實驗任務

    (1. 開機時,顯示120000的時間開始計時;

    (2. P0.0/AD0控制“秒”的調整,每按一次加1秒;

    (3. P0.1/AD1控制“分”的調整,每按一次加1分;

    (4. P0.2/AD2控制“時”的調整,每按一次加1個小時;

    2.電路原理圖

    4.20.1

    3.系統板上硬件連線

    (1. 把“系統”區域中的P1.0P1.7端口用8芯排線連接到“動態數碼顯示”區域中的AH端口上;

    (2. 把“系統:區域中的P3.0P3.7端口用8芯排線連接到“動態數碼顯示”區域中的S1S8端口上;

    (3. 把“系統”區域中的P0.0/AD0P0.1/AD1P0.2/AD2端口分別用導線連接到“獨立式鍵盤”區域中的SP3SP2SP1端口上;

    4.相關基本知識

    (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

    DIV 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

    DIV 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

    DIV 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語言源程序

    #include AT89X51.H>

    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%10;

    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%10;

    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%10;

    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%10;

    dispbuf[1]=second/10;

    dispbuf[3]=minite%10;

    dispbuf[4]=minite/10;

    dispbuf[6]=hour%10;

    dispbuf[7]=hour/10;

    }

    }



    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 冀州市| 嵩明县| 海兴县| 自贡市| 颍上县| 武陟县| 沁阳市| 格尔木市| 宁河县| 定兴县| 普兰店市| 中阳县| 新营市| 谷城县| 长治市| 屯门区| 湘阴县| 昌都县| 镇平县| 潼关县| 扬中市| 谢通门县| 郑州市| 汝南县| 高碑店市| 济南市| 卢龙县| 理塘县| 桦川县| 县级市| 临武县| 莱州市| 当阳市| 哈巴河县| 广安市| 绥德县| 于都县| 什邡市| 集安市| 榆中县| 涿鹿县|