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

📄 sqcomm51.msa

📁 51串行令牌格式 a51编译 Read data from serial port and write into buffer DPTR pointed in XRAM if a data
💻 MSA
📖 第 1 页 / 共 3 页
字号:
		RET

;============================== Subrouting defination ============================
;ST_INSERT:	insert a station from net.
;Input		ACC [XXXXssss] ssss is the address of station to be inserted
;Output 	none

ST_INSERT:	MOV	MODIFY_ADDR,A
		ANL	A,#SOURCE
		MOV	R0,#ALL_STATION
		ADD	A,R0
		MOV	R0,A
		MOV	A,@R0
		ORL	A,#80H			; active soource station
		MOV	@R0,A
		SETB	INSERT_MK
		RET

;============================== Subrouting defination ============================
;SYS_SYNCHRO	system to be synchronized
;Input		ACC [XXXXssss] ssss is the address of station send command
;Output 	none

SYS_SYNCHRO:	SETB	SYNCHRO_MK
		SETB	USER_SYN
		RET


;============================== Subrouting defination ============================
;ST_RESET:	resett all station in net.
;Input		ACC [XXXXssss] ssss is the address of station to be inserted
;Output 	none

ST_RESET:	SETB	RESET_MK
		RET

;============================== Subrouting defination ============================
;NET_HELLO:	first call from lowest address station
;Input		none
;Output 	none

NET_HELLO:	JNB	TOKEN,NET_H_RET 	; no token return
		MOV	A,#HELLO
		CALL	NET_COMMAND
NET_H_RET:	RET

;============================== Subrouting defination ============================

;FIND_ACTIVE:	Initial network
;Input		none
;Output 	CY=0 find, CY=1 not find, ACC= first active station address
FIND_ACTIVE	MOV	R0,#ALL_STATION
		MOV	R7,#15
FIND_LOOP:	MOV	A,@R0
		MOV	C,ACC.7
		ANL	A,#SOURCE
		JC	FIND_RET
		INC	R0
		DJNZ	R7,FIND_LOOP
FIND_RET:	RET

;============================== Subrouting defination ============================

;NET_INIT:	Initial network
;Input		none
;Output 	none

NET_INIT:	SETB	IN_BUF_EMPT
		SETB	OUT_BUF_EMPT		; tow buffers empty now
		SETB	TOKEN_ACK
		SETB	DATA_ACK
		CALL	MY_DELAY		; Station delay
		JB	FIRST_TOKEN,HELLOED	; if not first token station jump

POWER_ON_OK:	CJNE	A,#ST_NO0,NOT_ST0
		SJMP	HELLOED

NOT_ST0:	SETB	TOKEN			; Make token
		CLR	TOKEN_ACK		; set no token ACK mark
		CALL	NET_HELLO		; make first calling
		CALL	NET_HELLO		; once more
		CALL	NET_HELLO		; once more again

HELLOED:	MOV	A,ST_ADDR		; get my address
		CALL	NET_INSERT		; insert my station into network
		MOV	A,ST_ADDR		; get my address
		CALL	NET_INSERT		; insert my station once more
		MOV	A,ST_ADDR		; get my address
		CALL	NET_INSERT		; insert my station once more again
		CALL	MY_DELAY1		; delay for hello
		MOV	A,ST_ADDR		; Get address in ACC
		CALL	NEXT_TOKEN		; find next station token to be passed
		CALL	MAKE_ACK_FRAME
		CALL	RESET_TIMER2
		SETB	TR2			; Turn the timer2 on
		SETB	NET_GOOD		; net initialization completed
		RET

;============================== Subrouting defination ============================

;NET_OUT_TEXT:	counter the string length and write to nwtwork
;Input: 	DPTR point to start of string ( MAX. length is 253 )
;		ending by 00H
;		ACC=FOF [dest.0000] or [0000.dest] or [dest.dest]
;Output:	C=0 successfull , C=1 failure( no data in buffer )
;		Modify pointer INS_BO
;Invoke:	FRAME_WRITE

NET_OUT_TEXT:	PUSH	DPH
		PUSH	DPL
		PUSH	ACC
		MOV	R7,#0			; clear counter
TEXT_LOOP:	CLR	A
		MOVC	A,@A+DPTR
		JZ	END_TEXT
		INC	R7
		INC	DPTR
		SJMP	TEXT_LOOP
END_TEXT:	POP	ACC
		POP	DPL
		POP	DPH
		CALL	FRAME_WRITE
		RET

