⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wnl.asm

📁 用单片机at89c51控制时钟芯片DS1302
💻 ASM
字号:
e87  
;======数据空间定义============
;时钟原始数据:30H-37H
;拆开数据:40H-4FH
;显示数据:50H-5EH
;系统时钟:
;==============================



;======位地址空间定义=========
       
     CLOCK BIT P3.5
     IO BIT P3.6
     RST BIT P3.7
     BIAOZHI BIT 01H
;===============================  
           
     ORG 0000H
     AJMP MAIN
     ORG 000BH
     AJMP SERVE_T0
     ORG 0030H
MAIN:MOV R4,#10
     MOV TMOD,#01H
     MOV TH0,#4CH
     MOV TL0,#00H
     MOV DPTR,#TABLE
     MOV P2,#00H
     MOV A,#80H
     MOV B,#00H
     LCALL DS_WRITE
     MOV 37H,#20H
LOOP:LCALL GET1302
     LCALL CHAI
     LCALL XCHE
     LCALL OUTPUT
     LCALL ADJUST
     AJMP LOOP
;=========================
SERVE_T0:PUSH ACC
         PUSH R1 
         PUSH B
         MOV TH0,#4CH
         MOV TL0,#00H
         DJNZ R4,SE_RET
         MOV R4,#10
         CPL BIAOZHI
         MOV A,R0
         ADD A,#10H
         MOV R1,A
         MOV B,@R1
         JB  BIAOZHI,LIANG
         MOV @R1,#00H
   LIANG:LCALL OUTPUT
         MOV @R1,B
  SE_RET:POP B
         POP R1
         POP ACC
         RETI

;========拆开数据==========
CHAI:PUSH R0
     PUSH R1
     PUSH R3
     MOV R0,#30H
     MOV R1,#40H
     MOV R3,#08H
 CH1:MOV A,@R0
     MOV B,A
     ANL A,#0FH
     MOV @R1,A
     INC R1
     CJNE R3,#03H,CH2
     INC R0
     DEC R3
     AJMP CH1
 CH2:MOV A,B
     ANL A,#0F0H
     SWAP A
     MOV @R1,A
     INC R0
     INC R1
     DJNZ R3,CH1
     POP R3
     POP R1
     POP R0
     RET
;*******转换**********
XCHE:PUSH R0
     PUSH R1
     PUSH ACC
     PUSH R3
     MOV R0,#40H
     MOV R1,#50H
     MOV R3,#0FH
XCH1:MOV A,@R0
     MOVC A,@A+DPTR
     MOV @R1,A
     INC R0
     INC R1
     DJNZ R3,XCH1
     POP R3
     POP ACC
     POP R1
     POP R0
     RET
 
;=========组合数据==============
COMBIN:PUSH R0
       PUSH R1
       PUSH ACC
       PUSH B
       MOV R0,#30H
       MOV R1,#40H
  COM1:MOV B,@R1
       INC R1
       MOV A,@R1
       CJNE R1,#4BH,COM2
       MOV @R0,B
       INC R0
       AJMP COM1
  COM2:MOV A,@R1
       SWAP A
       ADD A,B
       MOV @R0,A
       INC R1
       INC R0
       CJNE R0,#38H, COM1
       POP B
       POP ACC    
       POP R1
       POP R0
       RET 
;******** 输出 **********    
OUTPUT:PUSH R0
       PUSH R3
       MOV R3,#0FH
       MOV  R0,#50H
       MOV SCON,#00H
CLOOP3:MOV A,@R0
       MOV SBUF,A
  HERE:JNB TI,HERE
       CLR TI
       INC R0
       DJNZ R3,CLOOP3
       SETB P2.7
       CLR P2.7
       POP R3
       POP R0
       RET
;*******SET1302向1302写入数据*************
SET1302:MOV R6,#07H
        MOV R0,#30H
	    MOV A,#8EH          ;---------|
        MOV B,#00H          ;去写保护 | 
        LCALL DS_WRITE      ;---------|
        MOV R1,#80H          ;秒写命令控制
  ALOOP:MOV B,@R0
        MOV A,R1
        LCALL DS_WRITE    
        INC R1               ;写命令为偶数
        INC R1 
        INC R0
        DJNZ R6,ALOOP    
        MOV A,#8EH          ;-----------|
        MOV B,#80H          ;加上写保护 |
        LCALL DS_WRITE      ;-----------|
        RET
;***************写入一字节数据子程序, *************
;********A为命令字节,B是待输入的的数据********
DS_WRITE:CLR RST
         CLR CLOCK
         SETB RST 
         LCALL DS_WSUB
         MOV A,B
         LCALL DS_WSUB
         RET
         
