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

AT89C52闹钟程序

发布时间:2020-06-19 发布时间:
|

;*********************************************************************************************; 
;以下程序能用于24小时计时,能作为秒表使用,能定时闹铃1分钟(也可关). 
;使用方法:开机后在00:00:00起开始计时,(1)长按P1.0进入调分状态:分单元闪烁 
;按P1.0加1,按P1.1减1.再长按P1.0进入时调整状态,时单元闪烁,加减调整同调分.

;按长按退出调整状态.  (2)按下P1.1进入秒表状态:按P1.2暂停,再按P1.2秒表清零,再按 
;P1.2秒表又启动,按P1.1退出秒表回到时钟状态. (3)按P1.3进入设定闹时状态: 00:00: -,可进 
;行分设定,按P1.2分加1,再按P1.3为时调整,00:00:- ,按P1.2时加1,按P1.1闹铃有效,显示为00:00:-0,再按 
;P1.1闹铃无效(显示00:00:- ,),按P1.3调闹钟结束.在闹铃时可按P1.3停闹,不按闹铃1分钟. 
;定时器T0、T1溢出周期为50MS,T0为秒计数用, T1为调整时闪烁及秒表定时用, 
;P1.0、P1.1、P1.2、P1.3为调整按钮,P0口为字符输出口,P2为扫描口,P1.7为蜂呜器口,采用共阳显示管。 
;50H-55H为闹钟定时单元,60H-65H为秒表计时单元,70H-75H为显示时间单元,76H-79H为分时计时单元。 
;03H标志=0时钟闪烁,=1秒表,    05H=0,不闹铃,=1要闹铃.    07H每秒改变一次,用作间隔呜叫. 
;***********************************************************************************************; 
           DISPFIRST  EQU  30H     ;显示首址存放单元 
           BELL       EQU  P1.7    ;小喇叭 
           CONBS      EQU  2FH     ;存放报时次数 

;**************************************** 
;;           中断入口程序              ;; 
;**************************************** 

              ORG 0000H        ;程序执行开始地址 
              LJMP      START  ;跳到标号START执行 
              ORG 0003H        ;外中断0中断程序入口 
              RETI             ;外中断0中断返回 
              ORG 000BH        ;定时器T0中断程序入口 
          LJMP      INTT0  ;跳至INTTO执行 
              ORG 0013H        ;外中断1中断程序入口 
          RETI             ;外中断1中断返回 
          ORG 001BH        ;定时器T1中断程序入口 
          LJMP      INTT1  ;跳至INTT1执行 
          ORG 0023H        ;串行中断程序入口地址 
              RETI             ;串行中断程序返回 

;**************************************** 
;;          以下程序开始                 ;; 
;**************************************** 
;整点报时用 
QQQQ             : MOV  A,#10H 
                   MOV  B,79H 
                   MUL  AB 
                   ADD  A,78H 
                   MOV  CONBS,A 
           BSLOOP: LCALL DS20MS 
                   LCALL DL1S 
                   LCALL DL1S 
                   LCALL DL1S 
                   DJNZ CONBS,BSLOOP 
                   CLR   08H          ;清整点报时标志 
                   AJMP  START1 

;**************************************** 
;;          主程序开始                 ;; 
;**************************************** 

            START: LCALL ST             ;上电显示年月日及班级学号 
                   MOV   R0,#00H          ;清00H-7FH内存单元 
                   MOV   R7,#80H          ; 
       CLEARDISP:  MOV   @R0,#00H          ; 
                   INC   R0             ; 
                   DJNZ  R7,CLEARDISP   ; 
                   MOV   20H,#00H         ;清20H(标志用) 
                   MOV   7AH,#0AH       ;放入"熄灭符"数据 
                   MOV      TMOD,#11H      ;设T0、T1为16位定时器 
                   MOV   TL0,#0B0H       ;50MS定时初值(T0计时用) 
                   MOV   TH0,#3CH       ;50MS定时初值 
                   MOV   TL1,#0B0H       ;50MS定时初值(T1闪烁定时用) 
                   MOV   TH1,#3CH        ;50MS定时初值 
                   SETB  EA             ;总中断开放 
                   SETB  ET0            ;允许T0中断 
                   SETB  TR0            ;开启T0定时器 
                   MOV   R4,#14H        ;1秒定时用计数值(50MS×20) 
                   MOV   DISPFIRST,#70H ;显示单元为70-75H 
