📄 soc080225.asm
字号:
MOV DSPL5,#0EH ;;;传感器信号线接反,或者传感器上附加重量过大
MOV DSPL4,#18H ;;;显示" Err-1"
MOV DSPL3,#18H
MOV DSPL2,#16H
MOV DSPL1,#01H
SJMP STCLR
STCLR2:
MOV MNDAT1,CQDAT1 ;;;保存修补质量对应的内码
MOV MNDAT2,CQDAT2
MOV A,#15H
LCALL DISPLAY5 ;;;清0显示
MOV DSPL1,#00H
JNB DDT,STCLR3
MOV DSPL2,#00H ;;;小数点显示
STCLR3:
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
INIB: ;;;功能说明:设置初始状态位和状态字.
CLR WDBB
CLR DDT ;;;开机允许小数点显示
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
COMP: ;;;功能说明:处理每次称重值
NOP
NOP
JBC ADEN,COMP0
RET
COMP0:
MOV DATZ1,DATD1
MOV DATZ2,DATD2
LCALL PCB ;;;对质量进行处理.
MOV TEMP1,MNDAT1
MOV TEMP2,MNDAT2 ;;;(D1-D0)*M/D
MOV CQDAT1,DQXS1
MOV CQDAT2,DQXS2
LCALL CTOM ;;;将内码转换为质量存放在DATZ
JBC BDB,COMP2
JB SYMB,COMP01
LCALL LIMCOMP
JNB LMC,COMP01
MOV DSPL5,#0EH ;;;并返回到重新称量状态.
MOV DSPL4,#18H ;;;超载显示" Err-2"
MOV DSPL3,#18H
MOV DSPL2,#16H
MOV DSPL1,#04H
JMP COMP
COMP01:
MOV R5,CQXS1
MOV R6,CQXS2
COMP1:
MOV R1,#DSPT1 ;;;DATZ<MMDAT显示负数
MOV R7,#00H
LCALL BCD ;;;数据转换为显示值送DSPT
MOV R2,#04H ;;;;;;;;;;;;;;;05H
MOV R0,#DSPT5 ;;;;;;;;;;;;;;;DSPT5
LCALL BANK ;;;显示消隐
LCALL TTOL5 ;;;;;;;;;;;;;;;;TTOL5
JNB SYMB,COMP2
MOV A,CQXS1
ORL A,CQXS2
JZ COMP2 ;;;为0时不显示负号
MOV DSPL5,#16H ;;;;;;;;;;;;;;;
COMP2:
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
PCB: ;;;功能说明:根据当前接收到的质量与上一次的质量判断秤体的状态
MOV A,PREDAT1
JNZ PCB1
MOV A,PREDAT2
JNZ PCB1
MOV PREDAT1,DATZ1
MOV PREDAT2,DATZ2
RET
PCB1:
MOV R3,DATZ1
MOV R4,DATZ2
MOV R5,PREDAT1
MOV R6,PREDAT2
LCALL MAXMIN
MOV PREDAT1,DATZ1
MOV PREDAT2,DATZ2
MOV A,ADAT2
JNZ PCB2 ;;;确定为非稳定状态
MOV A,ADAT1
JNZ PCB2 ;;;确定为非稳定状态
INC WDB ;;;确定为稳定状态
INC WDB1
MOV A,WDB
CLR C
SUBB A,#18H
JNC PCB6 ;;;直接更新序列
MOV A,WDB1
CJNE A,#06H,PCB3 ;;;直接更新序列
MOV WDB1,#00H
JMP PCB7 ;;;小于时转入第一级滤波中
PCB2:
MOV WDB,#00H
MOV WDB1,#00H
MOV A,ADAT1
CLR C
SUBB A,#40H ;;;将差值与40H比较.
MOV A,ADAT2
SUBB A,#00H
JC PCB3 ;;;确定为摆动状态
MOV A,ADAT2
CLR C
RRC A
MOV DQXS2,A
MOV A,ADAT1
RRC A
ADD A,MIN1
MOV DQXS1,A ;;;确定为抖动状态
MOV A,DQXS2
ADDC A,MIN2
MOV DQXS2,A
RET
PCB3:
LCALL PXCPP ;;;第二级排序
RET
PCB7:
LCALL PXCPP06
RET
PCB6:
MOV DQXS1,DATZ1
MOV DQXS2,DATZ2
MOV WDB,#00H
MOV A,LED1
SETB ACC.0 ;;;稳定状态灯亮.
MOV LED1,A
SETB WDBB
PCB8:
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MAXMIN: ;;;判断两个数据的大小并求出差值.
MOV A,R3
CLR C
SUBB A,R5
MOV ADAT1,A
MOV A,R4
SUBB A,R6
MOV ADAT2,A
JC MAXMIN1
MOV MAX1,R3
MOV MAX2,R4
MOV MIN1,R5
MOV MIN2,R6
RET
MAXMIN1:
MOV A,ADAT1
CPL A
ADD A,#01H
MOV ADAT1,A
MOV A,ADAT2
CPL A
ADDC A,#00H
MOV ADAT2,A
MOV MAX1,R5
MOV MAX2,R6
MOV MIN1,R3
MOV MIN2,R4
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CTOM: ;;;功能说明:(CQDAT-NOADAT)*AQDAT/AQDAT'最后得到当前称重的质量
;;;TEMP存放NOADAT或者MNDAT的值
MOV A,CQDAT1 ;;;当前内码减去空载时内码
CLR C
SUBB A,TEMP1
MOV R5,A
MOV A,CQDAT2
SUBB A,TEMP2
MOV R6,A ;;;实现CQDAT-TEMP并判断符号
JC CTOM0
CLR SYMB ;;;正数
SJMP CTOM01
CTOM0:
MOV A,R5 ;;;对CQDAT-TEMP的结果取反
CPL A
ADD A,#01H
MOV R5,A
MOV A,R6
CPL A
ADDC A,#00H
MOV R6,A
SETB SYMB ;;;负数
CTOM01:
MOV R3,#00H
MOV R4,05H ;;;左移8位
MOV R5,06H
MOV TEMP1,XSDAT1
MOV TEMP2,XSDAT2
LCALL DIV32
CTOM1:
MOV CQXS1,R3 ;;;L
MOV CQXS2,R4 ;;;H
MOV R6,CQXS2 ;;;取消分度值
MOV R5,CQXS1
MOV R4,SCADAT
LCALL DIV21
MOV R2,06H
MOV R3,05H
MOV R4,SCADAT
LCALL MUL21
MOV CQXS2,R6
MOV CQXS1,R7
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
PXCPP: ;;;功能说明:将接收的内码依次推进到序列中.QUEQ1=0A0H
;;;QUEQ2=0A2H,QUEQ3=0A4H,QUEQ4=0A6H,QUEQ5=0A8H
MOV R0,#QUEQ2 ;;;当第二个数据为0时,以当前数据去更新序列
MOV A,@R0
JNZ PXCPP0
INC R0
MOV A,@R0
JNZ PXCPP0
MOV R2,#03H
MOV R0,#QUEQ1
PXCPP00:
MOV @R0,DATZ1
INC R0
MOV @R0,DATZ2
INC R0
DJNZ R2,PXCPP00
MOV DQXS1,DATZ1
MOV DQXS2,DATZ2
RET
PXCPP0:
MOV R0,#QUEQ3
MOV R1,#QUEQ2
INC R0
INC R1
MOV R2,#04H
PXCPP1: ;;;更新序列,将DATZ插入
MOV A,@R1
MOV @R0,A
DEC R1
DEC R0
DJNZ R2,PXCPP1
MOV @R0,DATZ2
DEC R0
MOV @R0,DATZ1
MOV R2,#03H ;;;比较X4与X1,X2,X3,X4,X5,X6,X7,X8,X9的关系
MOV R4,#00H ;;;将结果存放在R4,R5,R6中
MOV R5,#00H
MOV R6,#00H
MOV R1,#QUEQ1
PXCPP2:
MOV R0,#QUEQ2
MOV A,@R0
CLR C
SUBB A,@R1
MOV TEMP1,A
INC R0
INC R1
MOV A,@R0
SUBB A,@R1
INC R1
JNZ PXCPP3
MOV A,TEMP1
JNZ PXCPP3
INC R4 ;;;存放相等的次数
DJNZ R2,PXCPP2
SJMP PXCPP5
PXCPP3:
JC PXCPP4
INC R5 ;;;存放大于的次数
DJNZ R2,PXCPP2
SJMP PXCPP5
PXCPP4:
INC R6 ;;;存放小于的次数
DJNZ R2,PXCPP2
PXCPP5:
MOV A,R5
JZ PXCPP6 ;;;最小值时转入最值处理
MOV A,R6
JZ PXCPP6 ;;;最大值时转入最值处理
RET ;;;非最值时退出
PXCPP6: ;;;最值处理 ;;;;;;;;;;;;;;;;;;;;;;;
MOV R0,#QUEQ2 ;;;
MOV DATZ1,@R0 ;;;比较DATZ与QUE1是否相等?
INC R0 ;;;相等时不更新,直接退出
MOV DATZ2,@R0 ;;;不相等时更新.
MOV R0,#QUE1 ;;;
MOV A,@R0 ;;;
XRL A,DATZ1 ;;;
JNZ PXCPP06 ;;;
INC R0 ;;;
MOV A,@R0 ;;;
XRL A,DATZ2 ;;;
JNZ PXCPP06 ;;;
RET ;;;;;;;;;;;;;;;;;;;;;;;;
PXCPP06:
MOV R1,#QUE21
MOV R0,#QUE20
INC R1
INC R0
MOV R2,#1EH ;;;15个数据.
PXCPP7:
MOV A,@R0 ;;;将新数据插入先进先出队列
MOV @R1,A
DEC R0
DEC R1
DJNZ R2,PXCPP7
MOV @R1,DATZ2 ;;;插入新值
DEC R1
MOV @R1,DATZ1
MOV R0,#QUE21 ;;;;队列已满
MOV A,@R0
JNZ PXCPP8
INC R0
MOV A,@R0
JNZ PXCPP8
MOV R1,#QUEK1 ;;;;队列没插满
MOV @R1,DATZ1
INC R1 ;;;用当前内码去更新QUEK队列
MOV @R1,DATZ2
MOV R0,#QUE1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -