8051 microcontroller programming:Interfacing with ADC 0808 in assembly using Keil
An ADC is a device which converts the analog input to digital.
The most commonly used ADC is 0808, it is an 8 bit parallel ADC.
It has 8 input channels.We can select which input to convert through channel selectors.
CIRCUIT DIAGRAM:

PROGRAM:
The most commonly used ADC is 0808, it is an 8 bit parallel ADC.
It has 8 input channels.We can select which input to convert through channel selectors.
CIRCUIT DIAGRAM:
ALE EQU P2.4 ;ASSIGN PIN5 OF PORT2 FOR ALE (ADDRESS LATCH ENABLE) OF ADC START EQU P2.6 ;ASSIGN PIN6 OF PORT2 FOR START OF ADC EOC EQU P2.7 ;ASSIGN PIN7 OF PORT2 FOR EOC(END OF CONVERSION) OF ADC OE EQU P2.5 ;ASSIGN PIN4 OF PORT2 FOR OE(OUTPUT ENABLE) OF ADC AA EQU P2.0 ;ASSIGN PIN0 OF PORT2 FOR AA(CHANNEL SELECT A) OF ADC BB EQU P2.1 ;ASSIGN PIN1 OF PORT2 FOR BB(CHANNEL SELECT B) OF ADC CC EQU P2.2 ;ASSIGN PIN2 OF PORT2 FOR CC(CHANNEL SELECT C) OF ADC RS EQU P2.3 ;ASSIGN PIN3 OF PORT2 FOR RS(REGISTER SELECT) OF LCD RW EQU P0.1 ;ASSIGN PIN1 OF PORT0 FOR ALE(ADDRESS LATCH ENABLE) OF LCD E EQU P0.0 ;ASSIGN PIN0 OF PORT0 FOR RW(READ/WRITE) OF LCD ORG 00H LOOP: MOV A,#38H ;CONFIGURE THE LCD AS 5*7 MATRIX, 2 LINE DISPLAY ACALL COMMAND ;CALL COMMAND MOV A,#0EH ;TURN LCD ON AND BLINK CURSOR ACALL COMMAND ;CALL COMMAND MOV A,#01H ;CLEAR DISPLAY ACALL COMMAND ;CALL COMMAND MOV P1,#0FFH ;SET PORT1 AS INPUT SETB EOC CLR ALE CLR START CLR OE ;CLEAR EOC,ALE,START CLR CC CLR BB SETB AA ;CLEAR B,C AND SET A:->001 ACALL DELAY SETB ALE ACALL DELAY SETB START ACALL DELAY CLR ALE ;ALE NEEDS A HIGH TO LOW TRANSITION FOR LATCHING THE ADDRESS CLR START ;START NEEDS A HIGH TO LOW TRANSITION FOR STARTING CONVERSION(EOC GOES LOW) HERE: JB EOC,HERE ;WAIT TILL EOC BECOMES HIGH NOW: JNB EOC,NOW ;WAIT TILL EOC GO LOW AGAIN SETB OE ;SET OE TO ENABLE OUTPUT ACALL DELAY MOV A,P1 ;MOVE THE CONTENTS TO A CLR OE ;CALL CONVERSION ACALL CONV ;REPEAT AGAIN SJMP LOOP COMMAND:ACALL READY ;CALL READY ROUTINE MOV P3,A CLR RS ;SELECT COMMAND REGISTER(RS=0) CLR RW ;SELECT WRITE(RW=0) SETB E ACALL DELAY CLR E ;HIGH TO LOW TRANSITION OF E TO WRITE RET READY: SETB P3.7 ;SET HIGHEST BIT OF PORT3 TO HIGH CLR RS ;SELECT COMMAND REGISTER SETB RW ;SELECT READ(RW=1) BACK: CLR E ACALL DELAY SETB E ;LOW TO HIGH TRANSITION OF E TO READ JB P3.7,BACK ;IF P3.7 IS STILL 1 THEN WAIT RET DISPLAY:ACALL READY ;CHECK IF READY MOV P3,A SETB RS ;SELECT DATA REGISTER CLR RW ;SELECT WRITE(RW=0) SETB E ACALL DELAY CLR E ;HIGH TO LOW TRANSITION OF E TO WRITE RET ;THE LOGIC FOR CONVERSION IS AS FOLLOWS: /* From the ADC the output available to 8051 microcontroller is hexadecimal, but the LCD needs the data in form of ASCII codes. For that we use a conversion sub program called CONV. Store the copy of the data from the ADC to R1 and R2. Extract higher nibble to R1 and lower nibble to R2. This is done by ANDing R1 with 0F0h and R2 with 0Fh, and separately convert them to ASCII. For digits 0-9 ASCII starts from 30h and alphabets start from 37h. So subtract 9h from R1 and R2 and if there is carry follow one routine if not follow another. */ CONV: MOV R1,A ;COPY THE CONTENTS OF A TO R1 AND R2 MOV R2,A ANL 01H,#0F0H ;EXTRACT THE HIGHER NIBBLE TO R1 ANL 02H,#0FH ;EXTRACT THE LOWER NIBBLE TO R2. MOV A,R1 SWAP A MOV R1,A ;BRING THE CONTENTS OF R1 TO LOWER NIBBLE MOV A,#09H SUBB A,R1 ;SUBTRACT 09H FROM R1 JC LOOP1 ;IF CARRY GOTO LOOP1 MOV A,R1 ADD A,#30H ACALL DISPLAY LOOP3: MOV A,#09H ;FOR LOWER NIBBLE SUBB A,R2 JC LOOP2 MOV A,R2 ADD A,#30H ACALL DISPLAY RET LOOP1: MOV A,R1 ADD A,#37H ACALL DISPLAY SJMP LOOP3 LOOP2: MOV A,R2 ADD A,#37H ACALL DISPLAY RET DELAY: MOV R5,#0FFH ;DELAY ROUTINE HERE2: MOV R6,#0FFH HERE1: DJNZ R6,HERE1 DJNZ R5,HERE2 RET END
Nice start buddy. Thanks for the code.
ReplyDeleteThank you for visiting my blog:)
DeleteNice start buddy. Thanks for the code.
ReplyDelete