;============================== Subrouting defination ============================

;GET_STATUS:	return net ststua
;Input		none
;Output 	ACC.7 = 1 : net line failure
;		ACC.6 = 1 : no data ACK
;		ACC.5 = 1 : no destinatin station
;		ACC.4 = 1 : receiving out of time
;		ACC.3 = 1 : input buffer full
;		ACC.2 = 1 : input buffer empty
;		ACC.1 = 1 : output buffer full
;		ACC.0 = 1 : output buffer empty

GET_STATUS:	MOV	C,NET_LINE_ERR
		MOV	ACC.7,C
		MOV	C,DATA_ACK
		MOV	ACC.6,C
		MOV	C,NO_DEST_ST
		MOV	ACC.5,C
		MOV	C,R_OUT_TIME
		MOV	ACC.4,C
		MOV	C,IN_BUF_FULL
		MOV	ACC.3,C
		MOV	C,IN_BUF_EMPT
		MOV	ACC.2,C
		MOV	C,OUT_BUF_FULL
		MOV	ACC.1,C
		MOV	C,OUT_BUF_EMPT
		MOV	ACC.0,C
		RET

;============================== Subrouting defination ============================

;NEXT_TOKEN:	Find next station TOKEN to be passed
;Input: 	none
;Output:	none

NEXT_TOKEN:	MOV	A,ST_ADDR
		ANL	A,#SOURCE
		ADD	A,#ALL_STATION
		MOV	R0,A
		MOV	R7,#15			; other 15 stations
NEXT_FIND:	INC	R0			; pointe to next station
		MOV	A,R0
		CJNE	A,#ALL_STATION+16,ADDR_OVER
		MOV	R0,#ALL_STATION
ADDR_OVER:	MOV	A,@R0
		JB	ACC.7,FIND_STATION	; if station active
		DJNZ	R7,NEXT_FIND
		MOV	A,ST_ADDR		; there is one station only
FIND_STATION:	ANL	A,#SOURCE
		SWAP	A
		MOV	NEXT_ADDR,A		; save next station token to be passed
		CALL	MAKE_TOKEN_F		; make token frame
		RET

;============================== Interrupt sevice defination ============================

SERIAL: 	PUSH	PSW
		PUSH	ACC
		PUSH	DPH
		PUSH	DPL
		SETB	RS0
		CLR	RS1			; Use REG. bank 1

		CALL	SERIAL_READ		; Get a hardwire frame into buf.
		JNC	ADDRESS_OK		; address match jump
		JNB	NET_GOOD,SERIAL_RET2
		JMP	NORMAL_RET		; address not match jump

SERIAL_RET2:	JNZ	NORMAL_RET1
		JB	R_OUT_TIME,NORMAL_RET1
		MOV	A,R4
		SWAP	A
		XRL	A,R4
		JNZ	NORMAL_RET1
		MOV	A,R6			; ACC <= FOF
		ANL	A,#SOURCE		; get sourcer address
		MOV	R6,A			; save source address
		ADD	A,#ALL_STATION
		MOV	R0,A
		MOV	A,R4
		MOV	R4,#0
		CJNE	A,#TOKEN_PASSING,NO_TOKEN1
		SJMP	ST_ACTIVE
NO_TOKEN1:	CJNE	A,#DATA,OT_TOKEN
ST_ACTIVE:	MOV	R4,#ACTIVE
OT_TOKEN:	MOV	A,R6			; restore source address
		ORL	A,R4
		MOV	@R0,A			; save active station in table
NORMAL_RET1:	JMP	NORMAL_RET

ADDRESS_OK:	JZ	RECEIVE_RIGHT
SEND_RRJ:	MOV	A,R6
		ANL	A,#DEST
		XRL	A,#DEST
		JNZ	SEND_RRJ1
		JMP	NORMAL_RET		; if global address return
SEND_RRJ1:	MOV	DPTR,#FRAME_REJECT	; check sum bad
		MOV	A,R6
		ANL	A,#SOURCE
		SWAP	A
		MOV	R6,A
		MOV	A,ST_ADDR
		ANL	A,#SOURCE
		ORL	A,R6
		MOVX	@DPTR,A
		JMP	SERIAL_OUT		; for receiving retransmition

