📄 cj_hqf2.asm
字号:
;用跳针短路可对表号进行处理.
;在初始化时和定时器0中断中清狗
;硬件4051管脚定义
WDI BIT P1.5 ;清狗位
ROM_SCL BIT P1.6 ;读写AT24C04数据的时钟位
ROM_SDA BIT P1.7 ;读写AT24C04数据的数据位
R_T BIT P1.4 ;载波发送和接收的判断标志位,0--->发送,1--->接收
RXD_TXD BIT P1.3 ;载波接收和发送的数据位
ROM_WP BIT P3.5 ;AT24C04的读写位
R_T_485 BIT P3.4 ;485接收发送标志,0--->接收,1--->发送
COM_SELECT BIT P3.7 ;控制CD4052 (修改RS_485为COM_SELECT)
;定义保存于2404中数据的地址
METER_NO EQU 00H ;表号的首地址,最大可以存34块电表,采用208字节,如果存34块表的话,还空出4字节
METER_SUM EQU 0D0H ;表号总数
METER_LEN EQU 0D1H ;表号长度
METER_USE EQU 0D2H ;实际存储表号数,即采集器管理了几块电表
;定义保存于RAM中的数据的地址
;内部寄存器定义
NR00 DATA 000H
NR01 DATA 001H
NR02 DATA 002H
NR03 DATA 003H
NR04 DATA 004H
NR05 DATA 005H
NR06 DATA 006H
NR07 DATA 007H
;
NR10 DATA 008H
NR11 DATA 009H
NR12 DATA 00AH
NR13 DATA 00BH
NR14 DATA 00CH
NR15 DATA 00DH
NR16 DATA 00EH
NR17 DATA 00FH
;
NR20 DATA 010H
NR21 DATA 011H
NR22 DATA 012H
NR23 DATA 013H
NR24 DATA 014H
NR25 DATA 015H
NR26 DATA 016H
NR27 DATA 017H
;
NR30 DATA 018H
NR31 DATA 019H
NR32 DATA 01AH
NR33 DATA 01BH
NR34 DATA 01CH
NR35 DATA 01DH
NR36 DATA 01EH
NR37 DATA 01FH
;
;20H全局通讯标志
MCU_RECEIVE_ALL BIT 00H ;HQF
MCU_SEND_ALL BIT 01H ;HQF
BROADCAST_BIT BIT 02H ;(E99_BIT改为BROADCAST_BIT)
REC_ERRS BIT 03H ;HQF
MCU_DATA_OK BIT 04H ;HQF
SEND_FIRST_OK BIT 05H ;HQF
RE_FE_OK BIT 06H ;HQF
MCU_END_OK BIT 07H ;HQF
;21H,22H,23H载波通讯标志
ZB_SEND_ALL BIT 08H ;HQF
ZB_RECEIVE_ALL BIT 09H ;HQF
ZB_REC_H_L BIT 0AH ;HQF
ZB_REC_H_H BIT 0BH ;HQF
ZB_HEAD_OK BIT 0CH ;HQF
ZB_S_OK BIT 0DH ;HQF
ZB_SEND_CL_OK BIT 0EH ;HQF
ZB_SEN_ERR BIT 0FH ;HQF
ZB_SEND_CODE_OK BIT 10H ;HQF
ZB_REC_INIT_OK BIT 11H ;HQF
ZB_REC_INFO_OK BIT 12H ;HQF
ZB_REC_CL_OK BIT 13H ;HQF
ZB_REC_DATA_OK BIT 14H ;HQF
ZB_REC_CS_OK BIT 15H ;HQF
ZB_ERR BIT 16H ;HQF
ZB_SEND_METER_OK BIT 17H ;HQF
ZB_SEND_DATA_OK BIT 18H ;HQF
ZB_SEND_CS_OK BIT 19H ;HQF
ZB_SEND_ADDR_OK BIT 1AH ;HQF
ZB_SEND_L_OK BIT 1BH ;HQF
ZB_SEND_FROM_485 BIT 1CH ;HQF
ZB_SEND_WAIT BIT 1DH ;HQF
ZB_TO_JZQ BIT 1EH ;HQF
;24H MCU用到的标识
REC_ERR BIT 20H ;HQF
SEN_HE_OK BIT 21H ;HQF
SEND_68_OK BIT 22H ;HQF
MCU_CS_ADD BIT 23H ;HQF
MCU_CS_OK BIT 24H ;HQF
METER_OK BIT 25H ;HQF
HEAD_OK BIT 26H ;HQF
MCU_CL_OK BIT 27H ;HQF
;采集器发送接收数据的BUFFER采用48字节
BUFFER EQU 30H ;采集器发送接受的BUFFER入口地址,BUFE为30H---5FH
/*
30H--35H------为接收到的A0---A6
36H-----------为接收到的分隔符
37H-----------为接收到的COMMAND
38H-----------为接收到的LENGTH
39H-3AH-------为接收到的DI0,DI1
*/
A0 EQU 30H
A1 EQU 31H
A2 EQU 32H
A3 EQU 33H
A4 EQU 34H
A5 EQU 35H
COMMAND EQU 37H
LENGTH EQU 38H
DI0 EQU 39H
DI1 EQU 3AH
;DOG1 EQU 60H ;采用软件清狗方式,采用双循环模式
;DOG2 EQU 61H
METER_TEMP EQU 60H ;从2404里读出电表表号后临时存储区。6字节。62H----67H
METER_SUM_TEMP EQU 66H ;2404里存电表总数
CS EQU 67H ;校验值存储
ZB_CS_L EQU 68H
ZB_CS_H EQU 69H
ZB_CODE EQU 6AH ;载波用的DI0,DI1使用空间6FH,70H
ZB_L EQU 6CH
;采集器和485通讯采用的特殊示
RS485HEAD EQU 0FEH ;采集器和电表通讯的帧头
RS485HEAD2 EQU 68H ;采集器和电表通讯的帧起始符
RS485END EQU 16H ;采集器和电表通讯的结束符
;采集器和ZB通讯采用的特殊示
ZB_HEAD_L EQU 09H ;载波用的帧头AF,09
ZB_HEAD_H EQU 0AFH
ZB_UP_ADDR EQU 0BBH ;载波用的集中器地址
;
WR_COM EQU 0A0H ;AT24C04写命令字
RD_COM EQU 0A1H ;AT24C04读命令字
;**********************************************************************************************
;************************************** 程 序 头 **************************************
;**********************************************************************************************
ORG 0000H
LJMP INIT_SYS
NOP
NOP
RETI
ORG 0003H
LJMP ZB
NOP
NOP
RETI
ORG 001BH
RETI
NOP
NOP
RETI
ORG 0023H
LJMP MCU_COM
NOP
NOP
RETI
;**********************************************************************************************
ORG 0030H
INIT_SYS: CLR P1.0
CLR P1.1
CLR EA
MOV SP,#70H
MOV P1,#0FFH
MOV P3,#0FFH
CLR PSW.3
CLR PSW.4
MOV TH1,#0D6H
MOV TL1,#0D6H
MOV TMOD,#21H
MOV PCON,#80H
MOV SCON,#0D0H
MOV IP,#07H
SETB IT0 ;载波中断(int1)沿触发
SETB EX0 ;载波中断允许
SETB TR1 ;允许t1计数
;SETB ET0 ;T0中断允许
SETB P3.0
SETB P3.1
CLR PSW.3
CLR PSW.4
SETB ES
SETB EX0
CLR P1.0
CLR P1.1
MOV R0,#7FH
CLEAR_RAM: MOV A,#00H
MOV @R0,A
DJNZ R0,CLEAR_RAM
SETB EA
MAIN:
CLR R_T_485 ;485接收状态
SETB EX0
SETB ET0 ;T0中断允许
SETB P3.0
SETB P3.1
SETB REN
SETB COM_SELECT ;初始化为红外通讯
MOV R1,#02H
MOV R6,#0FH
START_DELAY: CLR WDI
NOP
NOP
SETB WDI
LCALL DELAY
DJNZ R1,START_DELAY
START_DELAY1: SETB P1.0
SETB P1.1
LCALL CLR_WATCHER_DOG
LCALL DELAY
JNB MCU_RECEIVE_ALL,DO_NEXT
JB ZB_SEND_FROM_485,UP_TO_JZQ1
LCALL RECEIVE
LJMP START_DELAY1
DO_NEXT: JNB ZB_RECEIVE_ALL,DO_NEXT2
LCALL ZB_REC_DO
LJMP START_DELAY1
DO_NEXT2: ;JNB ZB_SEND_FROM_485,DO_NEXT3
;LCALL UP_TO_JZQ
;LJMP START_DELAY1
DO_NEXT3: JNB MCU_SEND_ALL,RS485_WAIT
CLR MCU_SEND_ALL
;JB ZB_SEND_WAIT,UP_TO_JZQ1
;SETB P3.2
;SETB ES
LJMP START_DELAY1
UP_TO_JZQ1: LCALL UP_TO_JZQ
;CLR P3.2
; JNB COM_SELECT,RS485_TO_MCU
MOV R6,#0FH
LJMP START_DELAY1
RS485_WAIT: DJNZ R6,RS485_TO_MCU
LJMP MAIN
RS485_TO_MCU: LJMP START_DELAY1
MAIN_END: LJMP MAIN
;************************************************************************
;* MCU串口接收处理 使用工作寄存器0区*
;************************************************************************
RECEIVE: CLR EA
CLR BROADCAST_BIT
CLR WDI
NOP
NOP
SETB WDI
CLR MCU_RECEIVE_ALL
MOV A,LENGTH
ADD A,#09H
ADD A,R7
MOV NR21,A
MOV A,#BUFFER
MOV NR20,A
SETB TI
SETB EA
RET
;************************************************************************
;*载波处理 使用工作寄存器0区*
;************************************************************************
ZB_REC_DO: CLR EA
CLR ZB_RECEIVE_ALL
MOV R0,#BUFFER+6
MOV @R0,#68H
MOV A,LENGTH
SUBB A,#3
MOV LENGTH,A
MOV R7,A
MOV R0,#BUFFER+9
REBUILD_BUFFER: MOV A,@R0
ADD A,#33H
MOV @R0,A
INC R0
DJNZ R7,REBUILD_BUFFER
MOV A,#BUFFER
MOV NR20,A
MOV A,LENGTH
ADD A,#09H
MOV NR21,A
CLR COM_SELECT
SETB ZB_SEND_WAIT
CLR EX0
SETB TI
SETB ES
SETB EA
RET
UP_TO_JZQ: CLR P1.1
CLR EA
CLR ZB_SEND_FROM_485
MOV R7,#6
MOV R0,#BUFFER
MOV R1,#METER_TEMP
RE_ZB_INFO: MOV A,@R0
MOV @R1,A
INC R0
INC R1
DJNZ R7,RE_ZB_INFO ;R2--->R7
MOV R0,#BUFFER+8
MOV A,@R0
MOV R7,A
ZB_DATA: INC R0
MOV A,@R0
SUBB A,#33H
DJNZ R7,ZB_DATA
MOV R0,#BUFFER
MOV R1,#BUFFER+7
MOV R7,#4
RE_ZB_CL: MOV A,@R1
MOV @R0,A
LCALL ZB_CS_ADD
DJNZ R7,RE_ZB_CL
MOV R0,#BUFFER
INC R0
;MOV A,@R0
;ADD A,#4
;MOV @R0,A
MOV R0,#5FH
;MOV R1,#METER_TEMP
MOV R1,#BUFFER+11
MOV R7,LENGTH
MOV_DATA: MOV A,@R1
MOV @R0,A
INC R1
DEC R0
DJNZ R7,MOV_DATA
MOV R0,#BUFFER+4
MOV R1,#METER_TEMP
MOV R7,#6
RE_ZB_METER: MOV A,@R1
MOV @R0,A
LCALL ZB_CS_ADD
INC R0
INC R1
DJNZ R7,RE_ZB_METER
MOV @R0,#0FH ;HQF
MOV A,LENGTH
;SUBB A,#2
MOV A,#0FFH
MOV R7,A
MOV R1,#5FH
INC R0
RE_ZB_DATA: MOV A,@R1
MOV @R0,A
LCALL ZB_CS_ADD
INC R0
DEC R1
DJNZ R7,RE_ZB_DATA
MOV NR14,#0FFH
;SETB ZB_TO_JZQ
CLR R_T
CLR ES
SETB EX0
SETB EA
ZB_REC_NEXT: RET
;************************************************************************
;*载波接收和发送 使用工作寄存器1区*
;************************************************************************
ZB: CLR EA
;CLR ES
PUSH ACC
PUSH PSW
PUSH B
SETB PSW.3
CLR PSW.4
JNB R_T,TRANS ;判断是接收还是发射状态,做出相应处理
LCALL ZB_RECEIVE ;当R_T=1时,转发射
LJMP ZB_RETURN
TRANS: LCALL ZB_TRANS ;当R_T=0时,转发射
LJMP ZB_RETURN
ZB_RETURN: POP B
POP PSW
POP ACC
SETB EA
RETI
;************************************************************************
;*载波接收*
;************************************************************************
ZB_RE_RET: LJMP ZB_REC_RET
ZB_RE_ERR1: LJMP ZB_RE_ERR
/*ZB_REC_INTI: SETB R_T
JB ZB_REC_INIT_OK,ZB_RECEIVE
;MOV R7,#8
SETB ZB_REC_INIT_OK */
ZB_RECEIVE:
SETB R_T
MOV C,RXD_TXD
MOV A,R5
RLC A
MOV R5,A
ZB_REC_NO_END: JB ZB_REC_H_L,ZB_HEAD_H_BIT
CJNE A,#09H,ZB_RE_RET
SETB ZB_REC_H_L
MOV R6,#8
LJMP ZB_RE_RET
ZB_HEAD_H_BIT: DJNZ R6,ZB_RE_RET
MOV R6,#8
;CLR C
;MOV R5,#0
JB ZB_REC_H_H,ZB_REC_INFO
CJNE A,#0AFH,ZB_RE_ERR1
SETB ZB_REC_H_H
MOV R0,#BUFFER
MOV R7,#6
MOV R3,#0
MOV R2,#0
MOV R6,#8
LJMP ZB_REC_RET
ZB_REC_INFO: JB ZB_RECEIVE_ALL,ZB_RE_RET
JB ZB_REC_INFO_OK,ZB_REC_CL
CLR C
MOV @R0,A
LCALL ZB_CS_ADD
INC R0
DJNZ R7,ZB_RE_RET
SETB ZB_REC_INFO_OK
MOV R7,#2
;MOV @R0,#68H ;增加的为后面MCU串口发送服务的
INC R0
LJMP ZB_RE_RET
ZB_REC_CL: JB ZB_REC_CL_OK,ZB_REC_DATA
MOV @R0,A
LCALL ZB_CS_ADD
INC R0
DJNZ R7,ZB_RE_RET
SETB ZB_REC_CL_OK
MOV A,LENGTH
MOV R7,A
LJMP ZB_RE_RET
ZB_REC_DATA: JB ZB_REC_DATA_OK,ZB_REC_CS
MOV @R0,A
LCALL ZB_CS_ADD
INC R0
DJNZ R7,ZB_RE_RET
SETB ZB_REC_DATA_OK
MOV R7,#2
LJMP ZB_RE_RET
ZB_REC_CS: JB ZB_REC_CS_OK,ZB_REC_END_INFO
MOV @R0,A
INC R0
CLR C
SUBB A,R2
JNZ ZB_RE_ERR
MOV A,R3
MOV R2,A
DJNZ R7,ZB_REC_RET
SETB ZB_REC_CS_OK
LJMP ZB_REC_RET
ZB_REC_END_INFO: JB ZB_RECEIVE_ALL,ZB_REC_RET
;MOV @R0,A
;SUBB A,#16H
;JNZ ZB_RE_ERR
CLR ES
CLR ZB_REC_INIT_OK
CLR ZB_REC_H_L
CLR ZB_REC_H_H
CLR ZB_REC_INFO_OK
CLR ZB_REC_CL_OK
CLR ZB_REC_DATA_OK
CLR ZB_REC_CS_OK
CLR P1.0
CLR EX0
SETB ZB_RECEIVE_ALL
;LCALL CLR_BUFFER
LJMP ZB_REC_RET
ZB_RE_ERR: CLR ZB_REC_INIT_OK
CLR ZB_REC_H_L
CLR ZB_REC_H_H
CLR ZB_REC_INFO_OK
CLR ZB_REC_CL_OK
CLR ZB_REC_DATA_OK
CLR ZB_REC_CS_OK
CLR ZB_RECEIVE_ALL
SETB P1.0
SETB ZB_ERR
ZB_REC_RET: RET
;************************************************************************
;*载波发送处理* R0发送BUFFER的首地址,R4发送确认字符'S'
;************************************************************************
ZB_SEN_RET: LJMP ZB_SEND_RET
ZB_SEND_ERR1: LJMP ZB_SEND_ERR
ZB_TRANS:
CLR R_T
JB ZB_SEND_ALL,ZB_SEN_RET
JB ZB_S_OK,ZB_YES_SEND
CLR P1.1
MOV A,R4
CJNE A,#0FFH,ZB_SEND_ERR1
SETB ZB_S_OK
MOV R2,#00
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -