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

📄 c34dsio.asm

📁 MDOBUS-RTU通讯规约C51汇编程序
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;**************************************************************************************************
;	串行通讯程序
;**************************************************************************************************
;  SIO interrupt subroutine
;  used r0,r1,r2,r3,r6,r7
;       CRCLo=r4,CRCHi=r5
;	BANK  2
;--------------------------------------------------------------------------------------------------
INTSIO:  CLR	   EA
	 CLR	   ES
	 CLR	   RI
	 PUSH	   PSW
	 PUSH	   ACC
	 PUSH	   DPH
	 PUSH	   DPL
	 CLR	   RS0
	 SETB	   RS1			    ; set bank 2 registers
	 SETB	   EA
	 CLR	   SM2
;--------------------------------------------
	 jnb	   bEnComS,  SioMbus
	 call	   SioSelf                  ; 公司自定义通讯协议
	 JMP	   SIOEND
SioMbus: jnb	   bEnComM,  SioEn
;-------------------------------------------
	 jb	   bSetPidPara,SioEn        ; MoDouBus通讯协议
	 jb	   bSetAlrPara,SioEn
	 MOV	   R0,       #ComBufferAd
SIO1:	 MOV	   A,	     SBUF
	 CJNE	   A,comad,  SIOEN
	 MOV	   @R0,	     A              ; 接收地址
	 INC	   R0
	 MOV	   R3,       #1
	 CALL	   ReceiveSub               ; 接收命令
	 JNB       bReceiveEr,SIOWA
	 CLR       bReceiveEr
SIOEN:   JMP	   SIOEND                   ; address error or receive error
;**************************************************************************************************
;        function  10h       设置    系统参数  报警参数
;--------------------------------------------------------------------------------------------------
siowa:   CJNE	   A,#10H,   SIOWB
	 JMP	   SIOW_PARA
SIOWB:   JMP       SIORB
;===========================================
SIOW_PARA:
	 MOV	   R3,       #5             ; 接收参数开始地址,参数个数,字节个数等5个字节以便判断设置哪个参数
	 CALL      ReceiveSub
	 JNB       bReceiveEr,SIOW_P1
	 CLR       bReceiveEr
	 JMP	   SIOEND
SIOW_P1: ADD	   A,        #2
	 MOV	   R3,	     A              ; R3=接收参数字节数和CRC字节数总和
	 CALL      ReceiveSub
	 JNB       bReceiveEr,SIOW_P2
	 CLR       bReceiveEr
	 JMP	   SIOEND
SIOW_P2: MOV	   A,        R0             ; 指针
	 CLR	   C
	 SUBB	   A,        #ComBufferAd
	 SUBB	   A,        #2             ; A is all the byte num. except CRC
	 CALL	   CheckCRC                 ; CRC 检验
	 JBC	   bCRCOK,   SIOWOK
	 JMP	   SIOEND
;--------------------------------------------
;        CRC 检验正确后处理
;--------------------------------------------
SIOWOK:
         MOV	   R0,       #ComBufferAd+2 ; point to para start address hi
	 MOV	   A,        @R0
;--------------------------------------------
	 cjne	   a,#06h,   SysAlr
	 setb	   bSetPidPara              ; 设置 PID参数  when  #ComBufferAd+2+3 = 2006h
	 JMP	   WriteParaEnd
SysAlr:  cjne	   a,#05h,   WriteParaErEnd
	 setb	   bSetAlrPara              ; 设置 报警参数  when  #ComBufferAd+2+3 = 2005h
;--------------------------------------------
WriteParaEnd:                               ; 设置 系统参数  报警参数  后应答
         mov	   r3,       #6
	 call	   WriteReadOkAnswer        ; 发送ComBufferAd中应答信息
         JMP	   SIOEND
;
WriteParaErEnd:
         call      ErrorAnswer
         JMP	   SIOEND

;**************************************************************************************************
;	 function  03h       读   系统参数  报警参数
;--------------------------------------------------------------------------------------------------
SIORB:   cjne      a,#03h,   siorc          ;
	 MOV	   R3,       #6             ; 接收参数开始地址,参数个数,CRC
	 CALL      ReceiveSub
	 JNB       bReceiveEr,SIOR_P2
	 CLR       bReceiveEr
	 JMP	   SIOEND
SIOR_P2: mov	   a,        #6
	 call	   CheckCRC                 ; CRC 检验
	 jbc	   bCRCOK,   SIORBOK
	 JMP	   SIOEND                   ; CRC check error
;--------------------------------------------
;        CRC 检验正确后处理
;--------------------------------------------
SIORBOK: MOV	   R0,       #ComBufferAd+2 ; point to para start address hi
	 MOV	   A,        @R0
