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

📄 c34dsio.asm

📁 MDOBUS-RTU通讯规约C51汇编程序
💻 ASM
📖 第 1 页 / 共 2 页
字号:
	 inc	   r0
	 mov	   a,        @r0
	 mov       r6,	     a
	 inc	   r0
	 call	   eewr2h
	 inc	   r5
	 inc	   r5
	 djnz	   r4,       SetP4
	 call	   WREN_CMD
	 MOV	   R6,	     #SR_NORM       ; watchdog 1.4s protect 100--1ffh ee
	 call	   WRSR_CMD
	 SETB	   EWOK		            ; EEPROM is not admitted to write
         clr       xwp
SetPEnd: setb	   es
	 ret
;============================================
;        地址错误应答
;--------------------------------------------
ErrorAnswer:
         mov	   r0,       #ComBufferAd+2
         mov       @r0,      #0ffh          ; 没有相应卡错误
         mov       r3,       #3
         call      WriteReadOkAnswer        ; 发送ComBufferAd中应答信息
         ret
;===========================================
;        slave应答(发送)
; input :r3 byte num. (except CRC)
; 发送commbuffer中应答信息
; using  r0,r3
;-------------------------------------------
WriteReadOkAnswer:
         MOV       CRCLo,    #0FFH
         MOV       CRCHi,    #0FFH
	 MOV       A,        #ComBufferAd
	 MOV	   R0,       A
	 SETB	   SioTxRx
WOA1:	 MOV	   A,        @R0
	 CALL      SendByte_CRC
	 INC       R0
	 DJNZ	   R3,       WOA1
	 MOV       A,        CRCLo
	 CALL      SendByte
	 MOV       A,        CRCHi
	 CALL      SendByte
	 RET

;===========================================
;INPUT : A = byte num. to be transed
;output: bCRCOk
;-------------------------------------------
CheckCRC:
	 mov       CRCLo,    #0ffh
	 mov       CRCHi,    #0ffh
	 mov       r3,       a
	 mov	   r0,       #ComBufferAd
CkCRC1:	 mov       a,        @r0
	 call      ProduceCRC
         inc       r0
	 djnz	   r3,       CkCRC1
         mov       a,        @r0
         xrl       a,        CRCLo
         jnz       CkCRCEr
         inc       r0
         mov       a,        @r0
         xrl       a,        CRCHi
         jnz       CkCRCEr
         setb      bCRCOk
	 ret
CkCRCEr: clr       bCRCOk
         ret
;===========================================
;input : a = new data
;output: CRCHi CRCLo
;-------------------------------------------
ProduceCRC:
         push      dph
         push      dpl
         xrl       a,        CRCLo
         push	   acc                      ; a =iIndax
         mov	   dptr,     #GetCRCLo
         movc	   a,        @a+dptr
         xrl       a,        CRCHi
         mov	   CRCLo,    a
         pop	   acc                      ; a =iIndax
         mov	   dptr,     #GetCRCHi
         movc	   a,        @a+dptr
         mov	   CRCHi,    a
         pop       dpl
         pop       dph
         ret
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;===========================================
;        接收R3字节
; input : r3 receive num.,r0 buffer pointer
; output: bReceiveEr,r0 point to next
;         A=last byte
; using : r0,r3,r6,r7
;-------------------------------------------
ReceiveSub:
	 MOV	   R7,	     #7FH
Rece2:	 MOV	   R6,	     #0FFH
Rece3:	 JNB	   RI,	     Rece4
	 CLR	   RI
	 MOV	   A,	     SBUF
	 MOV	   @R0,      A
	 INC	   R0
	 DJNZ	   R3,	     ReceiveSub
	 CLR       bReceiveEr
	 JMP       Rece5
Rece4:	 DJNZ	   R6,	     Rece3
	 DJNZ	   R7,	     Rece2
	 SETB	   bReceiveEr
Rece5:    RET
;===========================================
;        字节发送
;-------------------------------------------
SendByte_CRC:
         PUSH      ACC
         CALL      ProduceCRC
         POP       ACC
SendByte:MOV	   SBUF,     A
	 JNB	   TI,	     $
	 CLR	   TI
	 RET
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;--------------------------------------------------------------------------------------------------
;        CRC低位字节值表
;--------------------------------------------------------------------------------------------------
GetCRCLo:db    00h,0C1h, 81h, 40h, 01h,0C0h, 80h, 41h, 01h,0C0h, 80h, 41h, 00h,0C1h, 81h, 40h
         db    01h,0C0h, 80h, 41h, 00h,0C1h, 81h, 40h, 00h,0C1h, 81h, 40h, 01h,0C0h, 80h, 41h
         db    01h,0C0h, 80h, 41h, 00h,0C1h, 81h, 40h, 00h,0C1h, 81h, 40h, 01h,0C0h, 80h, 41h
         db    00h,0C1h, 81h, 40h, 01h,0C0h, 80h, 41h, 01h,0C0h, 80h, 41h, 00h,0C1h, 81h, 40h
         db    01h,0C0h, 80h, 41h, 00h,0C1h, 81h, 40h, 00h,0C1h, 81h, 40h, 01h,0C0h, 80h, 41h
         db    00h,0C1h, 81h, 40h, 01h,0C0h, 80h, 41h, 01h,0C0h, 80h, 41h, 00h,0C1h, 81h, 40h
         db    00h,0C1h, 81h, 40h, 01h,0C0h, 80h, 41h, 01h,0C0h, 80h, 41h, 00h,0C1h, 81h, 40h
         db    01h,0C0h, 80h, 41h, 00h,0C1h, 81h, 40h, 00h,0C1h, 81h, 40h, 01h,0C0h, 80h, 41h
         db    01h,0C0h, 80h, 41h, 00h,0C1h, 81h, 40h, 00h,0C1h, 81h, 40h, 01h,0C0h, 80h, 41h
         db    00h,0C1h, 81h, 40h, 01h,0C0h, 80h, 41h, 01h,0C0h, 80h, 41h, 00h,0C1h, 81h, 40h
         db    00h,0C1h, 81h, 40h, 01h,0C0h, 80h, 41h, 01h,0C0h, 80h, 41h, 00h,0C1h, 81h, 40h
         db    01h,0C0h, 80h, 41h, 00h,0C1h, 81h, 40h, 00h,0C1h, 81h, 40h, 01h,0C0h, 80h, 41h
         db    00h,0C1h, 81h, 40h, 01h,0C0h, 80h, 41h, 01h,0C0h, 80h, 41h, 00h,0C1h, 81h, 40h
         db    01h,0C0h, 80h, 41h, 00h,0C1h, 81h, 40h, 00h,0C1h, 81h, 40h, 01h,0C0h, 80h, 41h
         db    01h,0C0h, 80h, 41h, 00h,0C1h, 81h, 40h, 00h,0C1h, 81h, 40h, 01h,0C0h, 80h, 41h
         db    00h,0C1h, 81h, 40h, 01h,0C0h, 80h, 41h, 01h,0C0h, 80h, 41h, 00h,0C1h, 81h, 40h
