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

📄 cj_hqf2.asm

📁 又一个远程抄表系统程序
💻 ASM
📖 第 1 页 / 共 2 页
字号:
					MOV			R3,#00
					MOV			R7,#8H
					MOV			R1,#ZB_HEAD_L
					MOV			A,R1
					MOV			R5,A
					MOV			R4,#2



ZB_YES_SEND:		MOV			A,R5
					MOV			RXD_TXD,C
					RLC			A
					MOV			R5,A
					DJNZ		R7,ZB_SEN_RET
					MOV			R7,#8
					JB			ZB_HEAD_OK,ZB_SEND_BIGIN
					MOV			R1,#ZB_HEAD_H
					MOV			A,R1
					MOV			R5,A
					DJNZ		R4,ZB_SEN_RET
					SETB		ZB_HEAD_OK
					MOV			R1,#ZB_UP_ADDR
					MOV			A,R1
					MOV			R5,A
					MOV			R4,#3
					;MOV			R7,#8
					LJMP		ZB_SEND_RET
ZB_SEND_BIGIN:		
AAAA:				LCALL		CLR_WATCHER_DOG
					LJMP		AAAA
					JB			ZB_SEND_ADDR_OK,ZB_SEND_CS1
					
					;JB			ZB_SEND_ADDR_OK,ZB_SEND_CL
					MOV			A,@R1
					MOV			R5,A
					LCALL		ZB_CS_ADD
					;MOV			R7,#8
					DJNZ		R4,ZB_SEN_RET
					SETB		ZB_SEND_ADDR_OK
					MOV			R1,#COMMAND
					MOV			A,@R1
					MOV			A,R5
					MOV			R4,#2
					;MOV			R7,#8
					LJMP		ZB_SEND_RET
ZB_SEND_CS1:		LJMP		ZB_SEND_CS
ZB_SEND_CL:			JB			ZB_SEND_CL_OK,ZB_SEND_CODE
					INC			R1
					MOV			A,@R1
					MOV			R5,A
					LCALL		ZB_CS_ADD
					;MOV			R7,#8
					DJNZ		R4,ZB_SEN_RET
					;MOV			R7,#8
					SETB		ZB_SEND_CL_OK
					MOV			R1,#ZB_CODE
					MOV			A,@R1
					MOV			R5,A
					MOV			R4,#2
					LJMP		ZB_SEND_RET
ZB_SEND_CODE:		JB			ZB_SEND_CODE_OK,ZB_SEND_METER
					INC			R1
					MOV			A,@R1
					MOV			R5,A
					LCALL		ZB_CS_ADD
					;MOV			R7,#8
					DJNZ		R4,ZB_SEN_RET
					MOV			R1,#BUFFER
					MOV			A,@R1
					MOV			R5,A
					MOV			R4,#6
					;MOV			R7,#8
					LJMP		ZB_SEND_RET
ZB_SEND_METER:		

					JB			ZB_SEND_METER_OK,ZB_SEND_L
					INC			R1
					MOV			A,@R1
					MOV			R5,A
					LCALL		ZB_CS_ADD
					;MOV			R7,#8
					DJNZ		R4,ZB_SEN_RET1
					;MOV			R7,#8
					SETB		ZB_SEND_METER_OK
					MOV			R1,#ZB_L
					MOV			A,@R1
					MOV			R5,A
					MOV			R4,#1
					LJMP		ZB_SEND_RET
ZB_SEN_RET1:		LJMP		ZB_SEND_RET
ZB_SEND_L:			JB			ZB_SEND_L_OK,ZB_SEND_DATA
					;MOV			R7,#8
					MOV			R1,#BUFFER+11
					MOV			A,@R1
					MOV			R5,A
					MOV			A,ZB_L
					MOV			R4,A
					LJMP		ZB_SEND_RET								