;以下主程序循环 
           START1: LCALL DISPLAY        ;调用显示子程序 
                   JNB      P1.0,SETMM1    ;P1.0口为0时转时间调整程序 
                   JNB   P1.1,FUNSS     ;秒表功能,P1.1按键调时时作减1加能 
                   JNB   P1.2,FUNPT     ;秒表STOP,PUSE,CLR 
                   JNB   P1.3,TSFUN     ;定时闹铃设定 
                   JB   08H,  QQQQ 
                   AJMP  START1         ;P1.0口为1时跳回START1 

          FUNPT:  LJMP  FUNPTT 
;以下闹铃时间设定程序,按P1.3进入设定 
            TSFUN: LCALL DS20MS 
                   JB    P1.3,START1     ; 
         WAIT113:  JNB   P1.3,WAIT113    ;等待键释放 
                   JB   05H,CLOSESP      ;闹铃已开的话,关闹铃 
                   MOV   DISPFIRST,#50H  ;进入闹铃设定程序,显示50-55H闹钟定时单元 
                   MOV   50H,#0CH        ;"-"   闹铃设定时显示格式00:00: - 
                   MOV   51H,#0AH        ;"黑" 

         DSWAIT:   SETB   EA 
                   LCALL DISPLAY 
                   JNB  P1.2,DSFINC       ;分加1 
                   JNB  P1.0,DSDEC        ;分减1 
                   JNB  P1.3,DSSFU        ;进入时调整 
                   AJMP DSWAIT 

          CLOSESP: CLR  05H              ;关闹铃标志 
                   CLR  BELL 
                   AJMP  START1 
           DSSFU:  LCALL DS20MS         ;消抖 
                   JB  P1.3, DSWAIT 
                   LJMP  DSSFUNN         ;进入时调整 

           SETMM1:      LJMP SETMM     ;转到时间调整程序SETMM 

        DSFINC :   LCALL DS20MS         ;消抖 
                   JB  P1.2, DSWAIT 
        DSWAIT12: LCALL DISPLAY         ;等键 释放 
                  JNB   P1.2, DSWAIT12 
                  CLR   EA 
                  MOV   R0,#53H            ; 
                  LCALL ADD1               ;闹铃设定分加1 
                  MOV      A,R3              ;分数据放入A 

                  CLR   C                 ;清进位标志 
                  CJNE  A,#60H,ADDHH22      ; 
            ADDHH22: JC     DSWAIT             ;小于60分时返回 
                   ACALL CLR0              ;大于或等于60分时分计时单元清0 
                   AJMP  DSWAIT 
         DSDEC :   LCALL DS20MS         ;消抖 
                   JB  P1.0, DSWAIT 
        DSWAITEE: LCALL DISPLAY         ;等键 释放 
                  JNB   P1.0, DSWAITEE 
                  CLR   EA 
                  MOV   R0,#53H            ; 
                  LCALL sub1               ;闹铃设定分减1 
                  LJMP DSWAIT 

;以下秒表功能/时钟转换程序 
;按下P1.1 可进行功能转换 
            FUNSS: LCALL DS20MS 
                   JB    P1.1,START11 
         WAIT11:   JNB   P1.1,WAIT11 
                   CPL   03H 
                   JNB   03H,TIMFUN 
                   MOV   DISPFIRST,#60H  ;显示秒表数据单元 
                   MOV   60H,#00H 
                   MOV   61H,#00H 
                   MOV   62H,#00H 
                   MOV   63H,#00H 
                   MOV   64H,#00H 
                   MOV   65H,#00H 
                   MOV   TL1,#0F0H       ;10MS定时初值() 
                   MOV   TH1,#0D8H        ;10MS定时初值 
                   SETB  TR1 
                   SETB  ET1 
         START11:  LJMP  START1 
            TIMFUN:MOV   DISPFIRST,#70H  ;显示时钟数据单元 
                   CLR   ET1 
                   CLR   TR1 
       START12:    LJMP  START1 
;以下秒表暂停清零功能程序 
;按下P1.2暂停或清0,按下P1.1退出秒表回到时钟计时 
            FUNPTT: LCALL DS20MS 
                   JB    P1.2,START12 
         WAIT22:   JNB   P1.2,WAIT21 
                   CLR   ET1 
                   CLR   TR1 
         WAIT33:   JNB  P1.1,FUNSS 
                   JB   P1.2,WAIT31 
                   LCALL DS20MS 
                   JB    P1.2,WAIT33 
        WAIT66:    JNB   P1.2,WAIT61 
                   MOV   60H,#00H 
                   MOV   61H,#00H 
                   MOV   62H,#00H 
                   MOV   63H,#00H 
                   MOV   64H,#00H 
                   MOV   65H,#00H 
       WAIT44:     JNB  P1.1,FUNSS 
                   JB   P1.2,WAIT41 
                   LCALL DS20MS 
                   JB    P1.2,WAIT44 
       WAIT55:     JNB   P1.2,WAIT51 
                   SETB  ET1 
                   SETB  TR1 
                   AJMP  START1 
