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:
  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

Comments

Post a Comment

Popular posts from this blog

8051 microcontroller programming:Tutorial-Fibonacci series in assembly with Keil

8051 microcontroller programming: Interfacing with push button and displaying the button pressed using Keil