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

📄 vs1307.asm

📁 关于温度传感器和电机测速的单片机程序
💻 ASM
字号:
	NAME	READBYT
	PUBLIC	WriteTim
	PUBLIC	ReadTim

	SCL 	BIT P3.6
	SDA 	BIT P3.7
	
	DS1307W EQU 0D0H
	DS1307R EQU 0D1H


VS1307	SEGMENT CODE 
	RSEG  VS1307
;-------------------------------------------------------------------------
; THESE SUB SENDS THE START & STOP CONDITIONS
;-------------------------------------------------------------------------
SEND_START:
	SETB 	SDA
	LCALL 	SCL_HIGH 	; SDA
	CLR 	SDA
	LCALL 	DELAY 		; SCL ^START CONDITION
	CLR 	SCL
	RET
SEND_STOP:
	CLR 	SDA 		; SDA
	LCALL 	SCL_HIGH ;
	SETB 	SDA 		; SCL ^STOP CONDITION
	RET
;-------------------------------------------------------------------------
; THIS SUB SENDS ONE BYTE OF DATA TO THE DS1307
;-------------------------------------------------------------------------
SEND_BYTE:
	PUSH	B
	MOV 	B,#08H 		; SET COUNTER FOR 8 BITS
SB_LOOP:
	RLC 	A 		; CHECK TO SEE IF BIT 7 OF ACC IS A 1
	MOV	SDA,C
	LCALL 	SCL_HIGH 	; TRANSITION SCL LOW蠺O蠬IGH
	CLR 	SCL 		; TRANSITION SCL HIGH蠺O蠰OW
	DJNZ 	B,SB_LOOP 	; LOOP FOR 8 BITS
	SETB 	SDA 		; SET SDA HIGH TO LOOK FOR ACKNOWLEDGE PULSE
	LCALL 	SCL_HIGH 	; TRASITION SCL LOW TO HIGH

	MOV	C,SDA
	LCALL 	DELAY 		; DELAY FOR AN OPERATION
	CLR 	SCL 		; TRANSITION SCL  HIGH O蠰OW
	LCALL 	DELAY 		; DELAY FOR AN OPERATION
	POP	B
	RET
;-------------------------------------------------------------------------
; THIS SUB READS ONE BYTE OF DATA FROM THE DS1307
;-------------------------------------------------------------------------
READ_BYTE:
	PUSH	B
	MOV 	B,#08H 		; SET COUNTER FOR 8 BITS OF DATA
	MOV 	A,#00H
	SETB 	SDA 		; SET SDA HIGH TO ENSURE LINE FREE
READ_BITS:
	LCALL 	SCL_HIGH 	; TRANSITION SCL LOW蠺O蠬IGH
	MOV 	C,SDA 		; MOVE DATA BIT INTO CARRY BIT
	RLC 	A 		; ROTATE CARRY BIT INTO ACC.0
	CLR 	SCL 		; TRANSITION SCL HIGH蠺O蠰OW
	DJNZ 	B,READ_BITS 	; LOOP FOR 8 BITS
	CLR 	SDA 		; ACKNOWLEDGE BIT
	LCALL 	SCL_HIGH 	; PULSE SCL TO TRANSIMIT ACKNOWLEDGE
	CLR 	SCL 		; OR NOT ACKNOWLEDGE BIT
	POP	B
	RET

READ_LAST:
	PUSH	B
	MOV 	B,#08H 		; SET COUNTER FOR 8 BITS OF DATA
	MOV 	A,#00H
	SETB 	SDA 		; SET SDA HIGH TO ENSURE LINE FREE
R8_BITS:
	LCALL 	SCL_HIGH 	; TRANSITION SCL LOW蠺O蠬IGH
	MOV 	C,SDA 		; MOVE DATA BIT INTO CARRY BIT
	RLC 	A 		; ROTATE CARRY BIT INTO ACC.0
	CLR 	SCL 		; TRANSITION SCL HIGH蠺O蠰OW
	DJNZ 	B,R8_BITS 	; LOOP FOR 8 BITS
	SETB	SDA
	LCALL 	SCL_HIGH 	; PULSE SCL TO TRANSIMIT ACKNOWLEDGE
	CLR 	SCL 		; OR NOT ACKNOWLEDGE BIT
	POP	B
	RET
;-------------------------------------------------------------------------
; THIS SUB SETS THE CLOCK LINE HIGH
;-------------------------------------------------------------------------
SCL_HIGH:
	SETB 	SCL 		; SET SCL HIGH
	JNB 	SCL,$ 		; LOOP UNTIL STRONG 1 ON SCL
	RET
;-------------------------------------------------------------------------
; DELAY & DELAY_4 to lower THE BUS
;-------------------------------------------------------------------------
DELAY:	NOP 			; DELAY FOR BUS TIMING
	RET
DELAY_4:
	NOP 			; DELAY FOR BUS TIMING
	NOP
	NOP
	NOP
	RET
;-------------------------------------------------------------------------
; THIS SUB READS THE CLOCK AND WRITES IT TO THE SCRATCH PAD MEMORY ;
;-------------------------------------------------------------------------
ReadTim:
	LCALL 	SEND_START 	; SEND START CONDITION
	MOV 	A,#DS1307W 	; SET POINTER TO REG 00H ON DS1307
	LCALL 	SEND_BYTE
	MOV 	A,#00H
	LCALL 	SEND_BYTE
	LCALL 	SEND_STOP 	; SEND STOP CONDITION

	LCALL 	SEND_START 	; SEND START CONDITION
	MOV 	A,#DS1307R 	; SEND READ COMMAND TO DS1307
	LCALL 	SEND_BYTE
	
	MOV	R0,#20H
	MOV	B,#07h
READ0_6:
	LCALL 	READ_BYTE 	; READ A BYTE OF DATA
	MOV 	@R0,A 		; MOVE DATA IN SCRATCHPAD MEMORY
	INC	R0
	DJNZ	B,READ0_6
READ7:
	LCALL 	READ_LAST	
	MOV 	@R0,A 		; MOVE DATA IN SCRATCHPAD MEMORY
	INC	R0
;-------------------------------------------------------------------------
; THIS SUB SETS THE CLOCK (MANUAL)
;-------------------------------------------------------------------------
WriteTim:
	MOV 	R0,#20H 	; POINT TO BEGINNING OF CLOCK DATA IN SCRATCHPAD MEMORY
	LCALL 	SEND_START 	; SEND 2WIRE START CONDITION
	MOV 	A,#DS1307W 	; SEND DS1307 WRITE COMMAND
	LCALL 	SEND_BYTE
	MOV 	A,#00H 		; SET DATA POINTER TO REGISTER 00H ON
	LCALL 	SEND_BYTE 	; THE DS1307
	MOV	B,#08h	
SEND_LOOP:
	MOV 	A,@R0 		; MOVE THE FIRST BYTE OF DATA TO ACC
	LCALL 	SEND_BYTE 	; SEND DATA ON 2WIRE BUT
	INC 	R0
	DJNZ	B,SEND_LOOP 	; LOOP UNTIL CLOCK DATA SENT TO DS1307
	LCALL 	SEND_STOP 	; SEND 2WIRE STOP CONDITION
	RET
	END

	

⌨️ 快捷键说明

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