;以下键等待释放时显示不会熄灭用 
    WAIT21:        LCALL DISPLAY 
                   AJMP  WAIT22 
    WAIT31:        LCALL DISPLAY 
                   AJMP  WAIT33 
    WAIT41:        LCALL DISPLAY 
                   AJMP  WAIT44 
    WAIT51:        LCALL DISPLAY 
                   AJMP  WAIT55 
    WAIT61:        LCALL DISPLAY 
                   AJMP  WAIT66 


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
;;           1秒计时程序              ;; 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
;T0中断服务程序 
            INTT0: PUSH  ACC           ;累加器入栈保护 
                   PUSH  PSW           ;状态字入栈保护 
                   CLR   ET0           ;关T0中断允许 
                   CLR   TR0           ;关闭定时器T0 
                   MOV   A,#0B7H       ;中断响应时间同步修正 
                   ADD   A,TL0         ;低8位初值修正 
                   MOV   TL0,A         ;重装初值(低8位修正值) 
                   MOV   A,#3CH        ;高8位初值修正 
                   ADDC  A,TH0         ; 
                   MOV   TH0,A         ;重装初值(高8位修正值) 
                   SETB  TR0           ;开启定时器T0 
                   DJNZ  R4, OUTT0         ;20次中断未到中断退出 
           ADDSS:  MOV     R4,#14H           ;20次中断到(1秒)重赋初值 

                   CPL   07H               ;闹铃时间隔呜叫用 
                   MOV      R0,#71H           ;指向秒计时单元(71H-72H) 
                   ACALL ADD1              ;调用加1程序(加1秒操作) 
                   MOV   A,R3              ;秒数据放入A(R3为2位十进制数组合) 
                   CLR     C                 ;清进位标志 
                   CJNE  A,#60H,ADDMM      ; 
           ADDMM:  JC       OUTT0             ;小于60秒时中断退出 
                   ACALL CLR0              ;大于或等于60秒时对秒计时单元清0 
                   MOV     R0,#77H           ;指向分计时单元(76H-77H) 
                   ACALL ADD1              ;分计时单元加1分钟 
                   MOV      A,R3              ;分数据放入A 
                   CLR   C                 ;清进位标志 
                   CJNE  A,#60H,ADDHH      ; 
            ADDHH: JC     OUTT0             ;小于60分时中断退出 
                   ACALL CLR0              ;大于或等于60分时分计时单元清0 
                   LCALL DS20MS             ;正点报时 
                   SETB  08H 
                   MOV     R0,#79H           ;指向小时计时单元(78H-79H) 
                   ACALL ADD1              ;小时计时单元加1小时 
                   MOV   A,R3              ;时数据放入A 
                   CLR   C                 ;清进位标志 
                   CJNE  A,#24H,HOUR       ; 
             HOUR: JC    OUTT0             ;小于24小时中断退出 
                   ACALL CLR0              ;大于或等于24小时小时计时单元清0 
            OUTT0: MOV   72H,76H           ;中断退出时将分、时计时单元数据移 
                   MOV   73H,77H           ;入对应显示单元 
                   MOV   74H,78H           ; 
                   MOV   75H,79H           ; 
                   LCALL  BAOJ 
                   POP      PSW               ;恢复状态字(出栈) 
                   POP   ACC               ;恢复累加器 
                   SETB  ET0               ;开放T0中断 
                   RETI                    ;中断返回 

;**************************************** 
;;    闪动调时程序秒表功能程序        ;; 
;**************************************** 
;T1中断服务程序,用作时间调整时调整单元闪烁指示或秒表计时 
INTT1:          PUSH    ACC                ;中断现场保护 
                PUSH    PSW                ; 
                JB      03H, MMFUN         ;=1时秒表 
                MOV     TL1,   #0B0H       ;装定时器T1定时初值 
                MOV     TH1,   #3CH           ; 
                DJNZ    R2,INTT1OUT           ;0.3秒未到退出中断(50MS中断6次) 
                MOV     R2,#06H               ;重装0.3秒定时用初值 
                CPL     02H                   ;0.3秒定时到对闪烁标志取反 
                JB      02H,FLASH1            ;02H位为1时显示单元"熄灭" 
                MOV     72H,76H       ;02H位为0时正常显示 
                MOV     73H,77H       ; 
                MOV     74H,78H       ; 
                MOV     75H,79H       ; 