ZB_SEND_DATA:		JB			ZB_SEND_DATA_OK,ZB_SEND_CS
					INC			R1
					MOV			A,@R1
					MOV			R5,A
					LCALL		ZB_CS_ADD
					;MOV			R7,#8
					DJNZ		R4,ZB_SEN_RET1
					;MOV			R7,#8
					SETB		ZB_SEND_DATA_OK
					MOV			R1,#ZB_CS_L					
					MOV			A,@R1
					MOV			R5,A
					MOV			R4,#2
					MOV			R7,#8
					LJMP		ZB_SEND_RET
ZB_SEND_CS:			JB			ZB_SEND_CS_OK,ZB_SEND_END_INFO
					INC			R1
					MOV			A,@R1
					;MOV			R7,#8
					DJNZ		R4,ZB_SEN_RET1
					MOV			A,#16H
					MOV			R5,A
					MOV			R4,#1
					;MOV			R7,#8
					LJMP		ZB_SEND_RET
ZB_SEND_END_INFO:	JB			ZB_SEND_ALL,ZB_SEND_RET
					CLR			ZB_S_OK
					CLR			ZB_HEAD_OK
					CLR			ZB_SEND_CL_OK
					CLR			ZB_SEND_ADDR_OK
					CLR			ZB_SEND_CODE_OK
					CLR			ZB_SEND_METER_OK
					CLR			ZB_SEND_DATA_OK
					CLR			ZB_SEND_L_OK
					CLR			ZB_SEND_CS_OK
					SETB		ZB_SEND_ALL
					CLR			P1.1

					SETB		ES
					LJMP		ZB_SEND_RET
ZB_SEND_ERR:		SETB		ZB_SEN_ERR
					CLR			ZB_SEND_ALL
					CLR			ZB_S_OK
					CLR			ZB_HEAD_OK
					CLR			ZB_SEND_CL_OK
					CLR			ZB_SEND_ADDR_OK
					CLR			ZB_SEND_CODE_OK
					CLR			ZB_SEND_METER_OK
					CLR			ZB_SEND_L_OK
					CLR			ZB_SEND_CS_OK
					CLR			ZB_SEND_DATA_OK					
ZB_SEND_RET:		RET

;************************************************************************
;*载波CS计算处理*
;************************************************************************
ZB_CS_ADD:			ADD			A,R2
					MOV			R2,A
 					MOV			ZB_CS_L,A
					MOV			A,R3
					ADDC		A,#0
					CLR			C
					MOV			R3,A
					MOV			ZB_CS_H,A
					RET
								
;********************************************************
;*MCU串行口接收程序*R0为接收数据BUFFER的首地址,串行中断使用工作寄存器2区
;********************************************************
MCU_COM:			CLR			EA
					CLR			R_T_485
					CLR			EX0
					PUSH		ACC
					PUSH		PSW
					PUSH		B
					SETB		PSW.4
					CLR			PSW.3
					JBC			TI,JUMP4
					JB			HEAD_OK,REC_METER
					MOV			R2,#68H
					MOV			A,SBUF
					LCALL		CHECK_P
					JBC			REC_ERR,JUMP3
					;JNB			RE_FE_OK,JUMP2
					CJNE		A,#0FEH,RE_68H
					SETB		RE_FE_OK
					LJMP		JUMP2
RE_68H:				JNB			RE_FE_OK,JUMP2
					CJNE		A,#68H,JUMP
					SETB		HEAD_OK
					CLR			REC_ERRS
					MOV			R1,#7
					MOV			R0,#BUFFER
					LJMP		MCUR_COM_END
JUMP:				CLR			RE_FE_OK							 
JUMP2:				LJMP		MCUR_COM_END
JUMP3:				LJMP		MCU_RECEIVE_ERR
JUMP4:				LJMP		MCU_COM_SEND
REC_METER:			JB			METER_OK,MCU_RECEIVE_CL
					MOV			A,SBUF
					LCALL		CHECK_P
					JBC			REC_ERR,JUMP3
					MOV			@R0,A
					INC			R0
					ADD			A,R2
					MOV			R2,A
					DJNZ		R1,JUMP5
					MOV			R1,#2
					SETB		METER_OK
JUMP5:				LJMP		MCUR_COM_END
MCU_RECEIVE_CL:		JB			MCU_CL_OK,MCU_RECEIVE_DATA
					MOV			A,SBUF
					LCALL		CHECK_P
					JBC			REC_ERR,JUMP3
					MOV			@R0,A
					INC			R0
					;MOV			R3,A
					ADD			A,R2
					MOV			R2,A
					DJNZ		R1,JUMP1
					;MOV			A,R3
					CJNE		A,#00H,JUMP6
					SETB		MCU_DATA_OK
JUMP6:				SETB		MCU_CL_OK
					MOV			R1,LENGTH
					LJMP		MCUR_COM_END
MCU_RECEIVE_DATA:	JB			MCU_DATA_OK,MCU_RECEIVE_CS
					MOV			A,SBUF
					LCALL		CHECK_P
					JBC			REC_ERR,JUMP3
					MOV			@R0,A
					ADD			A,R2
					MOV			R2,A
					INC			R0
					DJNZ		R1,JUMP1
					SETB		MCU_DATA_OK
JUMP1:				LJMP		MCUR_COM_END
MCU_RECEIVE_CS:		JB			MCU_CS_OK,MCU_REC_CON
					MOV			A,SBUF
					LCALL		CHECK_P
					JBC			REC_ERR,JUMP3
					MOV			@R0,A
					MOV			CS,A
					INC			R0
					SETB		MCU_CS_OK
					LJMP		MCUR_COM_END
MCU_REC_CON:		MOV			A,SBUF
					LCALL		CHECK_P
					JBC			REC_ERR,JUMP3
					CJNE		A,#16H,MCU_RECEIVE_ERR
					MOV			A,R2
					SUBB		A,CS
					JNZ			MCU_RECEIVE_ERR
MCUR_COM_END2:		CLR			P1.0
					NOP
					NOP
					MOV			R1,#00
					CPL			COM_SELECT
					SETB		MCU_RECEIVE_ALL
					LJMP		MCUR_COM_END1
MCU_RECEIVE_CON:	LJMP		MCU_REC_CON
MCU_RECEIVE_ERR:	CLR			MCU_RECEIVE_ALL
					SETB		REC_ERR
MCUR_COM_END1:		MOV			R0,#BUFFER
					CLR			HEAD_OK
					CLR			MCU_DATA_OK
					CLR			METER_OK
					CLR			MCU_CS_OK
					CLR			MCU_CL_OK
					CLR			RE_FE_OK
					CLR			REN
					LJMP		MCUR_COM_END
					NOP
					NOP
					LJMP		INIT_SYS
MCUR_COM_END:		CLR			RI
					LJMP		MCU_COM_END
;******************************************************
;*MCU串口发送*R0为发送BUFFER的首地址,R1为发送字节个数(不包含CS和结束符16H以及开始符68H)
;******************************************************
MCU_COM_SEND:		SETB		R_T_485
					CLR			REN
					JB			SEND_FIRST_OK,HEAD_CON
					MOV			R3,#3
					MOV			R0,#BUFFER
					MOV			R2,#68H
					SETB		SEND_FIRST_OK
HEAD_CON:			JB			SEN_HE_OK,SEND_68
					MOV			A,#0FEH
					MOV			C,PSW.0
					MOV			TB8,C				
					MOV			SBUF,A
					DJNZ		R3,MCU_COM_END
					SETB		SEN_HE_OK
					LJMP		MCU_COM_END
SEND_68:			JB			SEND_68_OK,SEND_INFO
					MOV			A,#68H
					MOV			C,PSW.0
					MOV			TB8,C
					MOV			SBUF,A
					SETB		SEND_68_OK
					LJMP		MCU_COM_END


SEND_INFO:			JB			MCU_CS_ADD,MCU_CS
					MOV			A,@R0
					MOV			C,PSW.0
					MOV			TB8,C
					MOV			SBUF,A
					ADD			A,R2
					MOV			R2,A
					INC			R0
					DJNZ		R1,MCU_COM_END
					SETB		MCU_CS_ADD
					LJMP		MCU_COM_END
MCU_CS:				JB			MCU_CS_OK,MCU_SEND_END
					MOV			A,R2
					MOV			C,PSW.0
					MOV			TB8,C
					MOV			SBUF,A
					SETB		MCU_CS_OK
					LJMP		MCU_COM_END
MCU_SEND_END:		JB			MCU_END_OK,MCU_SEND_OVER
					MOV			A,#16H
					MOV			C,PSW.0
					MOV			TB8,C
					MOV			SBUF,A
					SETB		MCU_END_OK
					LJMP		MCU_COM_END
MCU_SEND_OVER:		CLR			MCU_CS_OK
					CLR			SEN_HE_OK
					CLR			SEND_68_OK
					CLR			SEND_FIRST_OK
					CLR			MCU_CS_ADD
					CLR			MCU_END_OK
					CLR			P1.1
					SETB		MCU_SEND_ALL
					SETB		REN
					CLR			R_T_485
					LCALL		CLR_BUFFER
					JB			ZB_SEND_WAIT,RS485_BACK_TO_ZB
					LJMP		MCU_COM_END
RS485_BACK_TO_ZB:	SETB		ZB_SEND_FROM_485
					CLR			ZB_SEND_WAIT
MCU_COM_END:		JNB			REC_ERR,MCU_RECEIVE_END
					CLR			MCU_RECEIVE_ALL
MCU_RECEIVE_END:   	SETB		EA
					POP			B
					POP			PSW
					POP			ACC
					

					RETI
					NOP
					NOP
					LJMP		INIT_SYS

;****************************************************************
;接收中用到偶校验
;****************************************************************
CHECK_P:			JB			P,P_BIT_0
					JB			RB8,P_ERR
					LJMP		P_OK
P_BIT_0:			JNB			RB8,P_ERR
P_OK:				CLR			REC_ERR
					LJMP		CHECK_P_END
P_ERR:				SETB		REC_ERR
CHECK_P_END:		RET					
;***********************************************
; read I2C both START of data byte
;入口参数:I2C地址在R2中,读命令字在R1中
;需读数据的字节数保存在B中	OK 2000.4.21
;出口参数:读出的数据保存在R0为首地址的内存单元中
;***********************************************
READ_XDATA:			LCALL		I2C_START
					MOV			A,R1
					CLR			ACC.0
					LCALL		WRITE_BYTE
					JC			RDA_RET
					MOV			A,R2
					LCALL		WRITE_BYTE
					JC			RDA_RET
					LCALL		I2C_START
					MOV			A,R1
					LCALL		WRITE_BYTE
					JC			RDA_RET
					LJMP		CONTINUE_READ
					NOP
					LJMP		RDA_RET
CONTINUE_READ:		LCALL		REDA_BYTE
					MOV			@R0,A
					INC			R0
					CLR			ROM_SDA
					SETB		ROM_SCL
					NOP
					CLR			ROM_SCL
					SETB		ROM_SDA
					DJNZ		B,CONTINUE_READ
					SETB		ROM_SDA
					SETB		ROM_SCL
RDA_RET:			LCALL		I2C_STOP
					RET