;============================================
	 cjne      a,#06h,   RSysAlr1
	 MOV	   R0,       #ComBufferAd+3 ; point to para start address Lo
	 MOV	   A,        @R0
	 mov	   r5,	     a
	 MOV	   R0,       #ComBufferAd+5 ; point to para count Lo
	 MOV	   A,        @R0
	 add	   a,	     r5
	 cjne	   a,	     #8,RSysAlr0
RSysAlr0:
	 jnc	   ReadParaErEnd
         mov	   r5,	     #iCyad
         jmp       RSysAlr2
RSysAlr1:cjne      a,#05h,   ReadParaErEnd
	 MOV	   R0,       #ComBufferAd+3 ; point to para start address Lo
	 MOV	   A,        @R0
	 mov	   r5,	     a
	 MOV	   R0,       #ComBufferAd+5 ; point to para count Lo
	 MOV	   A,        @R0
	 add	   a,	     r5
	 cjne	   a,	     #5,RSysAlr10
RSysAlr10:
	 jnc	   ReadParaErEnd
	 mov	   r5,       #iObjad

RSysAlr2:call      ReadSysAlrPara           ; 读系统参数  报警参数
	 mov	   a,        r4
	 mov       r3,       a
;--------------------------------------------
ReadParaEnd:
	 call	   WriteReadOkAnswer        ; 发送ComBufferAd中应答信息
	 JMP	   SIOEND
;
ReadParaErEnd:
         call      ErrorAnswer
         JMP	   SIOEND

;**************************************************************************************************
;	 function  04h       读测量值
;--------------------------------------------------------------------------------------------------
SIORC:   cjne      a,#04h,   SIORD
;
SioReadData:
         mov	   r3,       #6
         call      ReceiveSub               ; 接收参数开始地址,参数个数和CRC
	 jnb       bReceiveEr,SIOR_P5
	 clr       bReceiveEr
	 JMP	   SIOEND
SIOR_P5: mov	   a,        #6
	 call	   CheckCRC                 ; CRC 检验
	 jbc	   bCRCOK,   ReadData
	 JMP	   SIOEND                   ; CRC check error

;--------------------------------------------
;        CRC 检验正确后处理
;--------------------------------------------
ReadData:
	 MOV	   R0,       #ComBufferAd+2 ; point to data start address hi
	 MOV	   A,        @R0
         jnz       ReadDataErEnd
         inc       r0			    ; point to data start address Lo
         mov       a,        @r0
	 mov	   r5,	     a
	 MOV	   R0,       #ComBufferAd+5 ; point to data count Lo
	 MOV	   A,        @R0
	 add	   a,	     r5
	 cjne	   a,	     #04,ReadData2
ReadData2:
	 jnc	   ReadDataErEnd
;
         call      ReadTestingData          ; 读当前A/D测量数据或显示数据
         jmp       sioend
ReadDataErEnd:
	 call      ErrorAnswer
;**************************************************************************************************
SIORD:
	CJNE	   A,#02H,SIOEND
Readstate:
         mov	   r3,       #6
         call      ReceiveSub               ; 接收参数开始地址,参数个数和CRC
	 jnb       bReceiveEr,Readstate1
	 clr       bReceiveEr
	 JMP	   SIOEND
Readstate1:
	 mov	   a,        #6
	 call	   CheckCRC                 ; CRC 检验
	 jbc	   bCRCOK,   Readstate2
Readstate2:
	 mov	   r0,	     #ComBufferAd+2
	 mov	   a,	     @r0
	 jnz	   ReadstateErEnd
	 inc	   r0
	 mov	   a,	     @r0
	 jnz	   ReadstateErEnd
	 mov	   r1,	     #iState
	 mov	   a,	     @r1
	 mov	   @r0,	     a
	 dec 	   r0
	 mov	   a,	     #01h
	 mov	   @r0,	     a
	 mov	   r3,	     #4
	 call	   WriteReadOkAnswer
	 JMP	   SIOEND
ReadstateErEnd:
	 call      ErrorAnswer
SIOEND:
	 CLR	   SioTxRx
	 SETB	   REN
	 SETB	   ES
	 SETB	   EA
	 POP	   DPL
	 POP	   DPH
	 POP	   ACC
	 POP	   PSW
	 RETI
;**************************************************************************************************
;--------------------------------------------------------------------------------------------------
;        sub
;--------------------------------------------------------------------------------------------------
;**************************************************************************************************
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;        读测量数据或显示数据
;-------------------------------------------
ReadTestingData:
	 mov	   r0,	     #ComBufferAd+5	;计算字节数
	 mov	   a,	     @r0
	 clr	   c				;
	 rlc	   a
	 mov	   r3,	     a		        ;暂存A中数据到R3
	 mov	   r0,	     #ComBufferAd+3
	 mov	   a,	     @r0
	 jnz	   RTD0a			;当起始地址为00时数据字节数为(数据个数*2-1)
	 dec	   r3
	 mov	   a,	     r3
RTD0a:
	 mov	   r0,	     #ComBufferAd+2
	 mov	   @r0,	     a
	 mov	   r7,	     a
	 add	   a,	     #3
	 mov	   r3,	     a

	 mov	   r0,	     #ComBufferAd+3	;计算数据存储地址
	 mov	   a,	     @r0
	 jnz	   RTD0b
	 mov	   r1,	     #istate
	 inc	   r1
	 mov	   a,	     @r1
	 mov	   @r0,	     a
	 inc	   r0
	 dec	   r7
	 inc	   r1
	 sjmp	   RTD1
RTD0b:
	 clr	   c
	 rlc	   a
	 mov	   r1,	     #iState
	 add	   a,	     r1
	 mov	   r1,	     a

RTD1:
	 mov	   a,	     r7
	 jz	   RTD2
	 inc	   r1
	 mov	   a,        @r1            ; 送Hi
	 mov       @r0,      a
	 inc	   r0
	 dec	   r1
	 dec	   r7
	 mov	   a,        @r1            ; 送Lo
	 mov       @r0,      a
	 inc	   r0
	 inc	   r1
	 inc       r1
	 dec	   r7
	 ajmp	   RTD1
;
RTD2:
         call      WriteReadOkAnswer        ; 发送commbuffer中应答信息
         ret
;===========================================
;        读系统参数  报警参数
; input :r5 point to para address
; output:r4 = answer byte num.
; using r0,r1,r3,r4,r5
;-------------------------------------------
ReadSysAlrPara:
	 mov	   r0,       #ComBufferAd+3 ; 指向起始地址 Lo
	 mov	   a,        @r0	    ; 计算数据的起始地址
	 clr	   c
	 rlc	   a
	 add	   a,	     r5
	 mov	   r5,	     a

	 mov	   r0,       #ComBufferAd+5 ; 指向参数个数 Lo
	 mov	   a,        @r0            ; 参数个数
	 mov       r3,       a
	 clr       c
	 rlc       a
	 mov	   r0,       #ComBufferAd+2
	 mov	   @r0,      a              ; 参数字节数
	 add	   a,        #3
	 mov       r4,       a              ; 应答字节数
	 inc	   r0                       ; 指向参数
	 mov	   a,	     r5
	 mov	   r1,	     a
RSAP1:   inc	   r1                       ; 指向Hi
	 mov	   a,	     @r1
	 mov       @r0,      a
	 dec	   r1                       ; 指向Lo
	 inc	   r0
	 mov	   a,	     @r1
	 mov       @r0,      a
	 inc	   r0
	 inc	   r1
	 inc	   r1                       ; 指向下一个参数
	 djnz	   r3,       RSAP1
	 ret
;===========================================
;        设PID参数  报警参数
; input :r5 point to para eeprom address
; using r0,r4,r5,r6,r7
;-------------------------------------------
SetPara: clr	   es
         jbc	   bSetPidPara,SetP1
	 jbc	   bSetAlrPara,SetP2
	 jmp	   SetPEnd
SetP1:	 mov	   r5,       #eCyad
	 mov	   r0,	     #ComBufferAd+3
	 mov	   a,	     @r0
	 clr	   c
	 rlc	   a
	 add	   a,	     r5
	 mov	   r5,	     a
	 mov	   r0,	     #ComBufferAd+5
	 mov	   a,	     @r0
	 mov	   r4,       a
	 jmp       SetP3
SetP2:	 mov	   r5,       #eObad
	 mov	   r0,	     #ComBufferAd+3
	 mov	   a,	     @r0
	 clr	   c
	 rlc	   a
	 add	   a,	     r5
	 mov	   r5,	     a
	 mov	   r0,	     #ComBufferAd+5
	 mov	   a,	     @r0
	 mov	   r4,       a
;
SetP3:   setb      xwp
         call	   WREN_CMD
	 MOV	   R6,	     #SR_SETP       ; protect 100--1ffh ee
	 call	   WRSR_CMD
	 CLR	   EWOK
	 mov	   r0,       #ComBufferAd+7
SetP4:   mov	   a,        @r0
	 mov       r7,	     a

⌨️ 快捷键说明

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