INTT1OUT:       POP     PSW             ;恢复现场 
                POP     ACC           ; 
                RETI                  ;中断退出 
FLASH1:         JB      01H,FLASH2    ;01H位为1时,转小时熄灭控制 
                MOV     72H,7AH       ;01H位为0时,"熄灭符"数据放入分 
                MOV     73H,7AH       ;显示单元(72H-73H),将不显示分数据 
                MOV     74H,78H       ; 
                MOV     75H,79H       ; 
                AJMP    INTT1OUT      ;转中断退出 
FLASH2:         MOV     72H,76H       ;01H位为1时,"熄灭符"数据放入小时 
                MOV     73H,77H       ;显示单元(74H-75H),小时数据将不显示 
                MOV     74H,7AH       ; 
                MOV     75H,7AH       ; 
                AJMP    INTT1OUT      ;转中断退出 

MMFUN :            CLR  TR1 
                   MOV   A,#0F7H       ;中断响应时间同步修正,重装初值(10ms) 
                   ADD   A,TL1         ;低8位初值修正 
                   MOV   TL1,A         ;重装初值(低8位修正值) 
                   MOV   A,#0D8H        ;高8位初值修正 
                   ADDC  A,TH1         ; 
                   MOV   TH1,A         ;重装初值(高8位修正值) 
                   SETB  TR1           ;开启定时器T0 
                   MOV      R0,#61H           ;指向秒计时单元(71H-72H) 
                   ACALL ADD1              ;调用加1程序(加1秒操作) 
                   CLR   C                 ; 
                   MOV   A,R3              ; 
                   JZ    FSS1              ;加1后为00,C=0 
                   AJMP  OUTT01            ;加1后不为00,C=1 
  FSS1:            ACALL CLR0              ;大于或等于60秒时对秒计时单元清0 
                   MOV     R0,#63H           ;指向分计时单元(76H-77H) 
                   ACALL ADD1              ;分计时单元加1分钟 
                   MOV      A,R3              ;分数据放入A 
                   CLR   C                 ;清进位标志 
                   CJNE  A,#60H,ADDHH1      ; 
            ADDHH1: JC     OUTT01             ;小于60分时中断退出 
                   LCALL CLR0              ;大于或等于60分时分计时单元清0 
                   MOV     R0,#65H           ;指向小时计时单元(78H-79H) 
                   ACALL ADD1              ;小时计时单元加1小时 

            OUTT01: 
                   POP      PSW               ;恢复状态字(出栈) 
                   POP   ACC               ;恢复累加器 
                   RETI                    ;中断返回            ; 
;**************************************** 
;;           加1子 程 序              ;; 
;**************************************** 


             ADD1: MOV     A,@R0       ;取当前计时单元数据到A 
                   DEC     R0          ;指向前一地址 
                   SWAP  A           ;A中数据高四位与低四位交换 
                   ORL      A,@R0       ;前一地址中数据放入A中低四位 
                   ADD     A,#01H      ;A加1操作 
                   DA      A           ;十进制调整 
                   MOV   R3,A        ;移入R3寄存器 
                   ANL      A,#0FH      ;高四位变0 
                   MOV      @R0,A       ;放回前一地址单元 
                   MOV     A,R3        ;取回R3中暂存数据 
                   INC     R0          ;指向当前地址单元 
                   SWAP     A           ;A中数据高四位与低四位交换 
                   ANL      A,#0FH      ;高四位变0 
                   MOV     @R0,A       ;数据放入当削地址单元中 
                   RET                  ;子程序返回 

;**************************************** 
;;           分减1子 程 序              ;; 
;**************************************** 

             SUB1: MOV     A,@R0       ;取当前计时单元数据到A 
                   DEC     R0          ;指向前一地址 
                   SWAP  A           ;A中数据高四位与低四位交换 
                   ORL      A,@R0       ;前一地址中数据放入A中低四位 
                   JZ    SUB11 
                   DEC     A           ;A减1操作 
           SUB111: MOV   R3,A        ;移入R3寄存器 
                   ANL      A,#0FH      ;高四位变0 
                   CLR     C           ;清进位标志 
                   SUBB  A,#0AH 
          SUB1111: JC       SUB1110 
                   MOV      @R0,#09H    ;大于等于0AH,为9 
          SUB110:  MOV     A,R3        ;取回R3中暂存数据 
                   INC     R0          ;指向当前地址单元 
                   SWAP     A           ;A中数据高四位与低四位交换 
                   ANL      A,#0FH      ;高四位变0 
                   MOV     @R0,A       ;数据放入当削地址单元中 
                   RET               ;子程序返回 
   ; 
            SUB11: MOV   A,#59H 
                   AJMP  SUB111 
           SUB1110:MOV   A,R3        ;移入R3寄存器 
                   ANL      A,#0FH      ;高四位变0 
                   MOV   @R0,A 
                   AJMP  SUB110 
