FIR low-pass Filter with fixed coefficients:(Change the coefficients in program to suite your needs):
Assembly Code:
;ADC 0808 Interfacing with Atmel 89C51 uC
;wait till conversion is done
adc_a bit p2.0 ;define ADC pins connected to the pins of Microcontroller
adc_b bit p2.1
adc_c bit p2.2
adc_sc bit p2.3
adc_ale bit p2.4
adc_oe bit p2.5
adc_eoc bit p2.6
;filter coefficients
K0 EQU 40
K1 EQU 62
K2 EQU 70
K3 EQU 62
K4 EQU 40
;define input and o/p ports
MYDATA EQU P1
OUT_D EQU P0
.org 0000h ;set start address to 0000h
sjmp main ;jump to main program
main:
;initialize these registers for storing partial products
MOV R0, #00H
MOV R1, #00H
MOV R2, #00H
MOV R3, #00H
MOV R4, #00H
;temporary storage for MSB and LSB of Partial Products
MOV R6, #00H
MOV R7, #00H
get_adc_data:
;define my_data as i/p port
MOV MYDATA, #0FFH
; mov OUT_D,#00h ;set port 3 as o/p port
; mov p3,#00h ;;set port 0 as o/p port
setb adc_eoc
clr adc_oe
clr adc_ale
clr adc_sc
clr adc_a
clr adc_b
clr adc_c
setb adc_ale
setb adc_sc
clr adc_ale
clr adc_sc
wait: jnb adc_eoc, wait ;wait till conversion is complete
setb adc_oe ;enable the Output port of ADC
nop
mov A, p1 ;move converted data from ADC to Accumulator
mov p3, a ;move the unfiltered signal to port 3
;nop
clr adc_oe
setb adc_eoc
filter:
MOV R0, A
MOV B, #K0
MUL AB
MOV R7, A
MOV R6, B
MOV A, R1
MOV B, #K1
MUL AB
ADD A, R7
MOV R7, A
MOV A, B
ADDC A, R6
MOV R6, A
MOV A, R2
MOV B, #K2
MUL AB
ADD A, R7
MOV R7, A
MOV A, B
ADDC A, R6
MOV R6, A
MOV A, R3
MOV B, #K3
MUL AB
ADD A, R7
MOV R7, A
MOV A, B
ADDC A, R6
MOV R6, A
MOV A, R4
MOV B, #K4
MUL AB
ADD A, R7
MOV A, B
ADDC A, R6
MOV OUT_D, A
;nop
Shift_adc_datas:
MOV A, R3
MOV R4, A
MOV A, R2
MOV R3, A
MOV A, R1
MOV R2, A
MOV A, R0
MOV R1, A
ajmp get_adc_data
END ;end of main program