×
单片机 > 单片机程序设计 > 详情

20. 数字钟﹝★﹞

发布时间:2020-06-08 发布时间:
|
1. 实验任务 
(1.       开机时,显示12:00:00的时间开始计时;
(2.       P0.0/AD0控制“秒”的调整,每按一次加1秒; 
(3.       P0.1/AD1控制“分”的调整,每按一次加1分; 
(4.       P0.2/AD2控制“时”的调整,每按一次加1个小时; 
2. 电路原理图 

图4.20.1
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; 
    } 
}  
关键字:数字钟  单片机系统

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
8051单片机的函数发生器的设计