ADC0809有ADC0809CCN与ADC0809CCV两种型号,CCN是直插式,CCV是贴片式,两种的原理与引脚相同,其与ADC0808原理相同,区别不大,一般情况下可以直接替换使用,替换使用时的注意事项下文介绍。
![](https://i-blog.csdnimg.cn/blog_migrate/a80d1129705969a3bc98fc015484e294.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/2fb1f92c87bb4ccc25881821f44d75d8.jpeg)
ADC0809是CMOS 单片型逐次逼近式8位 A/D 转换器,采样率为10 KSPs,以直插式做案例介绍工作方式:
![](https://i-blog.csdnimg.cn/blog_migrate/eb2a685a9754ea80f6cb1ecc7d4f7f24.png)
这里使用proteus软件仿真操作,但ADC0809无法进行仿真,可以使用ADC0808进行替换,原理一样仅输出端有些许区别(0808的输出最低位是OUT7,而0809的最低位是OUT0)。
引脚功能:
- CLK:ADC0809时钟输入,时钟频率范围参考:10KHz;
- VREF(+)、VREF(-):基准参考电压,一般设置VREF(+)=+5V,VREF(-)=0V;
- VCC、GND:电源与接地线,供电范围:4.5V~6.5V;
- ADDA、ADDB、ADDC:3 位地址输入线,相当于3-8译码器的三位输入端用来选通IN0~IN7端口输入;
- IN0~IN7:8 路模拟量输入端,输入电压范围0~5V;
- ALE:地址锁存允许信号输入,当ALE高电平时三位地址输入线才可以被配置,选通输入;当ALE低电平时,三位地址输入线锁定,对已选通的输入端电压采集转换。
- START: AD 转换启动脉冲输入,当START高电平时(高电平脉冲至少100ns),AD启动转换,脉冲的边沿触发ADC0809,上升沿触发复位,下降沿启动转换。一般将START与ALE相连,同时配置信号;
- OUT1~OUT8或2-1~2-8:8 位数字量输出端,ADC0809与0808最大的区别在于此,0808的输出最低位是OUT7,而0809的最低位是OUT0;
- EOC:AD转换结束信号输出端,当AD转换结束的时候该端口输出高电平,其余时间均为低电平;
- OE:数字量输出允许端,当AD转换结束时,使OE为高电平,输出IO口三态门打开,数据可以输出;
![](https://i-blog.csdnimg.cn/blog_migrate/13394bc36d8f1306f38a229e1736c943.jpeg)
使用方法:
这里以ADC0809与51单片机配合模拟使用,单片机把接收到的数字量经过数据处理、计算得出原测量值。
单片机的P2.5~P2.7三个IO口输出不同高低电平配置ADC0809的ADCA、ADCB、ADCC三个位选端口,产生位选信号控制输入端口。使用单片机的定时器T0定时功能通过P3.5为ADC0809产生5KHz的工作时钟脉冲;P3.4采集ADC0809的转换结束信号(EOC)判断电压模数转换是否完成;P3.3控制ADC0809的输出允许端(OE)将数字量收集到主控芯片;P3.2同时控制ADC0809的地址锁存端(ALE)和转换启动端(START)当未启动转换时,输入位选端口等待位选信号输入,启动转换后,输入位选端口锁定。
输出端的电压计算方式为: 基准电压设置为+5V,所以AD转化将以5V为最大值等分为256份,输入端每增大一份电压值(≈0.0195V)输出端加1。
示例代码:
#include "adc0809.h"
#include "delay.h"
sbit STR=P3^2; //ALE与START相连
sbit EOC=P3^4;
sbit OE=P3^3;
sbit CLK=P3^5;
sbit adc_A=P2^5;
sbit adc_B=P2^6;
sbit adc_C=P2^7;
unsigned char adc;
三位地址输入位选配置参照下表,这里不过多阐述,注意配置ADCA、B、CshiSTR。
输入端 | ADCA | ADCB | ADCC |
---|---|---|---|
IN0 | 0 | 0 | 0 |
IN1 | 1 | 0 | 0 |
IN2 | 0 | 1 | 0 |
IN3 | 1 | 1 | 0 |
IN4 | 0 | 0 | 1 |
IN5 | 1 | 0 | 1 |
IN6 | 0 | 1 | 1 |
IN7 | 1 | 1 | 1 |
//定时器初始化
void adc_init()
{
TMOD=0x01;
TH0=(65536-100)/256;
TL0=(65536-100)%256;
ET0=1;
EA=1;
TR0=1;
}
//AD转换
int AD()
{
STR=1; //启动AD转换
delayms(10);
STR=0;
while(0==EOC); //等待转换结束
OE=1;
adc=P0; //读取AD数据,数据范围为0-255
OE=0;
return adc;
}
// T0中断服务程序
void t0(void) interrupt 1
{
TH0=(65536-100)/256;
TL0=(65536-100)%256;
CLK=~CLK;
}