📄 ds1302.a51
字号:
B_SCLK EQU P1.1
B_RST EQU P1.3
B_SIO EQU P1.2
ORG 0000H
MAIN:
MOV SP,#40H
MOV R0,#20H
MOV R2,#7
;LCALL SET_TIME
LCALL GET_TIME
LCALL OPENF_COM
LCALL SEND_COM
; MOV R3,#84H
; LCALL READ_DATA
; LCALL GET_TIME
JMP MAIN
;------------------------------------------------------
;向DS1302发送一个字节,发送数据ACC
;输入:ACC,输出:空
;------------------------------------------------------
SEND_BYTE:
MOV B,R2
MOV R2,#8
SEND_BYTE1:
RRC A
MOV B_SIO,C
SETB B_SCLK
NOP
NOP
CLR B_SCLK
DJNZ R2,SEND_BYTE1
MOV R2,B
RET
;---------------------------------------------------
;从DS1302接受一个字节数据接受数据放入ACC
;输入:空,输出:ACC
;---------------------------------------------------
GET_BYTE:
MOV B,R2
MOV R2,#8
CLR A
GET_BYTE1:
MOV C,B_SIO
RRC A
SETB B_SCLK
NOP
NOP
CLR B_SCLK
DJNZ R2,GET_BYTE1
MOV R2,B
RET
;--------------------------------------------------
;向DS1302写一个数据:写入地址放在R3,写入数据放在ACC
;输入:R3、ACC,输出:空
;--------------------------------------------------
WRITE_DATA:
CLR B_RST
CLR B_SCLK
SETB B_RST
PUSH ACC
MOV A,R3
LCALL SEND_BYTE ;发送地址(R3)
POP ACC
LCALL SEND_BYTE ;发送数据(ACC)
SETB B_SCLK
CLR B_RST
RET
;---------------------------------------------------
;从DS1302读一个数据:要读的地址放R3,读出的数据放ACC
;输入:R3,输出:ACC
;---------------------------------------------------
READ_DATA:
CLR B_RST
CLR B_SCLK
SETB B_RST
MOV A,R3
LCALL SEND_BYTE ;发送地址(R3)
; LCALL DELAY
LCALL GET_BYTE ;接受数据到(ACC)
SETB B_SCLK
CLR B_RST
RET
;-----------------------------------------------------------------------------
;往DS1302写入时钟数据(多字节方式),时钟数据地址
;格式为: 秒 分 时 日 月 星期 年 控制(8421BCD码)
;先写控制字节(在8EH单元写入00),在写命令字0BEH(多字节时钟写),在发送8个字节
;写入数据指针R0(以R0间址)
;输入:@R0,输出:空
;-----------------------------------------------------------------------------
WRITE_CLK:
MOV A,R3
PUSH ACC
MOV R3,#8EH
CLR A
LCALL WRITE_DATA ;控制命令,WP=0,写操作地址:8EH单元写数据0
CLR B_RST
CLR B_SCLK
SETB B_RST
MOV A,#0BEH
LCALL SEND_BYTE ;0BEH:时钟多字节写命令
MOV A,R2
PUSH ACC
MOV R2,#8
WRITE_CLK1:
MOV A,@R0
LCALL SEND_BYTE
INC R0
LCALL DELAY
DJNZ R2,WRITE_CLK1
SETB B_SCLK
CLR B_RST
POP ACC
MOV R3,A
POP ACC
MOV R2,A
RET
;------------------------------------------------------------------------
;读取DS1302时钟数据 时钟数据地址 格式为: 秒 分 时 日 月 星期 年(8421BCD)
;读出来的数据放到R0间地址
;先发送0BFH命令字(多字节时钟读),在读8个字节
;输入:空,输出:@R0
;------------------------------------------------------------------------
READ_CLK:
CLR B_RST
CLR B_SCLK
SETB B_RST
MOV A,#0BFH
LCALL SEND_BYTE ;0BFH:时钟多字节读命令
MOV A,R2
PUSH ACC
MOV R2,#8
READ_CLK1:
LCALL GET_BYTE
MOV @R0,A
INC R0
LCALL DELAY
DJNZ R2,READ_CLK1
SETB B_SCLK
CLR B_RST
POP ACC
MOV R2,A
RET
;-----------------------------------------------------------------------
;往DS1302寄存器数写入数据(多字节方式)
;写的数据指针R0(R0间址)
;先写控制字(在8EH单元写入00),在写0FEH命令字(多字节RAM写),在写31个字节
;输入:@R0,输出:空
;-----------------------------------------------------------------------
WRITE_WORD:
MOV A,R3
PUSH ACC
MOV R3,#8EH
CLR A
LCALL WRITE_DATA ;控制命令,WP=0,写操作,向8EH单元写入数据0
CLR B_RST
CLR B_SCLK
SETB B_RST
MOV A,#0FEH ;0FEH RAM多字节写命令
LCALL SEND_BYTE
MOV A,R2
PUSH ACC
MOV R2,#31
WRITE_WORD1:
MOV A,@R0
LCALL SEND_BYTE
INC R0
LCALL DELAY
DJNZ R2,WRITE_WORD1
SETB B_SCLK
CLR B_RST
POP ACC
MOV R3,A
POP ACC
MOV R2,A
RET
;-------------------------------------------------------------------
;从DS1302寄存器数读出数据(多字节方式)
;读出的数据指针R0(R0间址)
;先发送0FFH命令字(多字节RAM读),在读31个字节
;输入:空,输出:@R0
;--------------------------------------------------------------------
READ_WORD:
CLR B_RST
CLR B_SCLK
SETB B_RST
MOV A,#0FFH ;时钟多字节读命令
LCALL SEND_BYTE ;0FFH RAM多字节读命令
MOV A,R2
PUSH ACC
MOV R2,#31
READ_WORD1:
LCALL GET_BYTE
MOV @R0,A
INC R0
LCALL DELAY
DJNZ R2,READ_WORD1
SETB B_SCLK
CLR B_RST
POP ACC
MOV R2,A
RET
;---------------------------------------------------------------------------------
;设置初始时间 初始时间格式为: 秒 分 时 日 月 星期 年(8421BCD码)
;初始时间放入R0间址域
;先写控制字(在8EH单元写入00),然后从80H写入7个时间字节(地址每次加2),然后在发控制字
;输入:@R0,输出:空
;----------------------------------------------------------------------------------
SET_TIME:
MOV A,R3
PUSH ACC
MOV R3,#8EH
CLR A
LCALL WRITE_DATA
MOV R3,#80H
MOV R2,#7
SET_TIME1:
MOV A,@R0
LCALL WRITE_DATA
INC R0
INC R3
INC R3
LCALL DELAY
DJNZ R2,SET_TIME1
MOV R3,#8EH
MOV A,#80H
LCALL WRITE_DATA
POP ACC
MOV R3,A
RET
;--------------------------------------------------------------
;读当前时间 当前时间格式为: 秒 分 时 日 月 星期 年(8421BCD码)
;读到R0间址
;从81H读出来当前时钟(每读一个字节地址加2)
;输入:空,输出:@R0
;--------------------------------------------------------------
GET_TIME:
MOV A,R3
PUSH ACC
MOV R3,#81H
MOV R2,#7
GET_TIME1:
LCALL READ_DATA
MOV @R0,A
INC R0
INC R3
INC R3
;LCALL DELAY
DJNZ R2,GET_TIME1
POP ACC
MOV A,R3
RET
DELAY:
DB 0,0,0,0
RET
OPENF_COM:
MOV TH1,#0FAH
MOV TL1,#0FAH
MOV SCON,#50H
MOV TMOD,#20H
ANL PCON,#7FH
MOV IP,#10H
CLR ES
SETB TR1
CLR EA
RET
SEND_COM:
MOV B,R2
MOV R2,#7
MOV R0,#20H
SEND_COM1:
CLR TI
MOV A,@R0
MOV SBUF,A
SEND_COM2:
JB TI,SEND_COM3
JMP SEND_COM2
SEND_COM3:
INC R0
DJNZ R2,SEND_COM1
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -