📄 mcs51 滤波程序asm.txt
字号:
;限幅滤波程序
;入口 :A,SDAT,DELTY
;占用资源:B
;堆栈需求:2字节
;出口 :A
JUGFILT :MOV B,A
CLR C
SUBB A,SDAT
JNC JUGFT1
CPL A
INC A
JUGFT1 :SETB A
SUBB A,#DELTY
JNC JUGFT3
MOV A,SDAT
RET
JUGFT3 :MOV A,B
MOV SDAT,A
RET
;中位值滤波程序
;入口 :ADDPH,ADDPL,N
;占用资源:ESELSORT
;堆栈需求:4字节
;出口 :A
MEDFILT :LCALL ESELSORT
MOV A,N
CLR C
RRC A
ADD A,ADDPL
MOV DPL,A
MOV A,ADDPH
MOV DPH,A
JNC MEDFT1
INC DPH
MEDFT1 :MOVX A,@DPTR
RET
;N点算术平均滤波
;入口 :ADDPH,ADDPL,N
;占用资源:B,R3,R4
;堆栈需求:2字节
;出口 :A
AVFILT :MOV A,ADDPL
MOV DPL,A
MOV A,ADDPH
MOV DPH,A
CLR A
MOV R3,A
MOV R4,A
MOV R7,N
AVFT1 :MOVX A,@DPTR
INC DPTR
ADD A,R4
MOV R4,A
JNC AVFT2
INC R3
AVFT2 :DJNZ R7,AVFT1
MOV R7,N
MOV R2,#00H
LCALL NDIV31
MOV A,R4
RET
;N点加权平均滤波
;入口 :ADDPH,ADDPL,N
;占用资源:B,R3,R4
;堆栈需求:2字节
;出口 :A
QAVFILT :CLR A
MOV R3,A
MOV R4,A
MOV R7,N
MOV P2,ADDPH
MOV R1,ADDPL
MOV DPTR,#QAVTAB
QAVFT1 :MOVC A,@A+DPTR
MOV B,A
MOVX A,@R1
INC DPTR
INC R1
MUL AB
ADD A,R4
MOV R4,A
MOV A,B
ADDC A,R3
MOV R3,A
DJNZ R7,QAVFT1
MOV A,R4
JNB ACC.7,QAVFT2
INC R3
QAVFT2 :MOV A,R3
RET
QAVTAB :DB
;一阶加权滞后滤波程序
;入口 :A,DELTY
;占用资源:B,R3,R4
;堆栈需求:2字节
;出口 :A
BQFILT :MOV B,A
CLR A
MOV DPTR,#ABTAB
MOVC A,@A+DPTR
MUL AB
MOV R4,A
MOV R3,B
MOV A,#01H
MOVC A,@A+DPTR
MOV B,DELTY
MUL AB
ADD A,R4
MOV R4,A
MOV A,B
ADDC A,R3
MOV R3,A
MOV A,R4
JNB ACC.7,FT1
INC R3
FT1 :MOV A,R3
MOV DELTY,A
RET
BQTAB :DB 80H,80H
限幅滤波程序
设在顺序采样时刻T1、T2、T3所采集的数据分别为Y1、Y2、Y3,则当
∣Y2-Y1∣≤△y,则Y2作为采样值;
∣Y2-Y1∣>△y, 则保留Y2,但不作为采样值,继续采样得Y3;
如果∣Y3-Y2∣≤△y,则Y3作为采样值;
∣Y3-Y2∣>△y, 则取作为采样值。
程序
PUSH PSW ;保护现场
PUSH A
CLR C ;进位标志位清零
MOV DATA,DATA2
MOV A,DATA1
SUBB A,DATA ;求Yn-1 -Yn
JNC COMPARE ;如果Yn-1 -Yn≥0,转COMPARE
CPL A ;如果Yn-1 -Yn<0, 求补
INC A
COMPARE: CLR C
SUBB A,LIMIT ;│Yn-Yn-1│和△y比较
JC OVER ;如果│Yn-Yn-1│≤△y,DATA2→DATA
MOV DATA,DATA1 ;如果│Yn-Yn-1│>△y,DATA1→DATA
OVER: POP A ;恢复现场
POP PSW
RET ;返回
算术平均滤波
算术平均滤波
所谓算术平均滤波就是把n个采样值相加,然后取其算术平均值作为本次有效的采样信号
PUSH PSW ;现场保护
PUSH A
MOV FLAG,#00H ;进位位清零
MOV R0,DATA ;设置数据存储区首址
MOV R7,#08H ;设置采样数据个数
CLR A ;清累加器
LOOP: ADD A,@R0 ;两数相加
JNC NEXT ;无进位,转NEXT
INC FLAG ;有进位,进位位加1
NEXT: INC R0 ;数据指针加1
DJNZ R7, LOOP ;未加完,继续加
MOV R7,#03H ;设置循环次数
DIVIDE: MOV TEMP,A ;保存累加器中的内容
MOV A,FLAG ;累加结果除2
CLR C
RRC A
MOV FLAG,A
MOV A,TEMP
RRC A
DJNZ R7,DIVIDE ;未结束,继续执行
MOV SAMP,A ;保存结果至SAMP中
POP A ;恢复现场
POP PSW
RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -