数字钟﹝★﹞

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;

    }

}  

 
8051单片机数字钟(完整)(包括原理图,c语言源代码) 键盘8为显示功能键: 按第一次——显示时间 按第二次——显示日期 按第三次——显示星期 键盘0为调节功能键: 按第一次-----1,2两位闪烁 按第二次-----4,5两位闪烁 按第三次-----7,8两位闪烁 键盘1为增加键: 1,2两位闪烁,按一下加1 4,5两位闪烁,按一下加1 7,8两位闪烁,按一下加1 键盘2为减少键: 1,2两位闪烁,按一下减1 4,5两位闪烁,按一下减1 7,8两位闪烁,按一下减1 上电初始数码管显示00-00-00 按第一次键盘8——显示时间 显示模式为:-分-秒 在显示时间按键盘0调节功能键: 按第一次-----秒的两位闪烁 按第二次-----分的两位闪烁 按第三次-----的两位闪烁 按第四次-----秒,分,均不闪烁,时间正常显示 当秒的两位闪烁按键盘1一下秒加1,按键盘2一下秒减1 当分的两位闪烁按键盘1一下分加1,按键盘2一下分减1 当的两位闪烁按键盘1一下加1,按键盘2一下减1 按第二次键盘8——显示日期 显示模式为:年-月-日 在显示日期的按键盘0调节功能键: 按第一次-----日的两位闪烁 按第二次-----月的两位闪烁 按第三次-----年的两位闪烁 按第四次-----年,月,日均不闪烁,日期正常显示 当日的两位闪烁按键盘1一下日加1,按键盘2一下日减1 当月的两位闪烁按键盘1一下月加1,按键盘2一下月减1 当年的两位闪烁按键盘1一下年加1,按键盘2一下年减1 按第三次键盘8——显示星期 显示模式为:最后一位显示1—7 在显示日期的按键盘0调节功能键: 按第一次-----星期闪烁 按第二次-----星期正常显示 当星期闪烁按键盘1一下星期加1,按键盘2一下星期加减1 按第四次键盘8返回显示时间
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值