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

📄 modbus.asm

📁 这是相当经典的MODBUS规约程序(电力系统报文),绝对自己写的,随产品销售到全国各地,犹豫了还是共享吧
💻 ASM
📖 第 1 页 / 共 3 页
字号:
                STB    AL,WDTADDR[0]  
                CMP    AX,#0FFFFH
                JE     RETURNXXXXXXX
                ;031119
                    
		JBC     INT_PEND,6,SP_RX0075
		ANDB     INT_PEND,#0BFH
		LDB     BUFREG,SBUFRX
	        LDB	  DATE,BUFREG		;日
		ADDB	  CRC,BUFREG
		ADDCB	  CRC1,#00H	 
      
 ;031119
	      CLR     AX
	      ;031119
SP_RX0076:       
                INC   AX
                STB    AL,WDTADDR[0]  
                CMP    AX,#0FFFFH
                JE     RETURNXXXXXXX
                ;031119
                    
		JBC     INT_PEND,6,SP_RX0076
		ANDB     INT_PEND,#0BFH
		LDB     BUFREG,SBUFRX
	        LDB	  HOUR,BUFREG		;时
		ADDB	  CRC,BUFREG
		ADDCB	  CRC1,#00H
		SJMP      SP_RX00771   ;031119

RETURNXXXXXXX:
		LJMP	  RETURN
		      
 ;031119
SP_RX00771:
	      CLR     AX
	      ;031119
SP_RX0077:       
                INC   AX
                STB    AL,WDTADDR[0]  
                CMP    AX,#0FFFFH
                JE     RETURNXXXXXXX
                ;031119
                    
		JBC     INT_PEND,6,SP_RX0077
		ANDB     INT_PEND,#0BFH
		LDB     BUFREG,SBUFRX
	        LDB	  MINUTE,BUFREG		;分

		ADDB	  CRC,BUFREG
		ADDCB	  CRC1,#00H
      
 ;031119
	      CLR     AX
	      ;031119
SP_RX0078:       
                INC   AX
                STB    AL,WDTADDR[0]  
                CMP    AX,#0FFFFH
                JE     RETURNXXXXXXX
                ;031119
                    
		JBC     INT_PEND,6,SP_RX0078
		ANDB     INT_PEND,#0BFH
		LDB     BUFREG,SBUFRX
	        LDB	  SECOND,BUFREG		;秒
		ADDB	  CRC,BUFREG
		ADDCB	  CRC1,#00H	 
       
 ;031119
	      CLR     AX
	      ;031119
SP_RX0079:       
                INC   AX
                STB    AL,WDTADDR[0]  
                CMP    AX,#0FFFFH
                JE     RETURNXXXXXXX
                ;031119
                   
		JBC     INT_PEND,6,SP_RX0079
		ANDB     INT_PEND,#0BFH
		LDB     BUFREG,SBUFRX
	      ;LDB	  HOUR,BUFREG		;
		ADDB	  CRC,BUFREG
		ADDCB	  CRC1,#00H
     
 ;031119
	      CLR     AX
	      ;031119
SP_RX007A:       
                INC   AX
                STB    AL,WDTADDR[0]  
                CMP    AX,#0FFFFH
                JE     RETURN
                ;031119
                    
		JBC     INT_PEND,6,SP_RX007A
		ANDB     INT_PEND,#0BFH
		LDB     BUFREG,SBUFRX
	      ;LDB	  MINUTE,BUFREG		;

		ADDB	  CRC,BUFREG
		ADDCB	  CRC1,#00H
      
 ;031119
	      CLR     AX
	      ;031119
SP_RX007B:       
                INC   AX
                STB    AL,WDTADDR[0]  
                CMP    AX,#0FFFFH
                JE     RETURN
                ;031119
                    
		JBC     INT_PEND,6,SP_RX007B
		ANDB     INT_PEND,#0BFH
		LDB     BUFREG,SBUFRX
	        CMPB    BUFREG,CRC
	        JNE     RETURN	
      
 ;031119
	      CLR     AX
	      ;031119