;--------------------------------------------------------------------------------------------------
;        CRC高位字节值表
;--------------------------------------------------------------------------------------------------
GetCRCHi:db    00h,0C0h,0C1h, 01h,0C3h, 03h, 02h,0C2h,0C6h, 06h, 07h,0C7h, 05h,0C5h,0C4h, 04h
         db   0CCh, 0Ch, 0Dh,0CDh, 0Fh,0CFh,0CEh, 0Eh, 0Ah,0CAh,0CBh, 0Bh,0C9h, 09h, 08h,0C8h
         db   0D8h, 18h, 19h,0D9h, 1Bh,0DBh,0DAh, 1Ah, 1Eh,0DEh,0DFh, 1Fh,0DDh, 1Dh, 1Ch,0DCh
         db    14h,0D4h,0D5h, 15h,0D7h, 17h, 16h,0D6h,0D2h, 12h, 13h,0D3h, 11h,0D1h,0D0h, 10h
         db   0F0h, 30h, 31h,0F1h, 33h,0F3h,0F2h, 32h, 36h,0F6h,0F7h, 37h,0F5h, 35h, 34h,0F4h
         db    3Ch,0FCh,0FDh, 3Dh,0FFh, 3Fh, 3Eh,0FEh,0FAh, 3Ah, 3Bh,0FBh, 39h,0F9h,0F8h, 38h
         db    28h,0E8h,0E9h, 29h,0EBh, 2Bh, 2Ah,0EAh,0EEh, 2Eh, 2Fh,0EFh, 2Dh,0EDh,0ECh, 2Ch
         db   0E4h, 24h, 25h,0E5h, 27h,0E7h,0E6h, 26h, 22h,0E2h,0E3h, 23h,0E1h, 21h, 20h,0E0h
         db   0A0h, 60h, 61h,0A1h, 63h,0A3h,0A2h, 62h, 66h,0A6h,0A7h, 67h,0A5h, 65h, 64h,0A4h
         db    6Ch,0ACh,0ADh, 6Dh,0AFh, 6Fh, 6Eh,0AEh,0AAh, 6Ah, 6Bh,0ABh, 69h,0A9h,0A8h, 68h
         db    78h,0B8h,0B9h, 79h,0BBh, 7Bh, 7Ah,0BAh,0BEh, 7Eh, 7Fh,0BFh, 7Dh,0BDh,0BCh, 7Ch
         db   0B4h, 74h, 75h,0B5h, 77h,0B7h,0B6h, 76h, 72h,0B2h,0B3h, 73h,0B1h, 71h, 70h,0B0h
         db    50h, 90h, 91h, 51h, 93h, 53h, 52h, 92h, 96h, 56h, 57h, 97h, 55h, 95h, 94h, 54h
         db    9Ch, 5Ch, 5Dh, 9Dh, 5Fh, 9Fh, 9Eh, 5Eh, 5Ah, 9Ah, 9Bh, 5Bh, 99h, 59h, 58h, 98h
         db    88h, 48h, 49h, 89h, 4Bh, 8Bh, 8Ah, 4Ah, 4Eh, 8Eh, 8Fh, 4Fh, 8Dh, 4Dh, 4Ch, 8Ch
         db    44h, 84h, 85h, 45h, 87h, 47h, 46h, 86h, 82h, 42h, 43h, 83h, 41h, 81h, 80h, 40h
;--------------------------------------
bdtab:	dw	90fdh, 0c8feh, 64ffh, 0b2ffh, 0d9ffh, 0edffh

;**********************************************************
;  SIO interrupt subroutine
;  used r0,r2,r3,r4(siosum),r6,r7
;		BANK  2
;----------------------------------------------------------
SioSelf:
	MOV	A,	SBUF
	CJNE	A,COMAD,SioComSEn
	MOV	R7,	#7FH
SIO2:	MOV	R6,	#0FFH
SIO3:	JBC	RI,	SIO4	; receive command
	DJNZ	R6,	SIO3
	DJNZ	R7,	SIO2
	SJMP	SioComSEn
SIO4:	MOV	A,	SBUF
	MOV	R3,	#0FFH	; delay 1.0ms
	DJNZ	R3,	$
	MOV	R3,	#0FFH	; delay 1.0ms
	DJNZ	R3,	$
;
;
	CJNE	A,#0A1H,SIOR2
	SETB	SioTxRx
	MOV	siosum, #0
	MOV	A,	COMAD	; return COM ADDRESS
	CALL	TRANSB
	MOV	A,	#0A1H
	CALL	TRANSB		; return COMMAND
	MOV	R3,	#8	; trans  ob  ah  al  df
	MOV	R0,	#iObjad	;	 2   2	 2   2
SIR1:	MOV	A,	@R0
	CALL	TRANSB
	INC	R0
	DJNZ	R3,	SIR1
	MOV	SBUF,	A
	JNB	TI,	$
	CLR	TI
SioComSEn:
        JMP	SioComSEnD
;
SIOR2:	CJNE	A,#0A2H,SIOR3
	SETB	SioTxRx
	MOV	siosum, #0
	MOV	A,	COMAD	; return COM ADDRESS
	CALL	TRANSB
	MOV	A,	#0A2H
	CALL	TRANSB		; return COMMAND
	MOV	R3,	#14	; trans cy pp ip dp bp up cp
	MOV	R0,	#iCyad	;	2  2  2  2  2  2  2
	AJMP	SIR1
;
SIOR3:	CJNE	A,#0A3H,SIOW1
	SETB	SioTxRx
	MOV	siosum, #0
	MOV	A,	COMAD	; return COM ADDRESS
	CALL	TRANSB
	MOV	A,	#0A3H
	CALL	TRANSB		; return COMMAND
	MOV	R3,	#10	; trans yi aout stat poil cold lyi
	MOV	R0,	#iYIad	;	2   2	 1    1    2	2
	AJMP	SIR1
