|
In lot of embedded systems microcontrollers needs to take analog input. Most of the sensors & transducers such as temperature, humidity, pressure, are analog. For interfacing these sensors to microcontrollers we require to convert the analog output of these sensors to digital so that the controller can read it. Some microcontrollers have built in Analog to Digital Convertor (ADC) so there is no need of external ADC. For microcontrollers that don’t have internal ADC external ADC is used.
|
|
One of the most commonly used ADC is ADC0808. ADC 0808 is a Successive approximation type with 8 channels i.e. it can directly access 8 single ended analog signals.
|
| I/O Pins |
|
|
ADDRESS LINE A, B, C
The device contains 8-channels. A particular channel is selected by using the address decoder line. The TABLE 1 shows the input states for address lines to select any channel.
|

|
|
Address Latch Enable ALE
The address is latched on the Low – High transition of ALE.
|
|
START
The ADC’s Successive Approximation Register (SAR) is reset on the positive edge i.e. Low- High of the Start Conversion pulse. Whereas the conversion is begun on the falling edge i.e. High – Low of the pulse.
|
|
Output Enable
Whenever data has to be read from the ADC, Output Enable pin has to be pulled high thus enabling the TRI-STATE outputs, allowing data to be read from the data pins D0-D7.
|
|
End of Conversion (EOC)
This Pin becomes High when the conversion has ended, so the controller comes to know that the data can now be read from the data pins.
|
|
Clock
External clock pulses are to be given to the ADC; this can be given either from LM 555 in Astable mode or the controller can also be used to give the pulses.
|
| |
|
| ALGORITHM |
|
| 1. Start. |
|
| 2. Select the channel. |
|
| 3. A Low – High transition on ALE to latch in the address. |
|
| 4. A Low – High transition on Start to reset the ADC’s SAR. |
|
| 5. A High – Low transition on ALE. |
|
| 6. A High – Low transition on start to start the conversion. |
|
| 7. Wait for End of cycle (EOC) pin to become high. |
|
| 8. Make Output Enable pin High. |
|
| 9. Take Data from the ADC’s output |
|
| 10. Make Output Enable pin Low. |
|
| 11. Stop |
|
|
|
|
The total numbers of lines required are:
data lines: 8 ALE: 1 START: 1 EOC:1 Output Enable:1
|
|
|
I.e. total 12 lines. You can directly connect the OE pin to Vcc. Moreover instead of polling for EOC just put some delay so instead of 12 lines you will require 10 lines.
You can also provide the clock through the controller thus eliminating the need of external circuit for clock.
|
|
Calculating Step Size
|
|
|
ADC 0808 is an 8 bit ADC i.e. it divides the voltage applied at Vref+ & Vref- into 28 i.e. 256 steps.
Step Size = (Vref+ - Vref-)/256
Suppose Vref+ is connected to Vcc i.e. 5V & Vref- is connected to the Gnd then the step size will be
Step size= (5 - 0)/256= 19.53 mv.
|
|
|
Calculating Dout.
|
|
| The data we get at the D0 - D7 depends upon the step size & the Input voltage i.e. Vin.
Dout = Vin /step Size.
If you want to interface sensors like LM35 which has output 10mv/°C then I would suggest that you set the Vref+ to 2.56v so that the step size will be
Step size= (2.56 - 0)/256= 10 mv.
So now whatever reading that you get from the ADC will be equal to the actual temperature.
|
|
PROGRAM
|
|
|
Here is a program for interfacing the ADC to microcontroller, as stated above I have assumed that the OE pin is connected to Vcc & the clock is given by the controller.
This program selects channel 0 as input channel reads from it & saves in the accumulator.
|
|
adc_a bit p2.0
adc_b bit p2.1
adc_c bit p2.2
adc_start bit p2.3
adc_ale bit p2.4
adc_clk bit P2.5
|
|
Org 0000h
clr ale
clr start
clr adc_a
clr adc_b ;Select Channel 0
clr adc_c
call delay_small
setb adc_ale ;ale pin high
call delay_small
setb adc_start ;start pin high
call delay_small
clr adc_ale ;ale pin low
call delay_small
clr adc_start ;start pin low
call delay_long
mov a,P1
|
|
loop:
ajmp loop
|
|
delay_small:
mov r0,#10
|
|
l1_delay_small:
cpl adc_clk
nop
nop
nop
nop
nop
djnz r0,l1_delay_small
ret
|
|
delay_long:
mov r0,#40
|
|
l1_delay_long:
cpl adc_clk
nop
nop
nop
nop
nop
djnz r0,l1_delay_long
ret
|
|
End
|
|
|
|
|
|
|
Comments
thank u for sharing such a good artical.
Once the project has been implemented you can also mail me with your project code and circuit and I will publish it on my site so it will be helpful for others as well
Thnx a ton....:)
Keep the good working going on....
I am using ADC0808, microcontroller 89C51, and 16X2 Alpha-numeric LCD to display the sensed data using sensors connected to ADC0808.
Problem:
1) what will be the data formate of output of ADC, is it binary or BCD?
2) what should be the data output of 89c51 that is acceptable for LCD?
3) what is the acceptable data formate for LCD , Binary , BCD or Ascii? i know about commands that are in hex form to be given to
LCD. also i know about display of alphabets on lcd but The problem is that i want to display the data sensed by sensors connected to the ADC.
Procedure will be like that..... the output of ADC is Inputted to 89c51 and the same feeded input to 89c51 is then displayed on LCD.
can u please guide me about that. I will be very thankful to u.
sincere regards
M Qaisar Azeemi
I am using ADC0808, microcontroller 89C51, and 16X2 Alpha-numeric LCD to display the sensed data using sensors connected to ADC0808.
Problem:
1) what will be the data formate of output of ADC, is it binary or BCD?
2) what should be the data output of 89c51 that is acceptable for LCD?
3) what is the acceptable data formate for LCD , Binary , BCD or Ascii? i know about commands that are in hex form to be given to
LCD. also i know about display of alphabets on lcd but The problem is that i want to display the data sensed by sensors connected to the ADC.
Procedure will be like that..... the output of ADC is Inputted to 89c51 and the same feeded input to 89c51 is then displayed on LCD.
can you please guide me about that. I will be very thankful to u.
sincere regards
M Qaisar Azeemi
RSS feed for comments to this post