📄 数字滤波子程序.txt
字号:
;**********************************************************************************************
;'*** SHUZI LUBO *** ;'数字滤波
LUBO:
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
;!!!!!!!!!!!!!!!!!!!!!!!!!2005年07月20日应公司要求更改滤波,更改后的滤波为:判断动态趋向!!!!!!!!
;!!!!!!!!!!!!!!!!!!!!!!!!!如果趋向不稳定则不滤波,将当前的值给显示,但是,要判断该值如果!!!!!!!!!
;!!!!!!!!!!!!!!!!!!!!!!!!!为超/少则将当前的最值求平均给显示;如果为趋向稳定,则进行原来的!!!!!!!!
;!!!!!!!!!!!!!!!!!!!!!!!!!滤波,即,求平均值!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
;下面是判断稳定趋向的程序,利用缓冲区ZZC[0]ZZC[1]ZZC[2],具体做法:如果[0]-[2]小于100E的时候则跳转
;到FilterStart;如果大于的时候则进行进一步的判断——-[0]-[1]是否大于64E,如果小于则跳转到FilterStart
;如果大于则再进一步判断:[1]-[2]是否大于32E,如果小于则跳转FilterStart,大于,则说明趋向不稳定,此时
;判断[0]的值是否超/少,如果是,则将ZMAX和ZMIN的和除2给MZZ和JZZ,否则,直接将[0]给MZZ和JZZ
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
MOV R1,#ZZC ;'数字滤波重量缓冲区
CALL R1W1 ;'最新重量结果数据->WRA1
CALL R1W2 ;'次新重量结果数据->WRA2
MOV A,R1
MOV R4,A ;'暂存当前重量数据缓冲区地址
CALL BJ ;'比较最新重量结果数据和次新重量结果数据的大小
;'结果在C和F0
MOV R1,#WRA2
MOV R0,#WRA3
JC LUB1 ;'次新重量结果数据<最新重量结果数据时转
;'次新重量结果数据>=最新重量结果数据时
CALL R1R0 ;'WRA3保存较大数据
CALL W1R0 ;'WRA4保存较小数据
SJMP LUB2
LUB1: CALL W1R0 ;'WRA3保存较大数据
CALL R1R0 ;'WRA4保存较小数据
LUB2: MOV R3,#8 ;'8组数据计数器
LUB3: MOV R0,#WRA1
MOV R1,#WRA3
CALL R1R0 ;'较大数据->WRA1
MOV A,R4
MOV R1,A ;'恢复当前重量数据缓冲区地址
CALL R1W2 ;'当前数据->WRA2
MOV A,R1
MOV R4,A ;'暂存当前重量数据缓冲区地址
CALL BJ ;'比较较大数据和当前数据的大小,结果在C和F0
JC LUB4 ;'当前数据<较大数据时转
;'当前数据>=较大数据时
MOV R1,#WRA2
MOV R0,#WRA3
CALL R1R0 ;'当前数据作为较大数据
SJMP LUB6
LUB4: MOV R0,#WRA1
MOV R1,#WRA4
CALL R1R0 ;'较小数据->WRA1
CALL BJ ;'比较较小数据和当前数据的大小,结果在C和F0
JC LUB5 ;'当前数据<较小数据时转
;'当前数据>=较小数据时
SJMP LUB6
LUB5: MOV R1,#WRA2
MOV R0,#WRA4
CALL R1R0 ;'当前数据作为较小数据
LUB6: DJNZ R3,LUB3 ;'8组数据没有比较完转
MOV R1,#WRA3
MOV R0,#ZMAX
CALL R1R0 ;'10次中重量结果最大值->ZMAX
CALL R1R0 ;'10次中重量结果最小值->ZMIN
MOV R1,#ZZC ;'数字滤波重量缓冲区
MOV R3,#10
CALL HE ;'求n+1组数据之和,入口:R1-第一组数据首址,R3-n组数据
;'求10组重量数据之和(包括WRA1=0)
MOV R1,#ZMAX ;'数字滤波时,存10次中重量结果最大值
SETB F0B ;'数字滤波用标志
LUBX: CALL R1W2 ;'10次中最大值->WRA2
CALL FSB ;'(最大值或最小值)-(10次和),与正常结果符号相反
;'WRA2-WRA1->WRA1
CPL WR1F ;'结果符号取反
JBC F0B,LUBX ;'Z1+Z2+...+Z10-ZMAX-ZMIN
;'10次和中去掉重量结果最大值和最小值
MOV A,WRA1+3
CLR C
SUBB A,#3 ;'10次和阶码-3,相当于除以8
JNC LUB7
CLR A ;'10次和阶码<3时,置结果阶码为0
LUB7: MOV WRA1+3,A
FilterSel: ;2005年07月20日加此标志,当判断稳定趋向为趋向不稳定的时候跳转到此,将当前重量给MZZ/JZZ
MOV R0,#MZZ
CALL W1R0 ;'作为内部毛重
;' MOV R1,#NPZ
;' CALL R1W2 ;'内部皮重->WRA2
;' CALL FSB ;'内部皮重-内部毛重,与正常结果符号相反
;' ;'WRA2-WRA1->WRA1
;' CPL WR1F ;'结果符号取反
MOV R0,#JZZ
CALL W1R0 ;'得出内部净重
JB FUCHID,LUB8 ;'处于负称状态转
JNB CZZTBZ,LUB8 ;'处于毛重状态转
;CLR ZZLDBZ ;'非真正零点
CALL DCPZZ ;'读出皮重值->WRA1
MOV R1,#JZZ
CALL R1W2 ;'内部净重制->WRA2
CALL FSB ;'内部净重制-皮重值=净重制->WRA1
MOV R0,#JZZ
CALL W1R0 ;'净重制->JZZ
LUB8:
MOV R1,#XZZ
CALL R1W2 ;'限重值->WRA2
CALL BJ ;'比较内部净重和限重值的大小,结果在C和F0
JNC LDG ;'限重值>=内部净重时转
;'限重值<内部净重时
mov C,ChaoCtr1
jc next1
setb ChaoCtr1
jmp ChaoID
next1:
mov C,ChaoCtr2
jc ChaoOK
setb ChaoCtr2
jmp ChaoID
ChaoOK:
SETB CHAOBZ ;'置重量超标志
ChaoID:
JMP PDWD
;'*** LINGDIAN GENZHONG *** ;'零点跟踪
LDG0:;;一旦未进入0点稳定范围,清计数器
mov R0,#StableCtr
mov @R0,#0
lcall ClearV_SUM ;V_SUM=0;
jmp LDG1
PDWDx:jmp PDWD
LDG:
clr ChaoCtr1
clr ChaoCtr2
CLR CHAOBZ ;'清重量超标志
CLR SHAOBZ ;'清重量少标志
jb FUCHID,PDWDx ;06.05.18加,防止在负称的时候零点跟踪
JB XFFDZT,PDWDx ;'细分分度状态时转,关闭零点跟踪
JB XFDYBZ,PDWDx ;'开机细分时,不进行零点跟踪
JB CZZTBZ,PDWDx ;'净重状态时转,关闭零点跟踪
MOV R1,#ZMAX ;'数字滤波时,存10次中重量结果最大值
CALL R1W2 ;'10次中最大值送WRA2
CALL R1W1 ;'10次中最小值送WRA1
CALL FSB ;'极差=ZMAX-ZMIN ;'WRA2-WRA1->WRA1
INC WRA1+3
INC WRA1+3 ;'极差*4
CALL GZZ1 ;'比较4*(ZMAX-ZMIN)和e/2的大小,结果在C和F0,WRA2=e/2
JC LDG0 ;'e/2<4*(ZMAX-ZMIN)转
;'e/2>=4*(ZMAX-ZMIN)时
;;当进入0点跟踪的稳定范围的时候
;;开0点稳定计数器,首先变化量开始求和
;由于下面的处理有伤害WRA2的时候,所以保护她
mov R1,#WRA2 ;wra2=e/2;
mov R0,#WRA4
lcall R1R0 ;将WRA2保护到WRA4
lcall variationalSUM ;调用求和函数
mov R0,#Setup_SCtr
mov A,@R0
mov B,#3 ;新OCS的AD板为3数据/秒
mul AB
mov R1,A ;求设置时间转换为信号计数
mov R0,#StableCtr ;计数
mov A,@R0
inc A
mov @R0,A ;保存计数器
clr C
subb A,R1 ;通常A小于最大设置值,一旦等于大于则C=0
jnc PDLDGz ;如果计数器小于最值,则说明还没有到时间,则跳过LDG
NotAtoZero:
jmp PDWD ;跳过LDG
PDLDGz:;一旦计数器到最值,则立刻回0,
mov A,#0 ;送0到ACC
mov R0,#StableCtr ;地址给R0
mov @R0,A ;在0点稳定计数器益出的时候,将0值给其
clr C
lcall CompareSUM ;调用变化量之和 程序,返回CY,如果为0,和小于范围可以跟踪,如果为1,和大于范围不可以跟踪
jc NotAtoZero ;在WRA4中存储的是e/2
;***************以上是对0点稳定判断**************************
MOV R1,#JZZ
CALL R1W1 ;'内部净重->WRA1
CLR WR1F ;'清内部净重的符号
;增加对回0范围的选择:0:0.25 1:0.5 2:1.0
;****************************************************************
mov R1,#WRA4
mov R0,#WRA2
lcall R1R0 ;将WRA2原先的值从WRA4中还原,e/2
mov R0,#GoZero_Sel
mov A,@R0
cjne A,#0,HLPD0
jmp PDWD ; 当0点跟踪设置为0的时候为不跟踪
HLPD0:
cjne A,#1,HLPD1
dec WRA2+3 ; e/2除以2:e/4=0.25D
dec WRA2+3 ; e/4除以2:e/8=0.125d
jmp HLBJ
HLPD1:
cjne A,#2,HLPD2 ; e/4
dec WRA2+3
jmp HLBJ
HLPD2:
cjne A,#3,HLPD3 ;如果不为0 1 2则默认为1:0.5e
jmp HLBJ ;
HLPD3:
cjne A,#4,HLBJ
inc WRA2+3 ; e/2 乘以2:1.0e
;jmp HLBJ
;增加对回0范围的选择:1:0.25 2:0.5 3:1.0 4:2.0
HLBJ:
;******************************************************************
CALL BJ ;'比较内部净重和d/2的大小,结果在C和F0
JC LDG1 ;'d/2<内部净重转
;'d/2>=内部净重时
;;开始跟踪
MOV R1,#ZSR
MOV R0,#NPZ
LCALL R1R0 ;'把当前R1值作为内部皮重,新的零点
lcall CopyNP ;2006.05.16 modified by Joyful.Sun
MOV JZZ+3,#00H ;'内部净重阶码置0,内部净重置0
;SETB ZZLDBZ ;'真正零点
CLR A
MOV R7,#10
MOV R0,#ZZC+39
LDGloop: MOV @R0,A
DEC R0
DEC R0
DEC R0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -