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

📄 ds1302.a51

📁 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 + -