1302.asm

来自「时间芯片1302的的读写。也有内部寄存器的使用程序。带有直接初始化」· 汇编 代码 · 共 255 行

ASM
255
字号
;*********************************************************************

; 公司名称:
; 模块名称:DS1302.a51
; 功    能:实时时钟模块           时钟芯片型号:DS1302
; 说    明:(修改版)
; 程序设计:
; 设计时间:
; 版 本 号:
;*********************************************************************/
;sclc  equ p3.3;1302sclk                         ;实时时钟时钟线引脚
;sdac  equ p3.4;1302io                         ;实时时钟数据线引脚
;csc   equ p3.5;1302rst                         ;实时时钟复位线引脚
;**********************************************************
;子程序名:Set1302
;功    能:设置DS1302 初始时间,并启动计时。
;说    明:
;调    用:RTInputByte
;入口参数:初始时间在:Second,Minute,Hour,Day,Month,Week.YearL(地址连续)
;出口参数:无
;影响资源:A B R0 R1 R4 R7
;设    计:                     日    期:
;修    改:                     日    期:
;**********************************************************
;*********************************************
;1302初始化程序:
;*********************************************
set_DS1302:    nop           
                CLR    csc
                CLR    sclc
		SETB   csc
                mov    b, #8eh           ;寄存器地址
                LCALL  RTInputByte      ;写操作前WP=0
                mov    b,#00h
                LCALL  RTInputByte
                SETB   sclc
                CLR    csc

                CLR    csc               ;充电程序
                CLR    sclc
		SETB   csc
                mov    b,#90h
                LCALL  RTInputByte 
                mov    b,#0a5h
                LCALL  RTInputByte
                SETB   sclc
                CLR    csc

                CLR    csc                ;秒位制零
                CLR    sclc
		SETB   csc
                mov    b,#80h
                lcall  RTInputByte
                mov    b,#00h
                lcall  RTInputByte
                SETB   sclc
                CLR    csc

                                                      
                CLR    csc
                CLR    sclc
		SETB   csc
                MOV    B,     #8EH        ;控制寄存器
                LCALL  RTInputByte
                MOV    B,     #80H        ;控制,WP=1,写保护
                LCALL  RTInputByte
                SETB   sclc
         	CLR    csc
                ret

;*****************************************************************
;*****************************************************************
   

write_time:
          CLR    csc
          CLR    sclc
          SETB   csc
          MOV    B,     #8EH        ;控制寄存器
          LCALL  RTInputByte
          MOV    B,     #00H        ;写操作前WP=0
          LCALL  RTInputByte
          SETB   sclc
          CLR    csc

          MOV    R0,    #free_park_st+2;  ;每一次上电,必须把秒寄存器高位设置为0,时钟才能走时;
          MOV    R7,    #7        ;秒 分 时 日 月 星期 年
          MOV    R1,    #80H      ;秒写地址
S13021:   CLR    csc
          CLR    sclc
          SETB   csc
          MOV    B,     R1        ;写 秒 分 时 日 月 星期 年 地址
          LCALL  RTInputByte
          MOV    A,     @R0       ;写秒数据
          MOV    B,     A
          LCALL  RTInputByte
          INC    R0
          INC    R1
          INC    R1
          SETB   sclc
          CLR    csc
          DJNZ   R7,    S13021
          CLR    csc
          CLR    sclc
          SETB   csc
          MOV    B,     #8EH        ;控制寄存器
          LCALL  RTInputByte
          MOV    B,     #80H        ;控制,WP=1,写保护
          LCALL  RTInputByte
          SETB   sclc
          CLR    csc
          RET
;**********************************************************
;子程序名:Get1302
;功    能:从DS1302 读时间
;说    明:
;调    用:RTInputByte,RTOutputByte
;入口参数:时间保存在:Second,Minute,Hour,Day,Month,Week.YearL
;出口参数:无
;影响资源:A B R0 R1 R4 R7
;设    计:                     日    期:
;修    改:                     日    期:
;**********************************************************
load_time:
Get1302:
          MOV    R0,    #free_park_st+2;
          MOV    R7,    #7
          MOV    R1,    #81H       ;秒地址
G13021:   CLR    csc
          CLR    sclc
          SETB   csc
          MOV    B,     R1        ;秒 分 时 日 月 星期 年 地址
          LCALL  RTInputByte
          LCALL  RTOutputByte
          MOV    @R0,   A         ;秒
          INC    R0
          INC    R1
          INC    R1
          SETB   sclc
          CLR    csc
          DJNZ   R7,    G13021  ;第一次读取

          mov   r0,#free_park_st+10
          MOV    R7,    #7
          MOV    R1,    #81H       ;秒地址
G13022:   CLR    csc
          CLR    sclc
          SETB   csc
          MOV    B,     R1        ;秒 分 时 日 月 星期 年 地址
          LCALL  RTInputByte
          LCALL  RTOutputByte
          MOV    @R0,   A         ;秒
          INC    R0
          INC    R1
          INC    R1
          SETB   sclc
          CLR    csc
          DJNZ   R7,    G13022  ;第二次读取

          mov    r7,#7
          mov    r0,#free_park_st+2
          mov    r1,#free_park_st+10
G13023:   mov    a,@r0
	  mov    temp_ram1,@r1
          cjne   a,temp_ram1,Get1302
	  inc    r0
	  inc    r1
	  djnz   r7,G13023

          mov   r0,#free_park_st+2
          mov   r7,#7
          mov   r1,#second_ram
mov_time_data:
          mov   a,@r0
          mov   @r1,a
          inc   r0
          inc   r1
          djnz  r7,mov_time_data
          RET
;**********************************************************
;功    能:写1302一字节  (内部子程序)
;**********************************************************
RTInputByte:
          MOV    R4,    #8
Inbit1:   MOV    A,     B
          RRC    A
          MOV    B,     A
          MOV    sdac,  C
          SETB   sclc
          CLR    sclc
          DJNZ   R4,   Inbit1
          RET
;**********************************************************
;功    能:读1302一字节  (内部子程序)
;**********************************************************
RTOutputByte:
          MOV    R4,    #8
Outbit1:  MOV    C,     sdac
          RRC    A
          SETB   sclc
          CLR    sclc
          DJNZ   R4,    Outbit1
          RET
;/////////////////////////////////////////////////////////////////////////////
;***************************************************************************
;*****************************************************************
;报警终端地址寻找
;*****************************************************************
;报警终端位置存放到flash里,然后每隔10MS进行检查报警终端的通讯情况,
;如果通讯情况为0表示报警终端断线发送报警命令。
search_alr_ID:       
                     mov   dptr,#0422H
                     mov   r7,#0
                     mov   r6,#0
                     mov   addr_hi,#10H
                     mov   addr_lo,#00
                     mov   addr_ah,#00
send_terminal_ID0:
		     mov   block_cnt,#2
		     mov   r0,#free_park_st
		     call  read_block
		     mov   r0,#free_park_st
		     cjne  @r0,#0CCH,search_alr_ID0
		     inc   r7
		     mov   a,#0CCH
		     movx  @dptr,a
		     inc   dpl
                     inc   r0
                     mov   a,@r0
                     movx  @dptr,a
                     inc   dpl
		     mov   a,r6
		     movx  @dptr,a
		     inc   dpl

search_alr_ID0:      cjne  @r0,#0FFH,search_alr_ID1
                     jmp   search_alr_ID_end
                  
                     
search_alr_ID1:      clr   c
                     mov   a,addr_lo
                     add   a,#64
                     mov   addr_lo,a
                     mov   a,addr_hi
                     addc  a,#0
                     mov   addr_hi,a
		     inc   r6
		     cjne  r6,#255,send_terminal_ID0
      		     
search_alr_ID_end:  

                     ret
                
  

⌨️ 快捷键说明

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