📄 snt-c485.asm
字号:
JB EVEN,BROD_AB
JB RB8,BRA ;偶校验错,出错处理
LJMP BROD_AC
BROD_AB: JNB RB8,BRA ;偶校验错,出错处理
BROD_AC: MOV A,TEMP
CJNE A,#68H,BROD_A6A;判断起始符
MOV R3,#68H
MOV R2,#15
MOV R0,#42H
BROD_D: MOV YSRES1,#02H ;500MS延时
BROD_AE: MOV YSRES2,#0E0H
BROD_AF: MOV YSRES3,#0
BROD_AG: JBC RI,BROD_AH
DJNZ YSRES3,BROD_AG
DJNZ YSRES2,BROD_AF
DJNZ YSRES1,BROD_AE
BRB: LJMP ERR1 ;若500MS内没有接收到有效数据,出错处理
BROD_AH: MOV A,SBUF
MOV TEMP,A
LCALL EVENJ
JB EVEN,BROD_AI
JB RB8,BRB ;偶校验错,出错处理
LJMP BROD_AJ
BROD_AI: JNB RB8,BRB ;偶校验错,出错处理
BROD_AJ: MOV A,TEMP
MOV @R0,A
INC R0
ADD A,R3
MOV R3,A
DJNZ R2,BROD_D
;以下判断校验和
MOV YSRES1,#02H ;500MS延时
BROD_AK: MOV YSRES2,#0E0H
BROD_AL: MOV YSRES3,#0
BROD_AM: JBC RI,BROD_AN
DJNZ YSRES3,BROD_AM
DJNZ YSRES2,BROD_AL
DJNZ YSRES1,BROD_AK
BRC: LJMP ERR1 ;若500MS内没有接收到有效数据,出错处理
BROD_AN: MOV A,SBUF
MOV TEMP,A
LCALL EVENJ
JB EVEN,BROD_AO
JB RB8,BRC ;偶校验错,出错处理
LJMP BROD_AP
BROD_AO: JNB RB8,BRC ;偶校验错,出错处理
BROD_AP: MOV A,R3
CJNE A,TEMP,BRC
;以下判断结束符
MOV YSRES1,#02H ;500MS延时
BROD_AQ: MOV YSRES2,#0E0H
BROD_AR: MOV YSRES3,#0
BROD_AS: JBC RI,BROD_AT
DJNZ YSRES3,BROD_AS
DJNZ YSRES2,BROD_AR
DJNZ YSRES1,BROD_AQ
BRD: LJMP ERR1 ;若500MS内没有接收到有效数据,出错处理
BROD_AT: MOV A,SBUF
MOV TEMP,A
LCALL EVENJ
JB EVEN,BROD_AU
JB RB8,BRD ;偶校验错,出错处理
LJMP BROD_AU
BROD_AV: JNB RB8,BRD ;偶校验错,出错处理
BROD_AU: MOV A,TEMP
CJNE A,#16H,BRD
;以下判断数据项的正确性
MOV A,48H
CJNE A,#68H,BRD
MOV A,49H
CJNE A,#81H,BRD
MOV A,4BH
CJNE A,#43H,BRD
MOV A,4CH
CJNE A,#0C3H,BRD
;以下暂存表地址
MOV R2,#6
MOV R0,#BADD0
MOV R1,#42H
BROD_AW: MOV A,@R1
MOV @R0,A
INC R1
DEC R0
DJNZ R2,BROD_AW
;以下整理读数值,存于DATA4--DATA1中
SETB TONG_B
MOV SCON,#50H
SETB SUCESS1
SETB ES
RET
ERR1: SETB TONG_B
MOV SCON,#50H
CLR SUCESS1
SETB ES
RET
;**************************************
;整理广播读表地址所发命令数据子程序
;数据存于:41H-4EH
;**************************************
BRO_COLL: MOV 41H,#68H ;起始符
MOV R3,#68H ;R3:校验和
MOV TEMP,#0AAH ;广播地址,6个0AAH
MOV R1,#42H
MOV R2,#6
BRO_C1: MOV A,TEMP
MOV @R1,A
ADD A,R3
MOV R3,A
INC R1
DJNZ R2,BRO_C1
MOV 48H,#68H
MOV A,R3
ADD A,#68H
MOV R3,A
MOV 49H,#01H ;控制码
MOV A,R3
ADD A,#01H
MOV R3,A
MOV 4AH,#02H ;数据域长度
MOV A,R3
ADD A,#02H
MOV R3,A
MOV 4BH,#43H ;数据标识低字节
MOV A,R3
ADD A,#43H
MOV R3,A
MOV 4CH,#0C3H ;数据标识高字节
MOV A,R3
ADD A,#0C3H
MOV R3,A
MOV 4DH,R3 ;校验和
MOV 4EH,#16H ;结束符
RET
;**********************************************
;采集器向上位机应答读表地址命令
;**********************************************
RET_ADDR: JNB SUCESS1,RET_A4
LCALL DACOLL
CLR ES
SETB TONG_B
CLR TONG_A
MOV SCON,#50H ;通讯用方式1,1位起始位,8位数据位,1位停止位
MOV R2,#0AH
MOV R1,#41H
RET_A1: MOV SBUF,@R1
RET_A2: JBC TI,RET_A3
LJMP RET_A2
RET_A3: INC R1
DJNZ R2,RET_A1
SETB ES
RET_A4: CLR REC_COMM
CLR ADDR_READ
RET
;*********************************************
;整理向上位机发送地址数据帧所需要的数据
;*********************************************
DACOLL: MOV 41H,#97H ;41H:97 起始符
MOV R3,#97H
MOV 42H,#40H ;42H:40 电表代号
MOV A,R3
ADD A,42H
MOV R3,A
MOV R2,#6 ;43H-48H:A5-A0 采集器地址
MOV R0,#BADD5
MOV R1,#43H
DAC_1: MOV A,@R0
MOV @R1,A
ADD A,R3
MOV R3,A
INC R1
INC R0
DJNZ R2,DAC_1
MOV A,R3
MOV @R1,A ;49H:R3 校验和
INC R1
MOV @R1,#16H ;4AH:16 结束符
RET
;**********************************************
;对电表写地址请求子程序
;**********************************************
WRADDR: CLR TONG_A ;切换到RS485通道
CLR TONG_B
CLR ES ;不允许串口中断
SETB TR ;发送允许
MOV SCON,#0D0H ;串口工作于方式3
LCALL WR_COLL ;整理所要发送的数据存于41H--4EH
MOV SBUF,#0FEH ;发送前导符
SETB TB8 ;
WRAD1: JBC TI,WRAD2
LJMP WRAD1
WRAD2: MOV R2,#18
MOV R0,#41H ;发送的命令存于41H--4EH
WRAD2A: MOV A,@R0
LCALL EVENJ ;偶校验
JB EVEN,WRAD3
CLR TB8
LJMP WRAD4
WRAD3: SETB TB8
WRAD4: MOV A,@R0
INC R0
MOV SBUF,A
WRAD5: JBC TI,WRAD6
LJMP WRAD5
WRAD6: DJNZ R2,WRAD2A ;是否发送完毕
;命令发送完毕
;*******************************
;*******************************
;以下为接收电表返回数据程序
CLR TR ;开始接收
WRAD6A: MOV YSRES1,#02H ;500MS延时
WRAD7: MOV YSRES2,#0E0H
WRAD8: MOV YSRES3,#0
WRAD9: JBC RI,WRADA
DJNZ YSRES3,WRAD9
DJNZ YSRES2,WRAD8
DJNZ YSRES1,WRAD7
WRA: LJMP ERR2 ;若500MS内没有接收到有效数据,出错处理
WRADA: MOV A,SBUF
MOV TEMP,A
LCALL EVENJ
JB EVEN,WRADB
JB RB8,WRA ;偶校验错,出错处理
LJMP WRADC
WRADB: JNB RB8,WRA ;偶校验错,出错处理
WRADC: MOV A,TEMP
CJNE A,#68H,WRAD6A ;判断起始符
MOV R3,#68H
MOV R2,#9
MOV R0,#42H
WRADD: MOV YSRES1,#02H ;500MS延时
WRADE: MOV YSRES2,#0E0H
WRADF: MOV YSRES3,#0
WRADG: JBC RI,WRADH
DJNZ YSRES3,WRADG
DJNZ YSRES2,WRADF
DJNZ YSRES1,WRADE
WRB: LJMP ERR2 ;若500MS内没有接收到有效数据,出错处理
WRADH: MOV A,SBUF
MOV TEMP,A
LCALL EVENJ
JB EVEN,WRADI
JB RB8,WRB ;偶校验错,出错处理
LJMP WRADJ
WRADI: JNB RB8,WRB ;偶校验错,出错处理
WRADJ: MOV A,TEMP
MOV @R0,A
INC R0
ADD A,R3
MOV R3,A
DJNZ R2,WRADD
;以下判断校验和
MOV YSRES1,#02H ;500MS延时
WRADK: MOV YSRES2,#0E0H
WRADL: MOV YSRES3,#0
WRADM: JBC RI,WRADN
DJNZ YSRES3,WRADM
DJNZ YSRES2,WRADL
DJNZ YSRES1,WRADK
WRC: LJMP ERR2 ;若500MS内没有接收到有效数据,出错处理
WRADN: MOV A,SBUF
MOV TEMP,A
LCALL EVENJ
JB EVEN,WRADO
JB RB8,WRC ;偶校验错,出错处理
LJMP WRADP
WRADO: JNB RB8,WRC ;偶校验错,出错处理
WRADP: MOV A,R3
CJNE A,TEMP,WRC
;以下判断结束符
MOV YSRES1,#02H ;500MS延时
WRADQ: MOV YSRES2,#0E0H
WRADR: MOV YSRES3,#0
WRADS: JBC RI,WRADT
DJNZ YSRES3,WRADS
DJNZ YSRES2,WRADR
DJNZ YSRES1,WRADQ
WRD: LJMP ERR2 ;若500MS内没有接收到有效数据,出错处理
WRADT: MOV A,SBUF
MOV TEMP,A
LCALL EVENJ
JB EVEN,WRADU
JB RB8,WRD ;偶校验错,出错处理
LJMP WRADU
WRADV: JNB RB8,WRD ;偶校验错,出错处理
WRADU: MOV A,TEMP
CJNE A,#16H,WRD
;以下判断数据项的正确性
MOV A,48H
CJNE A,#68H,WRD
MOV A,49H
CJNE A,#8AH,WRD
MOV A,4AH
CJNE A,#00H,WRD
;以下判断表地址是否正确
MOV R2,#6
MOV R0,#BADD0
MOV R1,#42H
WRADW: MOV A,@R0
MOV TEMP,A
MOV A,@R1
CJNE A,TEMP,WRD
INC R1
DEC R0
DJNZ R2,WRADW
;以下整理读数值,存于DATA4--DATA1中
SETB TONG_B
MOV SCON,#50H
SETB SUCESS2
SETB ES
RET
ERR2: SETB TONG_B
MOV SCON,#50H
CLR SUCESS2
SETB ES
RET
;**************************************
;整理写表地址所发命令数据子程序
;数据存于:41H-52H
;**************************************
WR_COLL: MOV 41H,#68H ;起始符
MOV R3,#68H ;R3:校验和
MOV TEMP,#99H ;广播地址,6个99H
MOV R1,#42H
MOV R2,#6
WR_C1: MOV A,TEMP
MOV @R1,A
ADD A,R3
MOV R3,A
INC R1
DJNZ R2,WR_C1
MOV 48H,#68H
MOV A,R3
ADD A,#68H
MOV R3,A
MOV 49H,#0AH ;控制码
MOV A,R3
ADD A,#0AH
MOV R3,A
MOV 4AH,#06H ;数据域长度
MOV A,R3
ADD A,#06H
MOV R3,A
MOV R1,#4BH ;表地址(加33H处理)送4BH-50H
MOV R0,#BADD0
MOV R2,#6
WR_C2: MOV A,@R0
ADD A,#33H
MOV @R1,A
ADD A,R3
MOV R3,A
INC R1
DEC R0
DJNZ R2,WR_C2
MOV 51H,R3 ;校验和
MOV 52H,#16H ;结束符
RET
;**********************************************
;采集器向上位机应答写表地址命令
;**********************************************
RET_WR: JNB SUCESS2,RET_W4
LCALL WRACO
CLR ES
SETB TONG_B
CLR TONG_A
MOV SCON,#50H ;通讯用方式1,1位起始位,8位数据位,1位停止位
MOV R2,#0AH
MOV R1,#41H
RET_W1: MOV SBUF,@R1
RET_W2: JBC TI,RET_W3
LJMP RET_W2
RET_W3: INC R1
DJNZ R2,RET_W1
CLR REC_COMM
CLR ADDR_WR
SETB ES
RET_W4: CLR REC_COMM
CLR ADDR_WR
RET
;*********************************************
;整理向上位机发送写地址数据帧所需要的数据
;*********************************************
WRACO: MOV 41H,#97H ;41H:97 起始符
MOV R3,#97H
MOV 42H,#40H ;42H:40 电表代号
MOV A,R3
ADD A,42H
MOV R3,A
MOV R2,#6 ;43H-48H:A5-A0 采集器地址
MOV R0,#BADD5
MOV R1,#43H
WRAC_1: MOV A,@R0
MOV @R1,A
ADD A,R3
MOV R3,A
INC R1
INC R0
DJNZ R2,WRAC_1
MOV A,R3
MOV @R1,A ;49H:R3 校验和
INC R1
MOV @R1,#16H ;4AH:16 结束符
RET
;**********************************************
;查采集器所接电表数子程序
;结果存于寄存器DBSHU中
;**********************************************
CBSHU: MOV R2,#0
CBSHU_0: MOV A,R2
CJNE A,#36,CBSHU_1 ;若电表序号大于35,则转EEPROM的第2页
CBSHU_1: JC CBSHU_2
LJMP CBSHU_4
CBSHU_2: MOV B,#7
MOV A,R2
MUL AB
MOV DPL,A ;找到数据块的首址
MOV DPH,#1
LCALL READ_1 ;读出数据,若为AA,则该块存电表地址,否则为结束
CJNE A,#0AAH,CBSHU_3
INC R2 ;为AAH,继续查找
LJMP CBSHU_0
CBSHU_3: MOV A,R2 ;不是AA,结束
MOV DBSHU,A
RET
CBSHU_4: MOV A,R2 ;在页面2中查找
CLR C
SUBB A,#36
MOV R2,A
CBSHU_5: MOV A,R2
CJNE A,#35,CBSHU_6
CBSHU_6: JC CBSHU_7
LJMP CBSHU_8
CBSHU_7: MOV B,#7
MOV A,R2
MUL AB
MOV DPL,A ;找到数据块的首址
MOV DPH,#2
LCALL READ_1 ;读出数据,若为AA,则该块存电表地址,否则为结束
CJNE A,#0AAH,CBSHU_8
INC R2
LJMP CBSHU_5
CBSHU_8: MOV A,R2 ;不是AA,结束
ADD A,#36
MOV DBSHU,A
RET
;**********************************************
;存储采集器地址子程序,设置采集器地址用
;存采集器地址A6..A0,序列号SERNO
;**********************************************
STOR_ADDR: PUSH ACC
PUSH B
PUSH PSW
PUSH DPL
PUSH DPH
MOV A,R2
PUSH ACC
MOV A,R1
PUSH ACC
MOV A,R0
PUSH ACC
MOV R2,#07H
MOV R0,#ADDR6
MOV DPTR,#0000H ;EEPROM:000-006:存采集器地址
STOR_A1: MOV A,@R0 ;007:存序列号
LCALL WRITE_1
INC R0
INC DPL
DJNZ R2,STOR_A1
MOV A,SERNO
MOV SER,A
LCALL WRITE_1
MOV R2,#07H
MOV R0,#ADDR6
MOV R1,#CK_ADDR6
STOR_A2: MOV A,@R0
MOV @R1,A
INC R0
INC R1
DJNZ R2,STOR_A2
POP ACC
MOV R0,A
POP ACC
MOV R1,A
POP ACC
MOV R2,A
POP DPH
POP DPL
POP PSW
POP B
POP ACC
RET
;*********************************************
;向上位机回应设置采集器地址子程序
;*********************************************
RET_DI: MOV 41H,#97H ;41H:97 起始符
MOV R3,#97H
MOV 42H,#40H ;42H:40 电表代号
MOV A,R3
ADD A,42H
MOV R3,A
MOV R2,#7 ;43H-49H:A6-A0 采集器地址
MOV R0,#ADDR6
MOV R1,#43H
RET_D1: MOV A,@R0
MOV @R1,A
ADD A,R3
MOV R3,A
INC R1
INC R0
DJNZ R2,RET_D1
MOV A,SERNO ;4AH:序列号
MOV @R1,A
ADD A,R3
MOV R3,A
INC R1
MOV A,R3
MOV @R1,A ;4BH:R3 校验和
INC R1
MOV @R1,#16H ;4AH:16 结束符
MOV R1,#41H
MOV R2,#12
RET_D2: MOV SBUF,@R1
RET_D3: JBC TI,RET_D4
LJMP RET_D3
RET_D4: INC R1
DJNZ R2,RET_D2
RET
RET
;*********************************************************************
;增加表地址子程序
;根据表序号增加表地址,按顺序递增
;表地址从100H开始,电表数寄存器为DBSHU,存储块首字节存有数标志AAH,表地址
;从高到低依次为BADD5,BADD4,BADD3,BADD2,BADD1,BADD0
;*********************************************************************
ADDR_ADD: PUSH ACC
PUSH B
PUSH PSW
PUSH DPL
PUSH DPH
MOV A,R3
PUSH ACC
MOV A,R0
PUSH ACC
LCALL PAN_HAO
JB YOUBIAO,ARD3A
MOV A,DBSHU
CJNE A,#36,ADDR_A1 ;根据表号的大小决定存储的页面
ADDR_A1: JC ADDR_A2
CLR C ;若表号大于35,存于页面2
MOV A,DBSHU
SUBB A,#36
MOV DPH,#2
MOV B,#07H
MUL AB
MOV DPL,A
LJMP ADDR_A3
ADDR_A2: MOV A,DBSHU ;若表号小于36,存于页面1
MOV B,#07H
MUL AB
MOV DPL,A
MOV DPH,#1
ADDR_A3: MOV A,#0AAH ;将首字节写成AAH
LCALL WRITE_1
INC DPTR ;下面写表号
MOV R0,#BADD5
MOV R3,#06H
ARAB: MOV A,@R0
LCALL WRITE_1
INC DPTR
INC R0
DJNZ R3,ARAB
MOV A,DBSHU
INC A
MOV DBSHU,A
SETB ZS_OK
MOV TEMP,#0A2H ;增表地址标志
SJMP ARD3
ARD3A: CLR ZS_OK
ARD3: POP ACC
MOV R0,A
POP ACC
MOV R3,A
POP DPH
POP DPL
POP PSW
POP B
POP ACC
RET
;*****************************************************************
;删除表地址子程序,即将要删除的表地址从EEPROM中删除并将后面的表地址
;依次前移
;*****************************************************************
DEL_ADDR: PUSH ACC ;现场保护
PUSH B
PUSH PSW
PUSH DPL
PUSH DPH
MOV A,R0
PUSH ACC
MOV A,R1
PUSH ACC
MOV A,R2
PUSH ACC
MOV A,R3
PUSH ACC
MOV A,R6
PUSH ACC
LCALL PAN_HAO ;判断要删除的表号(存于R2)
JB YOUBIAO,DEL_A01
CLR ZS_OK
LJMP DEL_A3
DEL_T1: LJMP DEL_A3A
DEL_A01: MOV A,DBSHU ;电表数减1
DEC A
MOV DBSHU,A
MOV TEMP,#0A3H
SETB ZS_OK
MOV A,R2
CJNE A,#35,DEL_T0
DEL_T0: JNC DEL_T1
MOV R0,A ;R0存被覆盖的表序号
MOV R1,A ;R1存下一表序号
INC R1
DEL_A0: MOV A,R0
CJNE A,#35,DEL_A1 ;若为EEPROM第1页最后一块表
LJMP DEL_3E ;则要单独处理
DEL_A1: MOV B,#07H ;要移的表地址全在第1页
MOV A,R0
MUL AB
MOV DPL,A
MOV TEMP1,A ;
MOV DPH,#01H
LCALL READ_1
CJNE A,#0AAH,DEL_A3 ;若首地址不是AAH,则不是表地址
MOV A,R1
MOV B,#07H
MUL AB
MOV DPL,A
MOV TEMP2,A
MOV R2,#07H
DEL_A2: MOV DPL,TEMP2
LCALL READ_1 ;取下一块表地址数据
MOV DPL,TEMP1
LCALL WRITE_1 ;将下一块表地址数据移到上一区中
INC TEMP1
INC TEMP2
DJNZ R2,DEL_A2 ;判该区(7个字节)的数据是否移完
INC R0
INC R1
LJMP DEL_A0
DEL_A3: POP ACC
MOV R6,A
POP ACC
MOV R3,A
POP ACC
MOV R2,A
POP ACC
MOV R1,A
POP ACC
MOV R0,A
POP DPH
POP DPL
POP PSW
POP B
POP ACC
RET
DEL_3B: MOV A,R2
MOV R0,A
MOV R1,A
INC R1
LJMP DEL_A5A
DEL_A3A: CJNE A,#35,DEL_3B
DEL_3E: MOV A,R0
DEL_A4: MOV B,#07H ;找到页1中最后1块表的首址
MOV A,R0
MUL AB
MOV TEMP1,A
CLR A ;下一表的首地址为页2的第一个字节
MOV TEMP2,A
MOV R2,#07H
DEL_A5: MOV DPH,#2
MOV DPL,TEMP2
LCALL READ_1
MOV DPL,TEMP1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -