【学习笔记】单片机的40个经典实验之20:数字钟﹝★﹞

  一、实验任务

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

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

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

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

  二、电路原理图


  图 4.20.1

  三、系统板上硬件连线

  (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 端口上;

  四、相关基本知识

  (1. 动态数码显示的方法

  (2. 独立式按键识别过程

  (3. “时”,“分”,“秒”数据送出显示处理方法

  五、程序框图

  六、汇编源程序

  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

  七、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

  unsigned

  unsigned

  unsigned

  unsigned

  char second;

  char minite;

  char hour;

  int tcnt;

  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;

  }

  }

阅读本文用了:

秒,转发只需1秒

转载是一种智慧分享是一种美德❀

(0)

相关推荐