;**************************************** 
;;           时减1子 程 序             ;; 
;**************************************** 

             SUBB1:MOV     A,@R0       ;取当前计时单元数据到A 
                   DEC     R0          ;指向前一地址 
                   SWAP  A           ;A中数据高四位与低四位交换 
                   ORL      A,@R0       ;前一地址中数据放入A中低四位 
                   JZ    SUBB11      ;00减1为23(小时) 
                   DEC     A           ;A减1操作 
           SUBB111:MOV   R3,A        ;移入R3寄存器 
                   ANL      A,#0FH      ;高四位变0 
                   CLR     C           ;清进位标志 
                   SUBB  A,#0AH      ;时个位大于9为9 
         SUBB1111: JC       SUBB1110    ; 
                   MOV      @R0,#09H    ;大于等于0AH,为9 
          SUBB110: MOV     A,R3        ;取回R3中暂存数据 
                   INC     R0          ;指向当前地址单元 
                   SWAP     A           ;A中数据高四位与低四位交换 
                   ANL      A,#0FH      ;高四位变0 
                   MOV     @R0,A       ;时十位数数据放入 
                   RET               ;子程序返回 
   ; 
           SUBB11: MOV   A,#23H 
                   AJMP  SUBB111 
          SUBB1110:MOV   A,R3        ;时个位小于0A不处理 
                   ANL      A,#0FH      ;高四位变0 
                   MOV   @R0,A       ;个位移入 
                   AJMP  SUBB110 
;**************************************** 
;;           清零程序                  ;; 
;**************************************** 
;对计时单元复零用 
             CLR0: CLR         A           ;清累加器 
                   MOV         @R0,A       ;清当前地址单元 
                   DEC         R0          ;指向前一地址 
                   MOV         @R0,A       ;前一地址单元清0 
                   RET                      ;子程序返回 

