一、前言介绍
使用ADC0809对一个模拟电压进行转换 转换后的电压使用数码管显示出来
二、ADC0809的介绍
1、ADC0809简介
ADC0809是采用COMS工艺制造的双列直插式单片8位A/D转换器。分辨率8位,精度7位,带8个模拟量输入通道,有通道地址译码锁存器,输出带三态数据锁存器。启动信号为脉冲启动方式,最大可调节误差为±1LSB。 ADC0809内部没有时钟电路,故CLK时钟需由外部输入,fclk允许范围为500kHz-1MHz,典型值为640kHz。每通道的转换需要66~73个时钟脉冲,大约100-110us。(转换时间)工作温度范围为-40℃—+85℃。功耗为15mW,输入电压范围为0–5V,单一+5V电源供电。
2、ADC0809的引脚介绍
IN0~IN7 : 8路模拟量输入端 D0~D7:8位数字量输出端 ADDA、ADDC、ADDC:3位地址输入线,用于选择8路模拟通道中的一路,选择情况见表。 ALE:地址锁存允许信号,输入,高电平有效 START:A/D转换启动信号,输入,高电平有效 EOC:A/D转换结束信号,输出。当启动转换时,高引脚为低电平,当A/D结束转换时,高引脚输出高电平。 OE:数据输出允许信号,输入,高电平有效。当转换结束后,如果从该引脚输入高电平,则打开输出三态门,输出锁存器的数据从D0~D7送出。 CLK:时钟脉冲输入端。要求时钟频率不高于640KHZ. REF+、REF-:基准电压输入端。 VCC:电源,接+5V; GND:地。
3、地址码与输入通道的对应关系 #### 4、ADC0809的时序图
5、ADC0809的工作流程
输入3位地址,并使ALE=1,将地址存入地址锁存器中,经地址译码器译码从8路模拟通道中选通一路模拟量送到比较器。 送START一高脉冲,START的上升沿使逐次逼近寄存器复位,下降沿启动A/D转换,并使EOC信号为低电平。 送START一高脉冲,START的上升沿使逐次逼近寄存器复位,下降沿启动A/D转换,并使EOC信号为低电平。 当CPU执行一读数据指令,使OE为高电平,则从输出端D0~D1读出数据。
三、proteus仿真图
四、程序
#include<reg52.h>
unsigned char code dispbitcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char dispbuf[4];
unsigned int i;
unsigned int j;
unsigned char getdata;
unsigned int temp;
unsigned int temp1;
unsigned char count;
unsigned char d;
sbit ST=P3^0;
sbit OE=P3^1;
sbit EOC=P3^2;
sbit CLK=P3^3;
sbit P34=P3^4;
sbit P35=P3^5;
sbit P36=P3^6;
sbit P20=P2^0;
sbit P21=P2^1;
sbit P22=P2^2;
sbit P23=P2^3;
sbit P17=P1^7;
void TimeInitial();
void Delay(unsigned int i);void TimeInitial()
{ TMOD=0x10;TH1=(65536-200)/256;TL1=(65536-200)%256;EA=1;ET1=1;TR1=1;
}void Delay(unsigned int i)
{unsigned int j;for(;i>0;i--){for(j=0;j<125;j++){;}}
}void Display()
{ P1=dispbitcode[dispbuf[3]];P20=0;P21=1;P22=1;P23=1;Delay(10);P1=0x00;P1=dispbitcode[dispbuf[2]];P17=1;P20=1;P21=0;P22=1;P23=1;Delay(10); P1=0x00;P1=dispbitcode[dispbuf[1]];P20=1;P21=1;P22=0;P23=1;Delay(10);P1=0x00;P1=dispbitcode[dispbuf[0]];P20=1;P21=1;P22=1;P23=0;Delay(10);P1=0x00;
}
void main()
{TimeInitial();while(1){ST=0;OE=0;ST=1;ST=0;P34=0;P35=0;P36=0;while(EOC==0);OE=1;getdata=P0;OE=0;temp=getdata*1.0/255*500;dispbuf[0]=temp%10;dispbuf[1]=temp/10%10;dispbuf[2]=temp/100%10;dispbuf[3]=temp/1000;Display();}
}void t1(void) interrupt 3 using 0{TH1=(65536-200)/256;TL1=(65536-200)%256;CLK=~CLK;}