查看: 2448|回复: 0

单片机实现数字钟

[复制链接]

该用户从未签到

发表于 2007-8-7 11:31:56 | 显示全部楼层 |阅读模式
分享到:
1.实验任务 

(1.开机时,显示12:00:00的时间开始计时;

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

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

(4.P0.2/AD2控制“时”的调整,每按一次加1个小时; 

2.电路原理图




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. 相关基本知识 

(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  

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; 

    } 

}
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /2 下一条



手机版|小黑屋|与非网

GMT+8, 2024-12-25 12:47 , Processed in 0.118154 second(s), 15 queries , MemCache On.

ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

苏公网安备 32059002001037号

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.