;**************************************** 
;;           时钟时间调整程序          ;; 
;**************************************** 
;当调时按键按下时进入此程序 
           SETMM:  cLR      ET0            ;关定时器T0中断 
                   CLR      TR0            ;关闭定时器T0 
                   LCALL      DL1S           ;调用1秒延时程序 
                   LCALL DS20MS                ;消抖 
                   JB          P1.0,CLOSEDIS  ;键按下时间小于1秒,关闭显示(省电) 
                   MOV      R2,#06H        ;进入调时状态,赋闪烁定时初值 
                   MOV          70H,#00H       ;调时时秒单元为00 秒 
                   MOV          71H,#00H 
                   SETB     ET1            ;允许T1中断 
                   SETB     TR1            ;开启定时器T1 
            SET2:  JNB         P1.0,SET1      ;P1.0口为0(键未释放),等待 
                   SETB      00H            ;键释放,分调整闪烁标志置1 
            SET4:  JB          P1.0,SET3      ;等待键按下 
                   LCALL       DL05S          ;有键按下,延时0.5秒 
                   LCALL DS20MS                ;消抖 
                   JNB        P1.0,SETHH     ;按下时间大于0.5秒转调小时状态 
                   MOV         R0,#77H        ;按下时间小于0.5秒加1分钟操作 
                   LCALL     ADD1           ;调用加1子程序 
                   MOV         A,R3           ;取调整单元数据 
                   CLR         C              ;清进位标志 
                   CJNE     A,#60H,HHH     ;调整单元数据与60比较 
              HHH: JC         SET4           ;调整单元数据小于60转SET4循环 
                   LCALL     CLR0           ;调整单元数据大于或等于60时清0 
                   CLR         C              ;清进位标志 
                   AJMP      SET4           ;跳转到SET4循环 
        CLOSEDIS:  SETB      ET0           ;省电(LED不显示)状态。开T0中断 
                   SETB      TR0           ;开启T0定时器(开时钟) 
        CLOSE:     JB        P1.0,CLOSE    ;无按键按下,等待。 
                   LCALL DS20MS                ;消抖 
                   JB        P1.0,CLOSE     ;是干扰返回CLOSE等待 
        WAITH:     JNB       P1.0,WAITH     ;等待键释放 
                   LJMP      START1         ;返回主程序(LED数据显示亮) 
           SETHH:  CLR       00H           ;分闪烁标志清除(进入调小时状态) 
                   SETB         01H            ;小时调整标志置1 
          SETHH1:  JNB         P1.0,SET5      ;等待键释放 
            SET6:  JB          P1.0,SET7      ;等待按键按下 
                   LCALL       DL05S          ;有键按下延时0.5秒 
                   LCALL DS20MS                 ;消抖 
                   JNB        P1.0,SETOUT    ;按下时间大于0.5秒退出时间调整 
                   MOV         R0,#79H       ;按下时间小于0.5秒加1小时操作 
                   LCALL      ADD1            ;调加1子程序 
                   MOV         A,R3            ; 
                   CLR         C                ; 
                   CJNE     A,#24H,HOUU      ;计时单元数据与24比较 
            HOUU:  JC         SET6             ;小于24转SET6循环 
                   LCALL     CLR0             ;大于或等于24时清0操作 
                   AJMP      SET6             ;跳转到SET6循环 
           SETOUT: JNB       P1.0,SETOUT1     ;调时退出程序。等待键释放 
                   LCALL DS20MS                  ;消抖 
                   JNB       P1.0,SETOUT      ;是抖动,返回SETOUT再等待 
                   CLR       01H              ;清调小时标志 
                   CLR       00H              ;清调分标志 
                   CLR       02H              ;清闪烁标志 
                   CLR       TR1              ;关闭定时器T1 
                   CLR       ET1              ;关定时器T1中断 
                   SETB      TR0              ;开启定时器T0 
                   SETB      ET0              ;开定时器T0中断(计时开始) 
                   LJMP     START1           ;跳回主程序 
            SET1:  LCALL    DISPLAY          ;键释放等待时调用显示程序(调分) 
                   AJMP     SET2             ;防止键按下时无时钟显示 
            SET3:  LCALL    DISPLAY          ;等待调分按键时时钟显示用 
                   JNB      P1.1, FUNSUB     ;减1分操作 
                   AJMP     SET4             ;调分等待 
            SET5:  LCALL    DISPLAY          ;键释放等待时调用显示程序(调小时) 
                   AJMP     SETHH1           ;防止键按下时无时钟显示 
            SET7:  LCALL    DISPLAY          ;等待调小时按键时时钟显示用 
                   JNB      P1.1, FUNSUBB     ;小时减1操作 
                   AJMP     SET6              ;调时等待 
         SETOUT1:  LCALL    DISPLAY          ;退出时钟调整时键释放等待 
                   AJMP    SETOUT            ;防止键按下时无时钟显示 
;FUNSUB,分减1程序?
          FUNSUB:  LCALL DS20MS              ;消抖 
                   JB       P1.1,SET41       ;干扰,返回调分等待 
          FUNSUB1: JNB      P1.1,FUNSUB1     ;等待键放开 
                   MOV         R0,#77H          ; 
                   LCALL    SUB1             ;分减1程序 
                   LJMP     SET4             ;返回调分等待 

            SET41: LJMP     SET4             ; 
;FUNSUBB,时减1程序                                            ; 
         FUNSUBB:  LCALL DS20MS              ;消抖 
                   JB       P1.1,SET61       ; 干扰,返回调时等待 
         FUNSUBB1: JNB      P1.1,FUNSUBB1    ; 等待键放开 
                   MOV         R0,#79H          ; 
                   LCALL    SUBB1            ; 时减1程序 
                   LJMP     SET6             ; 返回调时等待 

            SET61: LJMP  SET6 
;*************************************** 
;;           显示程序                  ;; 
;*************************************** 
; 显示数据在70H-75H单元内,用六位LED共阳数码管显示,P0口输出段码数据,P2口作 
; 扫描控制,每个LED数码管亮1MS时间再逐位循环。 
          DISPLAY: MOV         R1,DISPFIRST       ;指向显示数据首址 
                   MOV         R5,#0FEH      ;扫描控制字初值 
             PLAY: MOV         A,R5          ;扫描字放入A 
                   MOV         P2,A          ;从P2口输出 
                   MOV         A,@R1         ;取显示数据到A 
                   MOV         DPTR,#TAB     ;取段码表地址 
                   MOVC        A,@A+DPTR     ;查显示数据对应段码 
                   MOV         P0,A          ;段码放入P1口 
                   MOV          A,R5          ; 
                   JB           ACC.2,LOOP5   ;小数点处理 
                   CLR          P0.7          ; 
       LOOP5:      JB           ACC.4,LOOP6   ;小数点处理 
                   CLR          P0.7          ; 
       LOOP6:      LCALL     DL1MS         ;显示1MS 
                   INC         R1            ;指向下一地址 
                   MOV         A,R5            ;扫描控制字放入A 
                   JNB         ACC.5,ENDOUT    ;ACC.5=0时一次显示结束 
                   RL         A               ;A中数据循环左移 
                   MOV         R5,A            ;放回R5内 
                   MOV         P0,#0FFH 
                   AJMP     PLAY            ;跳回PLAY循环 
           ENDOUT: MOV          P2,#0FFH            ;一次显示结束,P2口复位 
                   MOV         P0,#0FFH       ;P0口复位 
                   RET                      ;子程序返回 
             TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,88H,0BFH 