;************向DS1302写入一字节子程序,字节***********
;*************在A中,可以时命令也可以是数据**********
DS_WSUB:MOV R7,#08H;
  WLOOP:RRC A
        MOV IO,C
        SETB CLOCK
        NOP
        CLR CLOCK
        DJNZ R7,WLOOP
        RET

;********** GET1302从1302中读出数据******
GET1302:MOV A,#81H; 
        MOV B,A
        MOV R5,#07H
        MOV R0,#30H
  BLOOP:LCALL DS_READ
        MOV  @R0,A
        INC B
        INC B
        MOV A,B 
        INC R0   
        DJNZ R5,BLOOP
        RET
        
;************从DS1302读出一字节子程序-**********
;*********A先为输入命令,后为读出数据*********
DS_READ:CLR RST   
        CLR CLOCK
        SETB RST
        LCALL DS_WSUB
        LCALL DS_RSUB
        RET
;*********从DS1302读出一字节数据,********
;*********运行后A里为读取的数据*************
DS_RSUB:MOV R7,#08H
  RLOOP:CLR CLOCK
        MOV C,IO
        RRC A
        SETB CLOCK
        CLR CLOCK
        DJNZ R7,RLOOP
        RET
;**********调整*************
ADJUST:PUSH R0
       SETB BIAOZHI
       MOV R0,#4FH  
    Q7:MOV P1,#0FFH
       MOV A,P1
       CPL A
       ANL A,#0E0H
       JZ  Q1
       LCALL D_10ms
       MOV A,P1
       CPL A 
       ANL A,#0E0H
       JZ Q1
    K: MOV B,A
       MOV P1,#0FFH 
       MOV A,P1
       CPL A 
       ANL A,#0E0H
       JNZ K   ;判断键是否释放
       LCALL D_10MS
       MOV A,B
       SETB TR0
       SETB ET0
       SETB EA
       JB ACC.7,K1
       JB ACC.6,K2
       JB ACC.5,K3
    Q1:CJNE R0,#4FH,Q7   ;无调整时不用进行加减处理,加减键无效
       AJMP KRET
;=========调整位选择处理程序======
    K1:DEC R0
       CJNE R0,#3FH,Q7
       LCALL COMBIN
       LCALL SET1302
       AJMP KRET
;======加减处理程序=========
    K2:MOV A,@R0
       INC A
;============================
       CJNE R0,#41H,W1  ;SECOND
       CJNE A,#06H,W1
       CLR A
    W1:CJNE R0,#43H,W2  ;MINUTE
       CJNE A,#06H,W2
       CLR A
    W2:CJNE R0,#45H,W3  ;HOUR
       CJNE A,#03H,W3
       CLR A
    W3:CJNE R0,#47H,W4  ;DAY
       CJNE A,#04H,W4
       CLR A
    W4:CJNE R0,#49H,W5   ;MONTH
       CJNE A,#02H,W5
       CLR A
    W5:CJNE R0,#4AH,W6   ;DATE
       CJNE A,#08H,W6
       CLR A
;=============================== 
    W6:CJNE A,#0AH,Q3
       CLR A
    Q3:MOV @R0,A
       LCALL XCHE
       AJMP Q7   
    K3:MOV A,@R0
       DEC A
;=====================================
       CJNE R0,#41H,D1  ;SECOND
       CJNE A,#07H,D1
       MOV A,#05H
    D1:CJNE R0,#43H,D2  ;MINUTE
       CJNE A,#0FFH,D2
       MOV A,#05H
    D2:CJNE R0,#45H,D3  ;HOUR
       CJNE A,#0FFH,D3
       MOV A,#02H
    D3:CJNE R0,#47H,D4  ;DAY
       CJNE A,#0FFH,D4
       MOV A,#03H
    D4:CJNE R0,#49H,D5   ;MONTH
       CJNE A,#0FFH,D5
       MOV A,#01H
    D5:CJNE R0,#4AH,D6   ;DATE
       CJNE A,#0FFH,D6
       MOV A,#07H
;=====================================       
    D6:CJNE A,#0FFH,Q3
       MOV A,#09H
       AJMP Q3
  KRET:CLR TR0 
       CLR ET0
       CLR EA
       POP R0
       RET
TABLE:DB 0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H,0FEH,0F6H          
D_10MS:MOV R2,#20
    G2:MOV R3,#250
    G1:DJNZ R3,G1
       DJNZ R2,G2
       RET    
       END 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -