lantian吧 关注:3贴子:343
  • 5回复贴,共1

电子钟程序

收藏回复

  • 222.79.27.*
电子钟程序。
 利用定时器T0定时,模拟24小时走时的电子钟,时、分、秒以BCD码形式依次存放在3CH、3BH、3AH;38H、39H作为软件计数器。
选择T0工作于定时、方式2、定时时间为500s。TMOD=0000 0010B=02H
计算初值
fosc=6MHz  机器周期TM=2 s 
要定时500 s 即要计数250个机器周期脉冲
初值=28-250=6=06H
ORG  0000H      ;主程序入口
       LJMP  CLOCK     ;转主程序初始化
                  ORG  000BH      ;T0中断入口
       LJMP  TP0            ;转T0中断服务程序
            ORG  0030H      ;主程序初始化程序
    CLOCK:MOV  SP,#6FH   ;设栈底指针
       MOV  A,#89H;8255的A口、B口为输出
             MOV  DPTR,#0FEFFH;指向8255控制口
             MOVX  @DPTR,A ;将控制字写入控制寄存器
       MOV  TMOD,#02H  ;T0定时方式2
       MOV  TL0,#06H   ;定时(256—6)*2=500微秒
       MOV  TH0,#06H       
       MOV  38H,#200  ;软件计数单元初值
       MOV  39H,#10
                 SETB  EA     ;中断总允许 
       SETB  ET0    ;允许T0中断
       SETB  TR0   ;启动T0工作
MOV   3AH,#0    ;时间初值
    MOV   3BH,#0
                MOV   3CH,#0  ;<根据需要设置>
 LOOP:  LCALL  CZ            ;调用拆字子程序 
    LCALL  DISP        ;调用显示子程序 
    SJMP  LOOP         ;反复循环主流程 
    TP0:PUSH  ACC             ;T0 500微秒中断服务程序 
          PUSH  PSW              ;保护现场 
          DJNZ   38H,DONE ;每500微秒减1,满0.1秒? 
               MOV    38H,#200
               DJNZ   39H,DONE ;每0.1秒加1,满1S?
              MOV    39H,#10
MOV  A,3AH  ;秒单元(按BCD码)加1 
  ADD  A,#1
  DA  A
  MOV  3AH,A
  CJNE  A,#60H,DONE  ;满1分钟? 
  MOV  3AH,#0  ;秒单元清零 
  MOV  A,3BH  ;分钟单元(按BCD码)加1 
  ADD  A,#1
  DA  A
  MOV  3BH,A
  CJNE  A,#60H,DONE  ;满1小时? 
  MOV  3BH,#0  ;分钟单元清零 
MOV  A,3CH  ;小时单元(按BCD码)加1 
    ADD  A,#1
    DA  A
    MOV  3CH,A
    CJNE  A,#24H,DONE  ;满24小时? 
    MOV  3CH,#0  ;小时单元清零 
DONE:POP  PSW
    POP  ACC  ;恢复现场 
    RETI   ;中断返回
CZ:MOV     R0,#3AH         ;拆字子程序
        MOV     R1,#30H    ;30H~36H为显示缓冲单元
CZ1:MOV      A,@R0
        ANL       A,#0FH
        MOV      @R1,A
        INC        R1
        MOV     A,@R0
        ANL    A,#0F0H
        SWAP     A
        MOV      @R1,A
        INC       R0
        INC       R1
        CJNE     R0,#3DH,CZ1
        RET
DISP:MOV  R0,#30H;显示缓冲单元首地址
    MOV  R3,#01H ;字位码初值(从最右位起)
    MOV  A,R3
DISP1:MOV  DPTR,#0FEFDH ;8255B口(字位码输出口)
    MOVX  @DPTR,A        ;输出字位码
    MOV  DPTR,#0FEFCH ;8255A口(字段码输出口)
    MOV  A,@R0    ;取显示数据码
    ADD  A,#TAB-NPC   ;加TAB与NPC差值
    MOVC  A,@A+PC  ;查表得相应字段码
   NPC:MOVX  @DPTR,A  ;输出字段码
INC  R0        ;指向下一显示缓冲单元
    MOV  A,R3  ;取出字位码
    JB  ACC.5,DISP2  ;判已显示6位否
    RL  A            ;未完,字位码左移1位
    MOV  R3,A;回存新字位码
    SJMP  DISP1 ;转下一位显示
DISP2:RET
    TAB:DB  0C0H,0F9H,. . . ,90H;0-9 字段码表
 D1MS:MOV  R7,#250   ;延时1毫秒子程序
    DJNZ  R7,$
     RET
    LCALL  D1MS    ;保持显示1毫


1楼2008-05-23 23:50回复
    • 218.6.67.*
    ORG 0000H 
     LJMP MAIN 
     ORG 000BH 
     LJMP WBI 
     ORG 0030H 
     MAIN:MOV A,#89H 
     MOV DPTR,#0FEFFH 
     MOVX @DPTR,A 
     
     MOV SP,#6FH 
     MOV TMOD,#02H 
     MOV TL0,#06H 
     MOV TH0,#06H 
     MOV 38H,#00H 
     MOV 39H,#00H 
     MOV 3AH,#00H 
     MOV 3BH,#59H 
     MOV 3CH,#23H 
     MOV 32H,#0AH 
     MOV 35H,#0AH 
     SETB ET0 
     SETB TR0 
     SETB EA 
     LOOP:LCALL CZ 
     LCALL DISP
     LCALL KEY 
     SJMP LOOP 
     
    KEY: MOV DPTR,#0FEFEH 
     MOVX A,@DPTR 
     CPL A 
     JZ KD 
     LCALL DELAY 
     MOVX A,@DPTR 
     CPL A 
     JZ KD 
     MOVX A,@DPTR 
     MOV B,A 
    KW: MOVX A,@DPTR 
     CPL A 
     JNZ KW 
     MOV A,B 
     JNB ACC.0,K0 
     JNB ACC.1,K1 
     JNB ACC.2,K2 
     KD:RET 
     K0:MOV A,3AH 
     ADD A,#1 
     DA A 
     MOV 3AH,A 
     CJNE A,#60H, L 
     MOV 3AH,#00H 
     L: RET 
     K1:MOV A,3BH 
     ADD A,#1 
     DA A 
     MOV 3BH,A 
     CJNE A,#60H, L1 
     MOV 3AH,#00H 
     L1:RET 
     K2:MOV A,3CH 
     ADD A,#1 
     DA A 
     MOV 3CH,A 
     CJNE A,#24H, L2 
     MOV 3CH,#00H 
     L2: RET 
    DELAY:MOV R1 ,#12 
     L3: MOV R7,#250 
     DJNZ R7,$ 
     DJNZ R1, L3 
     RET 
    DISP:MOV R0,#30H 
     MOV R3,#01H 
     MOV A, R3 
    DISP1:MOV DPTR,#0FEFDH 
     MOVX @DPTR, A 
     MOV DPTR,#0FEFCH 
     MOV A, @R0 
     ADD A, #TAB-NPC 
     MOVC A, @A+PC 
    NPC:MOVX @DPTR, A 
     LCALL D1MS 
     INC R0 
     MOV A,R3 
     JB ACC.7,DISP2 
     RL A 
     MOV R3,A 
     SJMP DISP1 
    DISP2:RET 
    TAB:DB 0C0H,0F9H,0A4H,0b0H,99H,92H,82H,0F8H,80H,90H,0BFH 
    D1MS:MOV R7, #250 
     DJNZ R7,$ 
     RET 
     CZ:MOV R1,#30H 
     MOV R0,#3AH 
    LOOP2:MOV A, @R0 
     ANL A, #0FH 
     MOV @R1, A 
     INC R1 
     MOV A, @R0 
     ANL A, #0F0H 
     SWAP A 
     MOV @R1, A 
     INC R0 
     INC R1 
     INC R1 
     MOV 32H, #0AH 
     MOV 35H, #0AH 
     CJNE R0,#3DH,LOOP2 
     RET 
    WBI:PUSH PSW 
     PUSH ACC 
     MOV TH0, #3CH 
     MOV TL0, #0B0H 
     DJNZ 39H, EXIT 
     MOV 39H, #0AH 
     MOV A, 3AH 
     ADD A, #01H 
     DA A 
     MOV 3AH, A 
     CJNE A, #60H, EXIT 
     MOV 3AH, #00H 
     MOV A, 3BH 
     ADD A, #01H 
     DA A 
     MOV 3BH, A 
     CJNE A, #60H, EXIT 
     MOV 3BH, #00H 
     MOV A, 3CH 
     ADD A, #01H 
     DA A 
     MOV 3CH, A 
     CJNE A, #24H, EXIT 
     MOV 3CH, #00H 
    EXIT:POP ACC 
     POP PSW 
     RETI 
     END


    2楼2008-05-26 16:51
    回复
      • 218.5.25.*
       ORG 0000H
       LJMP MAIN
       ORG 001BH
       LJMP WBI
       MAIN:MOV 25H,#01H
       MOV 26H,#01H
       MOV A,#89H;?255的A口、B口为输出,C口输入
       MOV DPTR,#0FEFFH;恢赶?255控制口
       MOVX @DPTR,A;将控制字写入控制寄存器
       MOV 30H,#00H
       MOV 31H,#00H
       MOV 32H,#00H
       MOV 33H,#00H
       MOV 34H,#00H
         MOV 35H,#00H 
       MOV 36H,#00H
       MOV 37H,#00H;显示初值为“0000000
       MOV 40H,#00H
       MOV 41H,#00H
       MOV 42H,#00H
       MOV 43H,#00H
       MOV 44H,#00H
         MOV 45H,#00H 
       MOV 46H,#00H
       MOV 47H,#00H
       MOV 40H,#00H
       MOV TMOD,#10H
       MOV TL1, #0B0H ;装定时器T1定时初值
       MOV TH1, #3CH
       MOV   R2,#06H
       
         
       LP:LCALL DISP ;调用显示子程序
         LCALL KEY ;调用键盘管理子程序
         SJMP LP
      WBI: PUSH ACC ;中断现场保护
       PUSH PSW ;
       MOV TL1, #0B0H ;装定时器T1定时初值
       MOV TH1, #3CH
       DJNZ R2, OUT  ;0.3秒未到退出中断(50MS中断6次)
       MOV R2,#06H  ;重装0.3秒定时用初值
       CPL 26H.0  ;0.3秒定时到对闪烁标志取反
       JB 26H.0,AN
       JB 25H.0,L00
       JB 25H.1,L11
       JB 25H.2,L22
       JB 25H.3,L33
       JB 25H.4,L44
       JB 25H.5,L55
       JB 25H.6,L66
       JB 25H.7,L77
       AN:MOV 30H,40H
       MOV 31H,41H
       MOV 32H,42H
       MOV 33H,43H
       MOV 34H,44H
       MOV 35H,45H
       MOV 36H,46H
       MOV 37H,47H
       OUT:POP PSW   ;恢复现场
       POP ACC ;
       RETI ;中断退出
       L00:MOV 30H,#0AH
       AJMP OUT
       L11:MOV 31H,#0AH
       AJMP OUT
       L22:MOV 32H,#0AH
       AJMP OUT
       L33:MOV 33H,#0AH
       AJMP OUT
       L44:MOV 34H,#0AH
       AJMP OUT
       L55:MOV 35H,#0AH
       AJMP OUT
       L66:MOV 36H,#0AH
       AJMP OUT
       L77:MOV 37H,#0AH
       AJMP OUT
       
       DISP:MOV R0,#30H;显示缓冲单元首地址
       MOV R3,#01H;字位码初值(从最右位起)
       MOV A,R3
       DISP1:MOV DPTR,#0FEFDH;8255B口(字位码输出口)
       MOVX @DPTR,A ;输出字位码
       MOV DPTR,#0FEFCH ;8255A口(字段码输出口)
       MOV A,@R0 ;取显示数据码
       ADD A,#TAB-NPC ;加TAB与NPC差值
       MOVC A,@A+PC ;查表得相应字段码
       NPC:MOVX @DPTR,A ;输出字段码
       LCALL D1MS ;保持显示1毫秒
       INC R0 ;指向下一显示缓冲单元
       MOV A,R3 ;取出字位码
       JB ACC.7,DISP2 ;判已显示到最左位否
       RL A ;未完,字位码左移1位
       MOV R3,A;回存新字位码
       SJMP DISP1 ;转下一位显示
       DISP2:RET
       TAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH ;0~9字段码表
       MOV R7,#250 ;延时1毫秒子程序 
       D1MS:NOP
       DJNZ R7,D1MS
       RET
       KEY:MOV DPTR,#0FEFEH ;C口
       MOVX A,@DPTR ;输入按键状态
       CPL A ;取反
       JZ KD ;若无键闭合则返回
       LCALL DELAY ;延时12ms消抖动
       MOVX A,@DPTR 
       CPL A
       JZ KD ;确认是否有键闭合
       MOVX A,@DPTR 
       MOV B,A ;输入稳定的键状态
       KW:MOVX A,@DPTR 
         CPL A
       JNZ KW ;等待键释放
       MOV A,B ;取键值
       JNB ACC.0,K0 ;若是K0闭合则转K0键功能程序
       JNB ACC.1,K1 ;若是K1闭合则转K1键功能程序
       JNB ACC.2,K2
       ;JNB ACC.2,K2;若是K7闭合则转K7键功能程序
       KD:RET ;返回
       K0:
       MOV A,25H ;K0键功能程序
       RL A
       MOV 25H,A
       RET

       K1: JB 25H.0,L0
       JB 25H.1,L1
       JB 25H.2,L2
       JB 25H.3,L3
       JB 25H.4,L4
       JB 25H.5,L5
       JB 25H.6,L6
       JB 25H.7,L7
       
       RET
       K2:SETB ET1
       SETB TR1
       SETB EA
       RET
       L0:MOV A,30H
       ADD A,#1
       DA A
       ANL A,#0FH
       MOV 30H,A
       MOV 40H,30H
       RET
       L1:MOV A,31H
       ADD A,#1
       DA A
       ANL A,#0FH
       MOV 31H,A
       MOV 41H,31H
       RET
       L2:MOV A,32H
       ADD A,#1
       DA A
       ANL A,#0FH
       MOV 32H,A
       MOV 42H,32H
       RET
       L3:MOV A,33H
       ADD A,#1
       DA A
       ANL A,#0FH
       MOV 33H,A
       MOV 43H,33H
       RET
      L4:MOV A,34H
       ADD A,#1
       DA A
       ANL A,#0FH
       MOV 34H,A
       MOV 44H,34H
       RET
      L5:MOV A,35H
       ADD A,#1
       DA A
       ANL A,#0FH
       MOV 35H,A
       MOV 45H,35H
       RET
      L6:MOV A,36H
       ADD A,#1
       DA A
       ANL A,#0FH
       MOV 36H,A
       MOV 46H,36H
       RET
      L7:MOV A,37H
       ADD A,#1
       DA A
       ANL A,#0FH
       MOV 37H,A
       MOV 47H,37H
       RET
       
       DELAY:MOV R3,#12 
       LP2:MOV R4,#123
       LP1:NOP
       NOP
       DJNZ R4,LP1
       DJNZ R3,LP2
       RET
       ;DELAY300:MOV R3,#250
       LP4:MOV R4,#123
       LP3:NOP
       NOP
       DJNZ R4,LP3
       DJNZ R3,LP4
       RET
       END


      3楼2008-06-01 23:23
      回复
        • 218.6.67.*
        ORG 0000H
        LJMP MAIN
        ORG 000BH
        LJMP ZD
        MAIN:MOV SP,#70H
        MOV TMOD,#02H
        MOV TH0,#06H
        MOV TL0,#06H
        MOV 38H,#00H
        MOV 39H,#00H
        SETB EA
        SETB ET0
        SETB TR0

        MOV 3AH,#0
        MOV 3BH,#0
        MOV 3CH,#0

        MOV 60H,#0H
        MOV 52H,#39H
        MOV 50H,#0
        MOV 51H,#0

        MOV DPTR,#0FEFFH
        MOV A,#89H
        MOVX @DPTR,A

        KEY:LCALL KS1
        JNZ ZC
        LCALL CZ
        MOV A,60H
        CJNE A,#10H,SS11
        LCALL SS1

        SS11:MOV A,60H
        CJNE A,#11H,SS22
        LCALL SS2

        SS22:LCALL XS

        SJMP KEY
        ZC:LCALL D5MS
        LCALL D5MS
        LCALL D5MS
        LCALL KS1
        MOV B,A
        JNZ DR
        SJMP KEY
        DR:LCALL XS
        LCALL KS1
        JNZ DR 
        MOV A,B
        JB ACC.0,K0
        JB ACC.1,K1
        SJMP KEY
        K0:MOV 60H,#10H
        CLR TR0
        INC 52H
        MOV A,52H

        CJNE A,#3DH,TCK0
        MOV 52H,#39H
        MOV 60H,#0
        SETB TR0
        TCK0:SJMP KEY
        K1:MOV R0,52H
        MOV A,@R0
        ADD A,#1
        DA A 
        MOV @R0,A
        MOV A,52H
        CJNE A,#3AH,MIN
        MOV A,3AH
        CJNE A,#60H,TCK1
        MOV 3AH ,#0
        MIN: MOV A,52H
        CJNE A,#3BH,HOU
        MOV A,3BH
        CJNE A,#60H,TCK1
        MOV 3BH,#0
        HOU:MOV A,52H
        CJNE A,#3CH,TCK1
        MOV A,3CH
        CJNE A,#24H,TCK1
        MOV 3CH,#0

        TCK1:LJMP KEY
        KS1:MOV DPTR,#0FEFEH
        MOVX A,@DPTR
        CPL A
        ANL A,#03H
        RET

        SS1:MOV A,52H
        CJNE A,#3AH,NEXT2
        MOV 30H,#0BH
        MOV 31H,#0BH
        NEXT2:CJNE A,#3BH,NEXT3
        MOV 33H,#0BH
        MOV 34H,#0BH
        NEXT3:CJNE A,#3CH,NEXT4
        MOV 36H,#0BH
        MOV 37H,#0BH
        NEXT4:INC 50H
        MOV A,50H
        CJNE A,#20H,NEXT11
        MOV 60H,#11H
        MOV 50H,#0
        NEXT11:RET
        SS2:INC 51H
        LCALL CZ
        MOV A,51H

        CJNE A,#20H,NEXT22
        MOV 60H,#10H
        MOV 51H,#0
        NEXT22:RET

        ZD:PUSH ACC
        PUSH PSW
        INC 38H
        MOV A,38H
        CJNE A,#200,TC
        MOV 38H,#0
        INC 39H
        MOV A,39H
        CJNE A,#10,TC
        MOV 39H,#0
        MOV A,3AH
        ADD A,#1
        DA A
        MOV 3AH,A 
        CJNE A,#60H,TC
        MOV 3AH,#0
        MOV A,3BH
        ADD A ,#1
        DA A
        MOV 3BH,A
        CJNE A,#60H,TC
        MOV 3BH,#0
        MOV A,3CH
        ADD A ,#1
        DA A
        MOV 3CH,A
        CJNE A,#24H,TC
        MOV 3CH,#0
        TC: POP PSW
        POP ACC
        RETI

        XS:MOV R1,#30H
        MOV R3,#01H
        MOV A,R3
        SC:MOV DPTR,#0FEFDH 
        MOVX @DPTR,A
        MOV DPTR,#0FEFCH
        MOV A,@R1
        ADD A,#TAB-NPC
        MOVC A,@A+PC
        NPC:MOVX @DPTR,A
        LCALL D1MS
        INC R1
        MOV A,R3
        JB ACC.7,DISP2
        RL A
        MOV R3,A
        SJMP SC
        MOV R3,#01H
        DISP2:RET

        D1MS:mov r4,#1
         ws: MOV R7,#250
         DJNZ R7,$
         djnz r4,ws
        RET

        CZ:MOV R0,#3AH
        MOV R1,#30H
        ZQ: MOV A,@R0
        ANL A,#0FH
        MOV @R1,A
        INC R1
        MOV A,@R0
        ANL A,#0F0H
        SWAP A
        MOV @R1,A
        INC R0
        INC R1
        INC R1
        CJNE R0,#3DH,ZQ
        MOV 32H,#0AH
        MOV 35H,#0AH
        RET
        TAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0BFH,0FFH

        D5MS: MOV R6,#5
        SM: MOV R7,#250
        ZS:DJNZ R7,ZS
         DJNZ R6,SM
         RET



        END


        4楼2008-06-02 15:25
        回复
          • 222.190.105.*


          5楼2010-06-17 14:27
          回复
            • 221.10.37.*


            6楼2010-06-18 01:45
            回复