;共阳段码表          "0""1""2" "3""4""5""6""7" "8""9""不亮"“A”“-” 

;**************************** 
; SDISPLAY ,上电显示子程序 
;**************************** 
;不带小数点显示,有“A”“-”显示功能 
         SDISPLAY: MOV          R1,DISPFIRST 
                   MOV         R5,#0FEH      ;扫描控制字初值 
            SPLAY: MOV         A,R5          ;扫描字放入A 
                   MOV         P2,A          ;从P2口输出 
                   MOV         A,@R1         ;取显示数据到A 
                   MOV         DPTR,#TABS     ;取段码表地址 
                   MOVC        A,@A+DPTR     ;查显示数据对应段码 
                   MOV         P0,A          ;段码放入P1口 
                   MOV          A,R5          ; 
                   LCALL     DL1MS         ;显示1MS 
                   INC         R1            ;指向下一地址 
                   MOV         A,R5            ;扫描控制字放入A 
                   JNB         ACC.5,ENDOUTS    ;ACC.5=0时一次显示结束 
                   RL         A               ;A中数据循环左移 
                   MOV         R5,A            ;放回R5内 
                   AJMP     SPLAY            ;跳回PLAY循环 
          ENDOUTS: MOV          P2,#0FFH            ;一次显示结束,P2口复位 
                   MOV         P0,#0FFH       ;P0口复位 
                   RET                      ;子程序返回 
             TABS: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,0C6H,0BFH,88H 
             ; 显示数  "0    1    2    3    4   5   6   7   8    9  不亮  C   -    A  " 
             ; 内存数  "0    1    2    3    4   5   6   7   8    9  0AH   0BH 0CH  0DH " 
;STAB表,启动时显示2006年12月23日、C04-2-28(学号)用 
          STAB: DB 0AH,0AH,0AH,0AH,0AH,0AH,08H,02H,0CH,02H,0CH,04H,00H,0BH,0AH,0AH 
                DB 03H,02H,0CH,02H,01H,0CH,06H,00H,00H,02H,0AH,0AH,0AH,0AH,0AH,0AH 
;          注:0A不亮,0B显示“A”,0C显示“-” 

;*********************************************************** 
;ST,上电时显示年月班级用,采用移动显示,先右移,接着左移. 
;*********************************************************** 
           ST:      MOV        R0,#40H      ;将显示内容移入40H-5FH单元 
                    MOV        R2,#20H      ; 
                    MOV        R3,#00H      ; 
                    CLR        A            ; 
                    MOV        DPTR,#STAB   ; 
           SLOOP:   MOVC       A,@A+DPTR    ; 
                    MOV        @R0,A        ; 
                    MOV        A,R3         ; 
                    INC        A            ; 
                    MOV        R3,A         ; 
                    INC        R0           ; 
                    DJNZ       R2,SLOOP     ;移入完毕 
                    MOV        DISPFIRST,#40H  ;以下程序从左往右移 
          SSLOOP:   MOV        R2,#50          ;控制移动速度 
          SSLOOP1:  LCALL      SDISPLAY        ; 
                    DJNZ       R2,SSLOOP1      ; 
                    INC        DISPFIRST 
                    MOV        A,DISPFIRST 
                    CJNE       A,#5AH, SSLOOP  ; 
                    MOV        DISPFIRST,#5AH  ;以下程序从右往左移 
                    MOV        R3,#1BH         ;显示27个单元 
          SSLOOP2:  MOV        R2,#32H        ;控制移动速度 
          SSLOOP12: LCALL      SDISPLAY       ; 
                    DJNZ       R2,SSLOOP12     ; 
                    DEC        DISPFIRST 
                    DJNZ       R3,SSLOOP2      ; 
                    RET 
;******************************************* 
;;           延时程序                     ;; 
;******************************************* 

