⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 数字滤波子程序.txt

📁 基于51单片机的滤波程序
💻 TXT
📖 第 1 页 / 共 2 页
字号:
;**********************************************************************************************
;'*** 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 + -