;***********************************************
; WRITE I2C both START of data byte
;入口参数:I2C地址在R2中,读命令字在R1中
;需写数据的字节数保存在B中	OK 2000.4.21
;入口参数:读入的数据保存在R0为首地址的内存单元中
;***********************************************
WRITE_XDATA:		LCALL		I2C_START
					MOV			A,R1
					LCALL		WRITE_BYTE
					JC			WRI_RET
					MOV			A,R2
					LCALL		WRITE_BYTE
					JC			WRI_RET
					LCALL		I2C_START
					MOV			A,R1
					LCALL		WRITE_BYTE
					JC			WRI_RET
					LJMP		CONTINUE_READ
					NOP
					LJMP		WRI_RET
CONTINUE_WRITE:		MOV			A,@R0
					INC			R0
					LCALL		WRITE_BYTE
					JC			WRI_RET
					CLR			ROM_SDA
					SETB		ROM_SCL
					NOP
					CLR			ROM_SCL
					SETB		ROM_SDA
					DJNZ		B,CONTINUE_WRITE
					SETB		ROM_SDA
					SETB		ROM_SCL
WRI_RET:			LCALL		I2C_STOP
					RET

;****************************************************************
;I2C用到的子程序
;****************************************************************
I2C_START:			CLR			ROM_SCL
					NOP
					SETB		ROM_SDA
					NOP
					SETB		ROM_SCL
					NOP
					CLR			ROM_SDA
					NOP
					NOP
					RET

I2C_STOP:			CLR			ROM_SCL
					NOP
					CLR			ROM_SDA
					NOP
					SETB		ROM_SCL
					NOP
					SETB		ROM_SDA
					NOP
					NOP
					CLR			ROM_SCL
					NOP
					CLR			ROM_SDA
					NOP
					NOP
					RET

REDA_BYTE:			MOV			R7,#08H
RD_B1:				SETB		ROM_SDA
 					NOP
					SETB		ROM_SCL
					NOP
					MOV			C,ROM_SDA
					RLC			A
					CLR			ROM_SCL
					DJNZ		R7,RD_B1
       	        	RET

WRITE_BYTE:			MOV			R7,#08H
WR_B1:				CLR			ROM_SCL
 					RLC			A
					MOV			ROM_SDA,C
					NOP
					SETB		ROM_SCL
					DJNZ		R7,WR_B1
					CLR			ROM_SCL
					NOP
					SETB		ROM_SDA
					NOP
					SETB		ROM_SCL
					MOV			C,ROM_SDA
					CLR			ROM_SCL
					RET



;************************************************************************
;*地址检查程序*
;************************************************************************
CHECK_ADDR:
					MOV			R0,#BUFFER+15
					MOV			B,#5
ALL99_ADDR:			CJNE		@R0,#99H,ALL00_ADDR
					INC			R0
					DJNZ		B,ALL99_ADDR
					SETB		REC_ERR
					LJMP		CHECK_END
ALL00_ADDR:			MOV			R0,#BUFFER+15
					MOV			B,#5
					CJNE		@R0,#00H,CHECK_END
					INC			R0
					DJNZ		B,ALL00_ADDR
					SETB		REC_ERR
CHECK_END:			MOV			C,REC_ERR
					RET
					NOP
					NOP
					RET


;************************************************************************
;*延时程序			使用工作寄存器3区*
;************************************************************************
DELAY:				PUSH		PSW
					SETB		PSW.3
					SETB		PSW.4
					MOV			R1,#0FFH
DELAY1:				MOV			R2,#0FFH
					DJNZ		R2,$
					DJNZ		R1,DELAY1
					POP			PSW
					RET
;************************************************************************
;*清BUFFER	*
;************************************************************************
CLR_BUFFER:			MOV			R0,#BUFFER
					MOV			R1,#48
					MOV			A,#0
CLR_NEXT:			MOV			@R0,A
					INC			R0
					DJNZ		R1,CLR_NEXT
					RET
;************************************************************************
;*清狗程序	*
;************************************************************************
CLR_WATCHER_DOG:	CLR			WDI
					NOP
					NOP
					SETB		WDI
					RET

END
								

⌨️ 快捷键说明

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