ADC0808是CMOS单片型逐次逼近式A/D转换器,它有8路模拟开关、地址锁存与译码器、比较器、8位开关树型A/D转换器。
将参考电压输出成0~255
引脚
ADC0808芯片有28条引脚,采用双列直插式封装。各引脚功能如下:
1~5和26~28(IN0~IN7):8路模拟量输入端。
8、14、15和17~21(out1~out8):8位数字量输出端。高位在前
22(ALE):地址锁存允许信号,输入,高电平有效。
6(START): A/D转换启动脉冲输入端,输入一个正脉冲(至少100ns宽)使其启动(脉冲上升沿使0808复位,下降沿启动A/D转换)。
7(EOC): A/D转换结束信号,输出,当A/D转换结束时,此端输出一个高电平(转换期间一直为低电平)。
9(OE):数据输出允许信号,输入,高电平有效。当A/D转换结束时,此端输入一个高电平,才能打开输出三态门,输出数字量。
10(CLK):时钟脉冲输入端。要求时钟频率不高于640KHZ。
12(VREF(+))和16(VREF(-)):参考电压输入端
11(Vcc):主电源输入端。
13(GND):地。
23~25(ADDA、ADDB、ADDC):3位地址输入线,用于选通8路模拟输入中的一路
时序图
给START和ALE脉冲,这时芯片会将ADD(A~C)地址写入,启动AD转换,转换过程中EOC为低电平,转换成功后EOC为高电平,这时向OE写入1即可读出out的数据(0~255)。
参考接线
仿真图
代码
#include <REGX52.H>
sbit ADDA=P1^4;
sbit ADDB=P1^5;
sbit ADDC=P1^6;
sbit START_ALE=P1^2;
sbit EOC=P1^1;
sbit CLOCK=P1^3;
sbit OE=P1^0;
unsigned char tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsigned char i=0;
//void delay_ms(unsigned int ms)//ms延时函数
//{
// unsigned int i,j;
// for(i=ms;i>0;i--)
// for(j=110;j>0;j--);
//
//}
//
void Timer_Init()//定时器初始化
{
TMOD=0x01; //设置为定时器0工作模式1
TL0=(65536-100)%256;//低八位
TH0=(65536-100)/256;//高八位
TR0 = 1; //定时器0开始计时
EA=1;//开启总中断
ET0=1;//开启定时器0中断
}
unsigned char ADC0808_Out()//ad转换,将电压八位输出
{
unsigned char out=0;
ADDA=1;//ADC地址端,通过A~C可选0~7
ADDB=1;
ADDC=0;
START_ALE=0;//START和ALE先给低电平再给高电平,写入地址,启动adc
START_ALE=1;
START_ALE=0;
while(EOC==0);//等待ad转换结束
OE=1;//向OE端写入1,三态门输出数据
out=P3;
OE=0;
return out;
}
void main()
{
P2=0xfe;
Timer_Init();//初始化定时器
while(1)
{
i=ADC0808_Out()/50;//将256大致区分到5级
P0=tab[i];
}
}
void Timer0() interrupt 1
{
TL0=(65536-100)%256;//低八位
TH0=(65536-100)/256;//高八位
CLOCK=~CLOCK;//给ADC时钟10khz
}
标签:START,P1,转换,单片机,高电平,ALE,51,ADC0808,sbit
From: https://blog.csdn.net/qq_42683732/article/details/139371599