RECEIVE_RIGHT:	MOV	A,R4			; ACC <= control byte
		SWAP	A
		XRL	A,R4
		JNZ	SEND_RRJ		; a ivalide control byte
		MOV	A,#SOURCE
		ANL	A,R4
		MOV	R4,A
		ADD	A,ACC
		ADD	A,R4			; for index a long jump
		MOV	DPTR,#COMMAND_DECODE
		JMP	@A+DPTR

NO_DATA_F:	JMP	NORMAL_RET

DATA_F: 	CLR	IN_BUF_EMPT		; Buffer id not empty (in used)
;@@		JB	IN_BUF_FULL,SEND_RRJ
		JB	IN_BUF_FULL,RECEIVE_ACK
		MOV	R3,INS_BI+1
		MOV	R2,INS_BI+0
		MOV	R5,REM_BI+1
		MOV	R4,REM_BI+0

		CALL	SUB16			; R3.R2 <= insert - remove
		JNC	NO_OVER_ROLL
		CALL	CPL16
		JMP	BUF_ROL2
NO_OVER_ROLL:	MOV	A,R3
		MOV	R5,A
		MOV	A,R2
		MOV	R4,A
		MOV	R3,#HIGH(BI_LENGTH*BIF_NUM)
		MOV	R2,#LOW(BI_LENGTH*BIF_NUM)
		CALL	SUB16
BUF_ROL2:	MOV	A,R3
		JNZ	RECEIVE_ACK		; for next frmae jump
		SETB	IN_BUF_FULL		; Buffer active room not enough
;@@		JMP	SEND_RRJ
;@@		JMP	NORMAL_RET

RECEIVE_ACK:	MOV	DPTR,#FRAME_RRDY	; receive ready
		MOV	A,R6
		ANL	A,#SOURCE
		SWAP	A
		MOV	R6,A
		MOV	A,ST_ADDR
		ANL	A,#SOURCE
		ORL	A,R6
		MOVX	@DPTR,A
		JMP	SERIAL_OUT

TOKEN_PASS_F:	MOV	SEND_TIMES,#0
		SETB	TOKEN
		MOV	A,R6
		ANL	A,#SOURCE
		SWAP	A
		MOV	R6,A
		MOV	A,ST_ADDR
		ANL	A,#SOURCE
		ORL	A,R6
		MOV	DPTR,#FRAME_T_ACK
		MOVX	@DPTR,A
		CALL	SERIAL_WRITE		; send receiving TOKEN ACK
		CALL	RESET_TIMER2

		JBC	REMOVE_MK,REMOVE_ONE
		JBC	INSERT_MK,INSERT_ONE
		JBC	RESET_MK,RESET_ONE
DATA_F_OUT:	JBC	SYNCHRO_MK,SYN_ALL

		JB	DATA_ACK,DATA_FRAME_O	; if there is ACK jump
		JMP	SENDING 		; if there is no ACK. retry

SYN_ALL:	MOV	A,MODIFY_ADDR
		CALL	SYS_SYN
		MOV	A,MODIFY_ADDR
		CALL	SYS_SYN
		JMP	DATA_F_OUT

REMOVE_ONE:	MOV	A,MODIFY_ADDR		; other station address
		CALL	NET_REMOVE
		MOV	A,MODIFY_ADDR		; other station address
		CALL	NET_REMOVE
		MOV	A,MODIFY_ADDR		; other station address
		CALL	NET_REMOVE
		JMP	DATA_F_OUT

INSERT_ONE:	MOV	A,MODIFY_ADDR		; other station address
		CALL	NET_INSERT
		MOV	A,MODIFY_ADDR		; other station address
		CALL	NET_INSERT
		MOV	A,MODIFY_ADDR		; other station address
		CALL	NET_INSERT
		JMP	DATA_F_OUT

RESET_ONE:	MOV	A,#RESTART
		CALL	NET_COMMAND
		MOV	A,#RESTART
		CALL	NET_COMMAND
		JMP	RESTART_F

DATA_FRAME_O:	INC	SEND_TIMES
		MOV	A,SEND_TIMES
		CJNE	A,#MAX_SEND,SEND_DATA
		DEC	SEND_TIMES
		SETB	DATA_ACK
		JMP	TOKEN_PASSED

SEND_DATA:	MOV	A,ST_ADDR
		ANL	A,#SOURCE
		ADD	A,#ALL_STATION
		MOV	R0,A
		MOV	A,@R0			; get my active mark adn address
		JB	ACC.7,ACTIVE_ONE	; if station active jump
		JMP	NORMAL_RET