SP_RX007C:       
                INC   AX
                STB    AL,WDTADDR[0]  
                CMP    AX,#0FFFFH
                JE     RETURN
                ;031119
                    
		JBC     INT_PEND,6,SP_RX007C
		ANDB     INT_PEND,#0BFH
		LDB     BUFREG,SBUFRX
	        CMPB    BUFREG,CRC1
	        JNE     RETURN	
       
 ;031119
	      CLR     AX
	      ;031119
SP_RX007D:       
                INC   AX
                STB    AL,WDTADDR[0]  
                CMP    AX,#0FFFFH
                JE     RETURN
                ;031119
                   
		JBC     INT_PEND,6,SP_RX007D
		ANDB     INT_PEND,#0BFH
		LDB     BUFREG,SBUFRX
	        CMPB    BUFREG,#03
	        JNE     RETURN
				;;对时
		STB    AL,WDTADDR[0]  ;030417
		LCALL   WRTIME
		
		LJMP    SP_ACK   ;030807
	        
	      ;030807  LJMP    RETURN
	        		        	        
          
             

RETURN:     
             STB    AL,WDTADDR[0]  
	     LDB    AH,P2
	     LDB    AL,#10000000B   ;p2.7_input pin  /busy   P2.5=0 RXD ;AL,BL,CL
	     ORB    AH,#10000000B
	     ANDB   AH,AL 
	     LDB    P2,AH
		
	     MULB   AX,AL,#00H   ;>5US
	     MULB   AX,AL,#00H
	     MULB   AX,AL,#00H
	     MULB   AX,AL,#00H
			
	     CLRB   SP_TEMP       ;NEW
	     
	     POP    BX   ;030417
	     
             POP    AX
             POPF
             RET

SENDGZS1:
                LDB     AL,#07
                SJMP    SENDGZX       ;031210              
SENDGZ:						;向上位机发送新事件 
		LDB    AH,P2
		LDB    AL,#10100000B   ;p2.7_input pin  /busy   P2.5=1 TXD ;AL,BL,CL
		ORB    AH,#10100000B
	        ANDB   AH,AL 
		LDB    P2,AH

		STB    AL,WDTADDR[0]  ;030807
		
		LDB     AL,FMT_LEN    ;031210  
		CMPB    AL,#08
		JNE     SENDGZS 
		
		LD     I2CADDR,#SGPTRADDR   ;1109
                LCALL  OUTPUT_SJ
                LDB    AL,ZYBUFAL
              
                ;LDB     AL,SGPTR
                DECB    AL
                CMPB    AL,#0FFH
                JE      SENDGZS1
SENDGZS:
		SJMP    SENDGZX       ;031210 
		
;031210*****		LD      I2CADDR,#FSFLAGADDR   ;1109
;***********                LCALL   OUTPUT_SJ
;***********                LDB     FSFLAG,ZYBUFAL
;***********		JBC     FSFLAG,0,SENDGZ0
;***********		LDB     AL,#00H
;***********		SJMP    SENDGZX
;***********		
;***********SENDGZ0:
;***********		JBC     FSFLAG,1,SENDGZ1
;***********		LDB     AL,#01H
;***********		SJMP    SENDGZX
;***********		
;***********SENDGZ1:
;***********		JBC     FSFLAG,2,SENDGZ2
;***********		LDB     AL,#02H
;***********		SJMP    SENDGZX
;***********SENDGZ2:
;***********		JBC     FSFLAG,3,SENDGZ3
;***********		LDB     AL,#03H
;***********		SJMP    SENDGZX
;***********SENDGZ3:
;***********		JBC     FSFLAG,4,SENDGZ4
;***********		LDB     AL,#04H
;***********		SJMP    SENDGZX
;***********SENDGZ4:
;*****		JBC     FSFLAG,5,SENDGZ5
;***********		LDB     AL,#05H
;***********		SJMP    SENDGZX
;***********SENDGZ5:
;***********		JBC     FSFLAG,6,SENDGZ6
;***********		LDB     AL,#06H
;***********		SJMP    SENDGZX
;***********SENDGZ6:
;***********		JBC     FSFLAG,7,SENDGZ7
;***********		LDB     AL,#07H
;031210*****		SJMP    SENDGZX
SENDGZ7:
		LJMP    RETURN								
SENDGZX:
		NOP
		NOP
;031210*****	
;***********		LDB   SBUFTX,#0EBH     ; 
;***********SP_GZ0065:       
;***********		JBC     INT_PEND,6,SP_GZ0065
;***********		ANDB     INT_PEND,#0BFH
;***********		LDB   SBUFTX,#090H     ; 把数据从外部存储器A区发向上位机  
;***********SP_GZ0066:       
;***********		JBC     INT_PEND,6,SP_GZ0066
;***********		ANDB     INT_PEND,#0BFH
;***********		LDB   SBUFTX,#0EBH     ; 把数据从外部存储器A区发向上位机  
;***********SP_GZ0067:       
;***********		JBC     INT_PEND,6,SP_GZ0067
;***********		ANDB    INT_PEND,#0BFH
;***********		LDB     SBUFTX,#090H     ; 把数据从外部存储器A区发向上位机  
;***********SP_GZ0068:       
;***********		JBC     INT_PEND,6,SP_GZ0068
;***********		ANDB    INT_PEND,#0BFH
;***********		LDB     SBUFTX,#02H     ; 把数据从外部存储器A区发向上位机  
;*****		SP_GZ0069:       
;***********		JBC     INT_PEND,6,SP_GZ0069
;031210*****		ANDB    INT_PEND,#0BFH
		LDB     SBUFTX,SBADDR     ; 把数据从外部存储器A区发向上位机 
		 
		LD      CRC16,#0FFFFH 
		
		LDB     BUFREG,SBADDR       ;031210
		STB    AL,WDTADDR[0] 
		CALL    CRCPROC    
		
SP_GZ006A:       
		JBC     INT_PEND,6,SP_GZ006A
		ANDB    INT_PEND,#0BFH
		LDB     SBUFTX,#03H     ;031210 #040H     ; 把数据从外部存储器A区发向上位机
		LDB     BUFREG,#03H  
		STB    AL,WDTADDR[0] 
                CALL    CRCPROC        

		
SP_GZ006B:       
		JBC     INT_PEND,6,SP_GZ006B
		ANDB    INT_PEND,#0BFH  
		LDB     SBUFTX,#08H     ; 把数据长度=8从外部存储器A区发向上位机
		
		LDB     BUFREG,#08H  
		STB    AL,WDTADDR[0] 
                CALL    CRCPROC    
                
SP_GZ006C:       
		JBC     INT_PEND,6,SP_GZ006C
		ANDB    INT_PEND,#0BFH
		 
		MULUB   AX,AL,#0CH
                ;1109 STB    SECOND,SGADDR[CX]   ;存储故障发生 秒 分 时 日 月 年
                ADD     AX,#05H
                
                LD     I2CADDR,#SGADDR
                ADD    I2CADDR,AX
                ;LD     CX,I2CADDR
                LCALL  OUTPUT_SJ
                ;LDB    YEAR,ZYBUFAL
              
		LDB   SBUFTX,ZYBUFAL     ; 把数据YL从外部存储器A区发向上位机  
		LDB     BUFREG,ZYBUFAL 
		STB    AL,WDTADDR[0]  
                CALL    CRCPROC    
                
;031210****SP_GZ006D:       
;031210****		JBC     INT_PEND,6,SP_GZ006D
;031210****		ANDB     INT_PEND,#0BFH
;031210****		LDB   SBUFTX,#20H     ; 把数据YH从外部存储器A区发向上位机  
;031210****		ADDB    CRC,#20H       ;030807
;031210****		ADDCB   CRC1,#00H
SP_GZ006E:       
		JBC     INT_PEND,6,SP_GZ006E
		ANDB     INT_PEND,#0BFH
		     ; 把数据MONTH从外部存储器A区发向上位机 
		DEC     I2CADDR
		 LCALL  OUTPUT_SJ
                ;LDB    MONTH,ZYBUFAL
                LDB   SBUFTX,ZYBUFAL
		LDB     BUFREG,ZYBUFAL
		STB    AL,WDTADDR[0]   
                CALL    CRCPROC    
SP_GZ006F:       
		JBC     INT_PEND,6,SP_GZ006F
		ANDB     INT_PEND,#0BFH
	    ; 把数据DATE从外部存储器A区发向上位机 
	        DEC     I2CADDR
		 LCALL  OUTPUT_SJ
                ;LDB    DATE,ZYBUFAL
                LDB   SBUFTX,ZYBUFAL
                
		LDB     BUFREG,ZYBUFAL  
		STB    AL,WDTADDR[0] 
                CALL    CRCPROC    
SP_GZ00610:       
		JBC     INT_PEND,6,SP_GZ00610
		ANDB     INT_PEND,#0BFH
		     ; 把数据HOUR从外部存储器A区发向上位机  
		DEC     I2CADDR
		 LCALL  OUTPUT_SJ
                ;LDB    HOUR,ZYBUFAL
                LDB   SBUFTX,ZYBUFAL
                
		LDB     BUFREG,ZYBUFAL  
		STB    AL,WDTADDR[0] 
                CALL    CRCPROC    
SP_GZ00611:       
		JBC     INT_PEND,6,SP_GZ00611
		ANDB     INT_PEND,#0BFH
		    ; 把数据MINUTE从外部存储器A区发向上位机
		DEC     I2CADDR
		 LCALL  OUTPUT_SJ
                ;LDB    MINUTE,ZYBUFAL
                LDB   SBUFTX,ZYBUFAL
                
		LDB     BUFREG,ZYBUFAL  
		STB    AL,WDTADDR[0] 
                CALL    CRCPROC    
SP_GZ00612:       
		JBC     INT_PEND,6,SP_GZ00612
		ANDB     INT_PEND,#0BFH  
		   ; 把数据SECOND从外部存储器A区发向上位机
		DEC     I2CADDR
		 LCALL  OUTPUT_SJ
                ;LDB    SECOND,ZYBUFAL
                LDB   SBUFTX,ZYBUFAL
                
		LDB     BUFREG,ZYBUFAL  
		STB    AL,WDTADDR[0] 
                CALL    CRCPROC    
				
;031210****SP_GZ00613:       
;031210****		JBC     INT_PEND,6,SP_GZ00613
;031210****		ANDB     INT_PEND,#0BFH
;031210****		LDB   SBUFTX,#00H     ; 把数据MSL从外部存储器A区发向上位机  
;031210****		ADDB    CRC,#000H
;031210****		ADDCB   CRC1,#00H
;031210****SP_GZ00614:       
;031210****		JBC     INT_PEND,6,SP_GZ00614
;031210****		ANDB     INT_PEND,#0BFH
;031210****		LDB     SBUFTX,#00H     ; 把数据MSH从外部存储器A区发向上位机
;031210****		ADDB    CRC,#000H
;031210****		ADDCB   CRC1,#00H
;031210****SP_GZ00615:       
;031210****		JBC     INT_PEND,6,SP_GZ00615
;031210****		ANDB     INT_PEND,#0BFH  
;031210****		LDB     SBUFTX,#00H     ; 把数据RRF从外部存储器A区发向上位机
;031210****		ADDB    CRC,#00H
;031210****		ADDCB   CRC1,#00H
;031210****SP_GZ00616:       
;031210****		JBC     INT_PEND,6,SP_GZ00616
;031210****		ANDB     INT_PEND,#0BFH
;031210****		LDB   SBUFTX,#00H     ; 把数据TTY从外部存储器A区发向上位机 
;031210****		ADDB    CRC,#00H
;031210****		ADDCB   CRC1,#00H 
;031210****SP_GZ00617:       
;031210****		JBC     INT_PEND,6,SP_GZ00617
;031210****		ANDB     INT_PEND,#0BFH
;031210****		LDB     SBUFTX,#00H     ; 把数据00H从外部存储器A区发向上位机
;031210****		ADDB    CRC,#00H
;031210****		ADDCB   CRC1,#00H
SP_GZ00618:       
		JBC     INT_PEND,6,SP_GZ00618
		ANDB     INT_PEND,#0BFH  
		    ; 把数据FAU线路号 (1-36)从外部存储器A区发向上位
		STB    AL,WDTADDR[0]  ;030807
		    
		ADD     I2CADDR,#09H
		LCALL   OUTPUT_SJ
		
		LDB     BL,ZYBUFAL   ;030619
		CALL    HWIBTD ;030619
		LDB     ZYBUFAL,HH  ;030619
		
                LDB     SBUFTX,ZYBUFAL
		LDB     BUFREG,ZYBUFAL  
		STB    AL,WDTADDR[0]  
		CALL    CRCPROC          
SP_GZ00619:       
		JBC     INT_PEND,6,SP_GZ00619
		ANDB     INT_PEND,#0BFH  
		    ; 把数据ACT从外部存储器A区发向上位机
		DEC    I2CADDR
		LCALL  OUTPUT_SJ
                LDB   SBUFTX,ZYBUFAL
                
		LDB     BUFREG,ZYBUFAL   
		STB    AL,WDTADDR[0] 
		CALL    CRCPROC          
;031210****SP_GZ0061A:       
;031210****		JBC     INT_PEND,6,SP_GZ0061A
;031210****		ANDB     INT_PEND,#0BFH
;031210****		LDB   SBUFTX,#00H     ; 把数据00H从外部存储器A区发向上位机  
;031210****		ADDB    CRC,#00H
;031210****		ADDCB   CRC1,#00H
;031210****SP_GZ0061B:       
;031210****		JBC     INT_PEND,6,SP_GZ0061B
;031210****		ANDB     INT_PEND,#0BFH
;031210****		LDB     SBUFTX,#00H     ; 把数据00H从外部存储器A区发向上位机
;031210****		ADDB    CRC,#000H
;031210****		ADDCB   CRC1,#00H
;031210****SP_GZ0061C:       
;031210****		JBC     INT_PEND,6,SP_GZ0061C
;031210****		ANDB     INT_PEND,#0BFH  
;031210****		LDB     SBUFTX,#00H     ; 把数据00H从外部存储器A区发向上位
;031210****		ADDB    CRC,#00H
;031210****		ADDCB   CRC1,#00H
SP_GZ0061D:       
		JBC     INT_PEND,6,SP_GZ0061D
		ANDB     INT_PEND,#0BFH  
		
;030807*******************************************
                ;031210 ADDB    CRC,SBADDR
		;031210 ADDCB   CRC1,#00H
;030807*******************************************		
		LDB     SBUFTX,CRC     ; 把数据CRC从外部存储器A区发向上位机
SP_GZ0061E:       
		JBC     INT_PEND,6 ,SP_GZ0061E
		ANDB     INT_PEND,#0BFH
		LDB   SBUFTX,CRC1     ; 把数据CRC1从外部存储器A区发向上位机  
;031210****SP_GZ0061F:       
;031210****		JBC     INT_PEND,6,SP_GZ0061F
;031210****		ANDB     INT_PEND,#0BFH
;031210****		LDB     SBUFTX,#03H     ; 把数据03H从外部存储器A区发向上位机
SP_GZ00620:       
		JBC     INT_PEND,6,SP_GZ00620
		ANDB     INT_PEND,#0BFH  
					
		RET





		LDB   CRC16,#0FFFFH
CRCPROC:
		XORB  CRC,BUFREG
		CLRB  MOV_NUM 
CRC10:
		LD    TEMP,CRC16
		AND   TEMP,#0001  
		
		CMPB  MOV_NUM,#08  ;已移位8次
		JE    CRC11 
		
		SHR   CRC16,#1
		INCB  MOV_NUM
		
		CMP   TEMP,#0001
		JNE   CRC10
		XOR   CRC16,#0A001H
		SJMP  CRC10
		
CRC11:
	        RET		
			

⌨️ 快捷键说明

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