求基于51单片机P01,P2 LED接数码管,用三极管驱动的电子时钟程序,大神求救啊!

如题所述

  程序名称:51单片机数码管电子钟汇编程序
  简要说明:实现24小时制电子钟,8位数码管显示,显示时分秒
  显示格式:23-59-59(小时十位如果为0则不显示)
  P0口输出段选信号,P2口输出位选信号
  P1.0为调时按钮,P1.1为调分按钮;晶振12M
  编 写:JiangX.net
  **********************************************/
  ORG 0000H ;程序入口地址
  LJMP START
  ORG 000BH ;定时器0中断入口地址
  LJMP TIMER_0
  K1 BIT P1.0 ;定义调时按键
  K2 BIT P1.1 ;定义调分按键
  START:
  MOV TMOD,#01H ;定时器0,工作模式1
  MOV TH0,#03CH
  MOV TL0,#0B0H ;赋初值,定时50ms
  SETB EA ;开中断总开关
  SETB TR0 ;开启定时器0
  SETB ET0 ;定时器0中断允许位
  MOV R6,#0 ;用于控制走时的基准时钟源,计中断次数
  MOV R5,#0 ;R5用于控制扫描按键的时间间隔

  MOV 20H,#0 ;秒个位寄存器清零
  MOV 21H,#0 ;秒十位寄存器清零
  MOV 22H,#0 ;分个位寄存器清零
  MOV 23H,#0 ;分十位寄存器清零
  MOV 24H,#0 ;时个位寄存器清零
  MOV 25H,#0 ;时十位寄存器清零
  LJMP DISPLAY
  TIMER_0:
  CLR EA
  INC R6
  INC R5

  MOV TH0,#03CH
  MOV TL0,#0B0H ;重新赋初值,定时50ms
  SETB EA
  RETI
  ADD_TIME:
  CJNE R6,#20,EXIT ;定时器中断20次,1秒到
  MOV R6,#0
  INC 20H
  MOV A,20H
  CJNE A,#10,EXIT ;如果秒个位等于10,清零
  MOV 20H,#00H
  INC 21H
  MOV A,21H
  CJNE A,#6,EXIT ;如果秒十位等于6,清零
  MOV 21H,#00H
  INC 22H
  MIN:
  MOV A,22H
  CJNE A,#10,EXIT ;如果分个位等于10,清零
  MOV 22H,#00H
  INC 23H
  MOV A,23H
  CJNE A,#6,EXIT ;如果分十位等于6,清零
  MOV 23H,#00H
  INC 24H
  HOUR:
  MOV A,25H
  CJNE A,#2,LOOP ;如果时十位等于2,检查时个位
  MOV A,24H
  CJNE A,#4,EXIT ;如果时个位等于4,清零
  MOV 24H,#00H ;清零时个位
  MOV 25H,#00H ;清零时十位
  LJMP EXIT

  LOOP:
  MOV A,24H
  CJNE A,#10,EXIT ;如果时个位等于10,清零
  MOV 24H,#00H
  INC 25H
  LJMP EXIT
  EXIT:
  LJMP DISPLAY ;刷新完毕,跳转到显示
  DISPLAY:
  MOV DPTR,#TABLE
  MOV A,20H
  MOVC A,@A+DPTR
  MOV P0,A
  CLR P2.7
  LCALL DELAY
  SETB P2.7 ;显示秒个位
  MOV A,21H
  MOVC A,@A+DPTR
  MOV P0,A
  CLR P2.6
  LCALL DELAY
  SETB P2.6 ;显示秒十位
  MOV A,#0BFH
  MOV P0,A
  CLR P2.5
  LCALL DELAY
  SETB P2.5 ;显示“-”
  MOV A,22H
  MOVC A,@A+DPTR
  MOV P0,A
  CLR P2.4
  LCALL DELAY
  SETB P2.4 ;显示分个位
  MOV A,23H
  MOVC A,@A+DPTR
  MOV P0,A
  CLR P2.3
  LCALL DELAY
  SETB P2.3 ;显示分十位
  MOV A,#0BFH
  MOV P0,A
  CLR P2.2
  LCALL DELAY
  SETB P2.2 ;显示“-”
  MOV A,24H
  MOVC A,@A+DPTR
  MOV P0,A
  CLR P2.1
  LCALL DELAY
  SETB P2.1 ;显示时个位
  MOV DPTR,#TABLE1 ;该位使用TABLE1以消除前置0
  MOV A,25H
  MOVC A,@A+DPTR
  MOV P0,A
  CLR P2.0
  LCALL DELAY
  SETB P2.0 ;显示时十位
  CJNE R5,#4,EXIT0 ;当R5到4时,扫描按键
  MOV R5,#0
  KEY_SCAN:
  JNB K1,ADD_HOUR
  JNB K2,ADD_MIN
  LJMP ADD_TIME ;无键按下,跳至走时
  ADD_HOUR:
  INC 24H ;小时加1
  LJMP HOUR ;更新
  ADD_MIN:
  INC 22H ;分钟加1
  LJMP MIN ;更新
  EXIT0:
  LJMP ADD_TIME
  DELAY:
  MOV R7,#150 ;扫描延时
  DJNZ R7,$
  RET
  TABLE: ;数码管字形显示编码表
  DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H ;字形显示编码
  TABLE1:
  DB 0FFH,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H ;小时位的十位数编码,该位如果为0则不显示

  END ;程序结束
温馨提示:答案为网友推荐,仅供参考
相似回答