ACTIVE_ONE:	CALL	FRAME_OUT		; read data frame from output buffer
						; and write into frame buffer
		JNC	SENDING 		; sending data

TOKEN_PASSED:	CLR	TOKEN
		CLR	TOKEN_ACK		; no token ACL mark
		SETB	TOKEN_RETRY_MK
		JNB	FIRST_TOKEN,NORMAL_RET	; if first station return
		MOV	DPTR,#FRAME_TOKEN	; token passing
		SJMP	SERIAL_OUT		; passing token only

REJECT_F:	JNB	DATA_ACK,SENDING
		JNB	TOKEN_ACK,TOKEN_PASSED
		JMP	NORMAL_RET

RRDY_F: 	SETB	DATA_ACK
		MOV	RETRY_D,#0		; clrear retry counter
		JNB	TOKEN,NORMAL_RET	; if no token jump
		SJMP	DATA_FRAME_O

INSERT_F:	MOV	A,R6			; ACC <= FOF
		ANL	A,#SOURCE		; get sourcer address
		MOV	R7,A			; save source address
		ADD	A,#ALL_STATION
		MOV	R0,A
		MOV	A,R7			; restore source address
		ORL	A,#ACTIVE
		MOV	@R0,A			; save active station in table
		CALL	NEXT_TOKEN		; modify next station addres
		SJMP	NORMAL_RET

REMOVE_F:	MOV	A,R6			; ACC <= FOF
		ANL	A,#SOURCE		; get sourcer address
		MOV	R7,A			; save sourcer address
		ADD	A,#ALL_STATION
		MOV	R0,A
		MOV	A,R7			; restore source address
		MOV	@R0,A			; save disactive station in table
		CALL	NEXT_TOKEN		; modify next station addres
		SJMP	NORMAL_RET

RESTART_F:	CLR	A			; disable interrupt all
		MOV	IE,A
		MOV	IP,A
		MOV	P1,#0FFH
		MOV	TMOD,A
		MOV	TCON,A
		MOV	T2CON,A
		MOV	SCON,A
		MOV	PCON,A
		MOV	PSW,A
;;		MOV	SP,#7

		MOV	DPTR,#RESTART1
		PUSH	DPL
		PUSH	DPH
		RETI
RESTART1:	MOV	DPTR,#RESET
		PUSH	DPL
		PUSH	DPH
		RETI

HELLO_F:	JB	NET_GOOD,NORMAL_RET
		CLR	TOKEN
		SETB	FIRST_TOKEN		; has been helloed
		SJMP	NORMAL_RET

TOKEN_RRDY_F:	SETB	TOKEN_ACK		; token passing ACK
		MOV	TOKEN_GENERATOR,#0
		MOV	RETRY_T,#0
		JMP	NORMAL_RET

TEST_BB_OUT_F	JMP	NORMAL_RET	       ; unknow command rejection
;		...
;		...

SENDING:	MOV	DPTR,#FRAME_BUFFER	; point to out buffer
		CLR	DATA_ACK
SERIAL_OUT:	CALL	SERIAL_WRITE		; Acknowledge rejection
NORMAL_RET:	POP	DPL
		POP	DPH
		POP	ACC
		POP	PSW
SERIAL_RET:	RETI

COMMAND_DECODE: LJMP	NO_DATA_F
		LJMP	RRDY_F
		LJMP	REJECT_F
		LJMP	INSERT_F
		LJMP	REMOVE_F
		LJMP	TOKEN_PASS_F
		LJMP	DATA_F
		LJMP	RESTART_F
		LJMP	HELLO_F
		LJMP	SYNCHRONIZE_F
		LJMP	TOKEN_RRDY_F
		LJMP	TEST_BB_OUT_F
		LJMP	NO_COMMAND2_F
		LJMP	NO_COMMAND3_F
		LJMP	NO_COMMAND4_F
		LJMP	NO_COMMAND5_F

SYNCHRONIZE_F:	SETB	USER_SYN		; set system synchronize mark
		JMP	NORMAL_RET

NO_COMMAND2_F:
NO_COMMAND3_F:
NO_COMMAND4_F:
NO_COMMAND5_F:	JMP	NORMAL_RET

;============================== Interrupt sevice defination ======================