;--------------------------------
SIOW1:	CJNE	A,#0B1H,SIOW2
	SETB	SioTxRx
	MOV	A,	COMAD	; return COM ADDRESS
	CALL	TRANSB
	MOV	A,	#0B1H
	CALL	TRANSB		; return COMMAND
;
	CLR	SioTxRx
	MOV	R0,	#ComBufferAd
	MOV	siosum, #0
	SETB	bSetAlrPara
	MOV	R3,	#9	; receive  ob  ah  al  df  SUM
SIW1:	MOV	R7,	#7FH	; 9 bytes  2   2   2   2   1
SIW2:	MOV	R6,	#0FFH
SIW3:	JNB	RI,	SIW5
	CLR	RI
	MOV	A,	SBUF
	DJNZ	R3,	SIW4
	XRL	A,	siosum
;
	MOV	R7,	#0FFH
	DJNZ	R7,	$	; delay 1.0ms
	SETB	SioTxRx
	MOV	SBUF,	A	; return 0 for ok else false
	JNB	TI,	$
	CLR	TI
	JNZ	SioComSEn
	SETB	USIOB
	JMP	SioComSEnD
SIW4:	MOV	@R0,	A
	ADD	A,	siosum
	MOV	siosum, A
	INC	R0
	JMP	SIW1
SIW5:	DJNZ	R6,	SIW3
	DJNZ	R7,	SIW2
	JMP	SioComSEnD
;
SIOW2:	CJNE	A,#0B2H,SIOW3
	SETB	SioTxRx
	MOV	A,	COMAD	; return COM ADDRESS
	CALL	TRANSB
	MOV	A,	#0B2H
	CALL	TRANSB		; return COMMAND
;
	CLR	SioTxRx
	MOV	R0,	#ComBufferAd
	MOV	siosum, #0
	SETB	bSetPidPara
	MOV	R3,	#15	; receive cy pp ip dp bp up cp SUM
	JMP	SIW1		; 15 bytes 2  2  2  2  2  2  2	1
;
SIOW3:	CJNE	A,#0B3H,SioComSEnD
	SETB	SioTxRx
	MOV	A,	COMAD	; return COM ADDRESS
	CALL	TRANSB
	MOV	A,	#0B3H
	CALL	TRANSB		; return COMMAND
;
	CLR	SioTxRx
	MOV	R0,	#ComBufferAd
	MOV	siosum, #0
	SETB	W3B
	MOV	R3,	#3	; receive aout	SUM
	SETB	PC_HAND
	JMP	SIW1		;	  2	1
SioComSEnD:
	RET
;
TRANSB: MOV	SBUF,	A
	JNB	TI,	$
	CLR	TI
	ADD	A,	siosum
	MOV	siosum, A
	RET
;************************************************************
; pcsio used to write pc parameter to ee
;------------------------------------------------------------
pcsio:	LCALL	WREN_CMD
	MOV	R6,	#sr_setp ; protect 17f--1ffh ee
	LCALL	WRSR_CMD
	mov	r0,	#ComBufferAd
	jnb	w1b,	pcww2
	clr	w1b		;
	mov	r5,	#eObad	;
	mov	r3,	#4	; ob ah al df
pcww1:	mov	a,	@r0
	mov	r6,	a
	inc	r0
	mov	a,	@r0
	mov	r7,	a
	inc	r0
	clr	ewok
	lcall	eewr2h
	setb	ewok
	inc	r5
	inc	r5
	djnz	r3,	pcww1
pcwend: LCALL	WREN_CMD
	MOV	R6,	#sr_norm ; watchdog 1.4s protect 100--1ffh ee
	LCALL	WRSR_CMD
	mov	sioby,	#0
	ret
;
pcww2:	jnb	w2b,	pcww3
	clr	w2b		;
	mov	r5,	#eCYad
	mov	r3,	#7	; cy pp ip dp bp up cp
	ajmp	pcww1
pcww3:	jnb	w3b,	pcwwe
	clr	w3b
	mov	pch_c,	#120	; 60s
	mov	suml,	#0
	mov	sumh,	#0
	mov	r1,	#ComBufferAd
	mov	a,	@r1
	mov	r6,	a
	mov	aoutl,	a
	inc	r1
	mov	a,	@r1
	mov	r7,	a
	mov	aouth,	a
	mov	r5,	#eHandOutad
	clr	ewok
	Lcall	eewr2
	setb	ewok
	Lcall	tpan
pcwwe:	ajmp	pcwend

	end

⌨️ 快捷键说明

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