;1MS延时程序,LED显示程序用 
             DL1MS: MOV     R6,#14H 
             DL1:   MOV     R7,#19H 
             DL2:   DJNZ     R7,DL2 
                    DJNZ     R6,DL1 
                    RET 
;20MS延时程序,采用调用显示子程序以改善LED的显示闪烁现象 
           DS20MS: CLR          BELL 
                   LCALL      DISPLAY 
                   LCALL     DISPLAY 
                   LCALL     DISPLAY 
                   SETB          BELL 
                   RET 
;延时程序,用作按键时间的长短判断 
           DL1S:   LCALL      DL05S 
                   LCALL      DL05S 
                   RET 
          DL05S:   MOV        R3,#20H      ;8毫秒*32=0.196秒 
          DL05S1:  LCALL      DISPLAY 
                   DJNZ       R3,DL05S1 
                   RET 
;************************************* 
;以下是闹铃时间设定程序中的时调整程序 
;************************************* 
DSSFUNN:          LCALL DISPLAY         ;等待键释放 
                  JNB   P1.3, DSSFUNN 
                 MOV    50H,#0AH        ;时调整时显示为00:00:- . 
                 MOV    51H,#0CH 
        WAITSS:    SETB  EA 
                  LCALL DISPLAY 
                  JNB   P1.2,FFFF      ;时加1键 
                  JNB   P1.0,DDDD      ;时减1 
                  JNB   P1.3,OOOO      ;闹铃设定退出键 
                  JNB   P1.1,ENA       ;闹铃设定有效或无效按键 
                  AJMP  WAITSS 
       OOOO:      LCALL DS20MS         ;消抖 
                  JB   P1.3, WAITSS 
     DSSFUNNM:    LCALL DISPLAY         ;键释放等待 
                  JNB   P1.3, DSSFUNNM 
                  MOV  DISPFIRST,#70H 
                  LJMP START1 
       ENA:       LCALL DS20MS         ;消抖        ; 
                  JB   P1.1, WAITSS 
     DSSFUNMMO:   LCALL DISPLAY         ;键释放等待 
                  JNB   P1.1, DSSFUNMMO 
                  CPL  05H 
                  JNB  05H,WAITSS11 
                  MOV  50H,#00H        ;05H=1,闹铃开,显示为 00:00: 0。 
                  AJMP  WAITSS 
          WAITSS11: MOV  50H,#0aH        ;闹铃不开,显示为00:00:- . 
                  AJMP  WAITSS 
       FFFF:      LCALL DS20MS            ;消抖        ; 
                  JB   P1.2, WAITSS 
     DSSFUNMM:    LCALL DISPLAY         ;键释放等待 
                  JNB   P1.2, DSSFUNMM 
                  CLR   EA 
                  MOV   R0,#55H 
                  LCALL ADD1 
                  MOV      A,R3            ; 

                  CLR   C                 ; 
                  CJNE  A,#24H,ADDHH33N   ; 
        ADDHH33N: JC     WAITSS    ;小于24点返回 
                  ACALL CLR0              ;大于等于24点清零 
                  AJMP  WAITSS 
     DDDD  :      LCALL DS20MS            ;消抖        ; 
                  JB   P1.0, WAITSS 
     DSSFUNDD:    LCALL DISPLAY         ;键释放等待 
                  JNB   P1.0, DSSFUNDD 
                  CLR   EA 
                  MOV   R0,#55H 
                  LCALL SUBB1 
                  LJMP  WAITSS 
;********************* 
;以下是闹铃判断子程序 
;********************* 
BAOJ:               JNB   05H,BBAO       ;05H=1,闹钟开,要比较数据 
                    MOV    A,79H         ;从时十位、个位、分十位、分个位顺序比较 
                    CJNE   A,55H,BBAO 
                    MOV    A,78H 
                    CLR    C 
BB3:                CJNE   A,54H,BBAO 
                    MOV    A,77H 
                    CLR   C 
                    CJNE   A,53H,BBAO 
                    MOV    A,76H 
                    CLR    C 
BB2:                CJNE   A,52H,BBAO 
                    JNB   07H,BBAO        ;07H在1秒到时会取反 
                    CLR    BELL           ;时分相同时呜叫(1秒间隔叫) 
                    RET 

              BBAO: SETB  BELL            ;不相同或闹铃不开 
                    RET 
;******************************************************** 
                   END                     ;程序结束 


关键字:AT89C52  闹钟程序 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/article_2018010637176.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

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

热门文章 更多
STM32 USB HID 键盘