TIMER_2:	CLR	TF2			;reset timer2 interrupt
		PUSH	PSW
		PUSH	ACC
		PUSH	DPH
		PUSH	DPL
		SETB	RS0
		SETB	RS1			; use REG. bank3

		JBC	REMOVE_MK,REMOVE_ONE1
		JBC	INSERT_MK,INSERT_ONE1
		JBC	RESET_MK,RESET_ONE1
		JBC	SYNCHRO_MK,SYN_ALL1

		MOV	A,ST_ADDR
		ANL	A,#SOURCE
		ADD	A,#ALL_STATION
		MOV	R0,A
		MOV	A,@R0			; get my active mark adn address
		JNB	ACC.7,OUT_TIME_RET	; if station disactive return

		JNB	TOKEN_ACK,ONLY_PASS_T	; no token ACK pass token again
		JNB	DATA_ACK,ONLY_RRJ	; if no ACK return
ONLY_PASS_T:	JB	TOKEN_RETRY_MK,ONLY_PASS_T1
		MOV	A,ST_ADDR
		ANL	A,#SOURCE
		ADD	A,#2

		INC	TOKEN_GENERATOR
		CJNE	A,TOKEN_GENERATOR,OUT_TIME_RET
		MOV	TOKEN_GENERATOR,#0
;		MOV	A,#MAX_RETRY_T
;		INC	RETRY_T
;		CJNE	A,RETRY_T,ONLY_PASS_T
;		MOV	RETRY_T,#0
;		MOV	A,NEXT_ADDR		; get next station address
;		SWAP	A
;		CALL	NET_REMOVE		; remove the station token to be passed
;		CLR	TOKEN_RETRY_MK

ONLY_PASS_T1:	JB	FIRST_TOKEN,OUT_TIME_RET; if not first token jump
		CLR	TOKEN_RETRY_MK
		MOV	DPTR,#FRAME_TOKEN	; token passing
		JMP	OUT_TIME_SEND

SYN_ALL1:	MOV	A,MODIFY_ADDR
		CALL	SYS_SYN
		MOV	A,MODIFY_ADDR
		CALL	SYS_SYN
		JMP	OUT_TIME_RET

REMOVE_ONE1:	MOV	A,MODIFY_ADDR		; other station address
		CALL	NET_REMOVE
		MOV	A,MODIFY_ADDR		; other station address
		CALL	NET_REMOVE
		MOV	A,MODIFY_ADDR		; other station address
		CALL	NET_REMOVE
		JMP	OUT_TIME_RET

INSERT_ONE1:	MOV	A,MODIFY_ADDR		; other station address
		CALL	NET_INSERT
		MOV	A,MODIFY_ADDR		; other station address
		CALL	NET_INSERT
		MOV	A,MODIFY_ADDR		; other station address
		CALL	NET_INSERT
		JMP	OUT_TIME_RET

RESET_ONE1:	MOV	A,#RESTART
		CALL	NET_COMMAND
		MOV	A,#RESTART
		CALL	NET_COMMAND
		JMP	RESTART_F

ONLY_RRJ:	INC	RETRY_D 		; increace retry times
		MOV	A,RETRY_D
		CJNE	A,#MAX_RETRY_D,RETRY_AGAIN
		MOV	RETRY_D,#0
		SETB	DATA_ACK		; set ACK ok
RETRY_AGAIN:	MOV	DPTR,#FRAME_BUFFER	; point to out buffer

OUT_TIME_SEND:	CALL	SERIAL_WRITE
OUT_TIME_RET:	POP	DPL
		POP	DPH
		POP	ACC
		POP	PSW
		RETI

;================================= Main program ==================================

START:		%DISABLE_TXD			; Disable bit bus output
		MOV	A,SP
		XRL	A,#07H
		MOV	R7,A			; save reset status
						; R7 = 0 : hardware reset
						; R7 <> 0: software reset
		MOV	SP,#Istack_begin	; From low to high addresses
;		MOV	R0,#STK_BOTTOM-1
		MOV	R0,#Istack_begin
		CALL	CLR_IRAM		; Clear the on-chip ram from 20 to stktop

		CALL	SYS_INIT		; Initialize MCS_51 for system
		CALL	NET_INIT		; Initialize network for system
		JMP	MAIN

FRAME_REJECT_K	DB	0FFH
		DB	REJECT			; reject command byte

FRAME_RRDY_K	DB	0FFH
		DB	RRDY			; receive ready command byte

FRAME_T_ACK_K	DB	0FFH
		DB	TOKEN_RRDY		; token passing ACK

		END

⌨️ 快捷键说明

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