Measurement of Amplitude of any Input Wave by 8051:


This is a simple program to find the highest amplitude in an input wave, sine, triangular or square, it works with all.

 

The assembly Code:

 

ASM Code:
;define the adc address and control pins ADC_A BIT P2.0 ADC_B BIT P2.1 ADC_C BIT P2.2 ADC_SC BIT P2.3 ADC_ALE BIT P2.4 ADC_EOC BIT P2.5   ;define the lcd control pins RS BIT P2.6 EN BIT P2.7   ;program starts from this address .ORG 0000H LJMP MAIN   INITIALIZE_LCD: ;lcd initialization sub-routine MOV A, #38H LCALL WRITE_CMD MOV A, #0CH LCALL WRITE_CMD MOV A, #06H LCALL WRITE_CMD RET ;********************************* WRITE_CMD: ;sub-routine to write a command to lcd's instruction register CLR RS ;rs=0 for selecting command register MOV P0, A SETB EN CLR EN LCALL LCD_DELAY RET ;********************************* WRITE_CHAR: ;sub-routine to write a data to lcd's data register SETB RS ;rs=1 for selecting data register MOV P0, A SETB EN CLR EN LCALL LCD_DELAY RET ;******************************** LCD_DELAY: ;subroutine to generate a delay between consequent lcd write operations MOV R0, #5H L2: MOV R1, #0FFH L1: DJNZ R1, L1 DJNZ R0, L2 RET ;********************************** DISPLAY_VOLT: ;subroutine to display volts: in the lcd MOV A, #85H LCALL WRITE_CMD MOV A, #'V' ACALL WRITE_CHAR ACALL LCD_DELAY MOV A, #'O' ACALL WRITE_CHAR ACALL LCD_DELAY MOV A, #'L' ACALL WRITE_CHAR ACALL LCD_DELAY MOV A, #'T' ACALL WRITE_CHAR ACALL LCD_DELAY MOV A, #':' ACALL WRITE_CHAR ACALL LCD_DELAY RET ;************************************** DISPLAY: ;subroutine to display the digits of the measured voltage MOV A, R6 ;display the digit before decimal point ADD A, #30H LCALL WRITE_CHAR   MOV A, #2EH ;display the decimal point LCALL WRITE_CHAR   MOV A, R5 ;display the digit after the decimal point ADD A, #30H LCALL WRITE_CHAR RET ;***********************************   READ_ADC: ;sub-routine to read from adc SETB ADC_EOC ;intialize default values of the control signals CLR ADC_ALE CLR ADC_SC   CLR ADC_A ;specify the address of the adc channel to read from CLR ADC_B CLR ADC_C   SETB ADC_ALE ;latch the address of the channel to adc SETB ADC_SC ;initiate a pulse on sc to start the conversion CLR ADC_ALE CLR ADC_SC   WAIT: JNB ADC_EOC, WAIT ;conversion complete, read the converted data   NOP MOV A, P1 NOP   SETB ADC_EOC RET ;************************************************ FIND_MAX_AMPLITUDE: ;subroutine to find the max amplitude MOV R7, #0FFH REPEAT: DEC R7   LCALL READ_ADC ;find the max amplitude MOV R2, A ;store the current signal amplitude in r2 MOV A, R3 ;load accumulator with the previous signal amplitude SUBB A, R2 ;subtract current amplitude from previous amplitude JC STORE_HIGHER_AMPLITUDE AJMP CHECK STORE_HIGHER_AMPLITUDE: MOV A, R2 MOV R3, A     CHECK: MOV A, R7 JNZ REPEAT RET ;************************************************ ADJUST: ;scale down the input adc value by 5 MOV A, R3 MOV B, #5D DIV AB MOV R4, A ;r4 contains the hex, have to convert it into decimal   ;convert the hext to two separate decimal digits to be displayed HEX_TO_DECIMAL: MOV A, R4 MOV B, #10D ;divide by 10 DIV AB MOV R5, B ;r5 contains the value after decimal MOV R6, A ;r6 contains the value before decimal point RET ;**************************************************   MAIN: ;here lies the main program MOV R3, #00H ;default max amplitude MOV P1, #0FFH ;set p1 input port MOV P0, #00H ;set p0 output port   LCALL INITIALIZE_LCD LCALL DISPLAY_VOLT LCALL FIND_MAX_AMPLITUDE LCALL ADJUST LCALL DISPLAY MOV A, #80H LCALL WRITE_CMD AJMP MAIN   END  

Download the Model and Code Here.