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

📄 rtu.asm

📁 modbus RTU 51单片机 ASM源代码
💻 ASM
字号:
;已实现功能:块写触摸屏
;The last recompose: 2.7 pm

	ADDRESS	EQU 20H
	COMMAND	EQU 21H
	CH	EQU 22H
	CL	EQU 23H
	CRC_H	EQU 24H
	CRC_L	EQU 25H
	CRC16_L	EQU 26H
	CRC16_H	EQU 27H
	SAVE_L	EQU 28H
	SAVE_H	EQU 29H
	COUNTER	EQU 2AH
	TRANS_FLAG	EQU 2BH
	DATA_COUNTER	EQU 2CH
	START_ADDRESS_D	EQU 2DH
	ANSWER_ADDRESS	EQU 2EH
	ERROR_FLAG	BIT F0
;======================================================================
	ORG 000H
	JMP MAIN

;----------------------------------------------------------------------
	ORG 0025H
MAIN:	MOV SP,#70H
	CLR ERROR_FLAG
	MOV ADDRESS,#0CH
	MOV START_ADDRESS_D,#30H	;THE START ADDRESS OF SEND DATA
	MOV ANSWER_ADDRESS,#60H		;THE START ADDRESS OF RECEVICE DATA
	CALL UART_SET
	CALL GET_DATA
	CALL CRC_CHECK
RE_SEND:
	CALL SEND_DATA
	CALL ANSWER_SEND
	LCALL DELAY
	LCALL DELAY
	CPL P1.4
	JBC ERROR_FLAG,RE_SEND
	SETB P1.4
	LCALL DELAY
	JMP MAIN
;----------------------------------------------------------------------
GET_DATA:
	MOV R0,START_ADDRESS_D		;读取数据到从30H开始的数据单元
	MOV DATA_COUNTER,#27H
	MOV R7,DATA_COUNTER
	MOV DPTR,#TAB
GET_LOOP:
	MOV A,#00H
	MOVC A,@A+DPTR
	MOV @R0,A
	INC R0
	INC DPTR
	DJNZ R7,GET_LOOP
	RET
;----------------------------------------------------------------------
CRC_CHECK:				;CRC校验子程序
	MOV R0,START_ADDRESS_D
	MOV COUNTER,DATA_COUNTER
	MOV CL,#01H
	MOV CH,#0A0H
	MOV CRC16_L,#0FFH
	MOV CRC16_H,#0FFH
	MOV SAVE_H,#00H
	MOV SAVE_L,#00H
CHECK_LOOP:
	MOV A,@R0
	XRL CRC16_L,A	
	MOV R7,#08H
CHECK_B:
	MOV SAVE_H,CRC16_H
	MOV SAVE_L,CRC16_L
	MOV A,CRC16_H
	CLR C
	RRC A  
        MOV CRC16_H,A
	MOV A,CRC16_L
	CLR C 
	RRC A 
	MOV CRC16_L,A
	JNB SAVE_H.0,COMPARE_L
	MOV A,CRC16_L
	ORL A,#80H
	MOV CRC16_L,A
COMPARE_L:
	JNB SAVE_L.0,NEXT_BIT
	MOV A,CRC16_H
	XRL A,CH
	MOV CRC16_H,A
	MOV A,CRC16_L
	XRL A,CL
	MOV CRC16_L,A
NEXT_BIT:
	DJNZ R7,CHECK_B
	INC R0
	DJNZ COUNTER,CHECK_LOOP
	MOV @R0,CRC16_L		;发送的数据将CRC校验码添加到数据包中
	INC R0
	MOV @R0,CRC16_H
	MOV DPH,CRC16_H
	MOV DPL,CRC16_L
	RET
;----------------------------------------------------	
UART_SET:
	MOV SCON,#0D0H
	CLR EA
	ORL PCON,#80H
	MOV TMOD,#20H
	MOV TL1,#0F3H	;4800BPS AT 12MHz Fosc
	MOV TH1,#0F3H
	SETB TR1
	RET
;----------------------------------------------------
ANSWER_SEND:
	CLR RI
	MOV R0,ANSWER_ADDRESS
	MOV COUNTER,#08H
	MOV A,#00H
RECEVE_DATA:
	JNB RI,$
	MOV A,SBUF
	MOV @R0,A
	CLR RI
	INC R0
	DJNZ COUNTER,RECEVE_DATA
	MOV R1,START_ADDRESS_D
	MOV R0,ANSWER_ADDRESS
	MOV COUNTER,#06H
COMPARE_DATA:
	MOV A,@R0
	MOV B,@R1
	CJNE A,B,ERROR
	INC R0
	INC R1
	DJNZ COUNTER,COMPARE_DATA
	SJMP EXIT_ANSWER
ERROR:	
	SETB ERROR_FLAG
	RETI
EXIT_ANSWER:
	SETB P1.4
	RET
;---------------------------------------------------
SEND_DATA:
	MOV R0,START_ADDRESS_D
	MOV COUNTER,DATA_COUNTER
	CLR TI
SEND_LOOP:
	MOV A,@R0
	INC R0
	MOV SBUF,A
	JNB TI ,$
	CLR TI
	DJNZ COUNTER,SEND_LOOP	;SEND DATA
	MOV A,@R0		;SEND CRC
	INC R0
	MOV SBUF,A
	JNB TI ,$
	CLR TI
	MOV A,@R0
	MOV SBUF,A
	JNB TI,$
	CLR TI
	RET
;------------------------------------------------------------
DELAY:	MOV R7,#0FFH
DEL1:	MOV R6,#0FFH
	DJNZ R6,$
	DJNZ R7,DEL1
	RET

TAB:	DB  0cH, 10H, 00H, 0aH, 00H, 10H, 20H, 00H, 01H, 00H, 02H, 00H, 03H, 00H, 04H, 00H
	DB  05H, 00H, 06H, 00H, 07H, 00H, 08H, 00H, 09H, 00H, 0aH, 00H, 0bH, 00H, 0cH, 00H
 	DB  0dH, 00H, 0eH, 00H, 0fH, 00H, 10H,0aaH,0edH
 	END 

⌨️ 快捷键说明

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