📄 cj_hqf2.asm
字号:
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 + -