TI论坛
直播中

刘桂英

8年用户 1281经验值
私信 关注
[问答]

ADC0808经典例程 驱动代码


    ADC0808是采样分辨率为8位的、以逐次逼近原理进行模/数转换的器件。其内部有一个8通道多路开关,它可以根据地址码锁存译码后的信号,只选通8路模拟输入信号中的一个进行A/D转换。ADC0808是ADC0809的简化版本,功能基本相同。一般在硬件仿真时采用ADC0808进行A/D转换,实际使用时采用ADC0809进行A/D转换。


(1)IN0~IN7——8路模拟输入,通过3根地址译码线ADDA、ADDB、ADDC来选通一路。
(2)D7~D0——A/D转换后的数据输出端,为三态可控输出,故可直接和微处理器数据线连接。8位排列顺序是D7为最高位,D0为最低位。
(3)ADDA、ADDB、ADDC——模拟通道选择地址信号,ADDA为低位,ADDC为高位。地址信号与选中通道对应关系如表11.3所示。
(4)VR(+)、VR(-)——正、负参考电压输入端,用于提供片内DAC电阻网络的基准电压。在单极性输入时,VR(+)=5V,VR(-)=0V;双极性输入时,VR(+)、VR(-)分别接正、负极性的参考电压。

工作时序

以前做的仿真

sbit START=P3^0;
sbit OE=P3^1;
sbit EOC=P3^2;
sbit CLOCK=P3^3;
void delayms(uint x)
{
uint i,j;
for(i=x;i>0;i--)
for(j=50;j>0;j--);
}
void init_interrupt() //初始化定时计数器
{
TMOD=0x02;
TH0=0xfb;
TL0=0xfb;
EA=1;
ET0=1;
TR0=1;
}
void timer_T0() interrupt 1 //定时器0中断函数,产生100KHz时钟频率
{
CLOCK=~CLOCK;
}
                                             
     

回帖(3)

卢家辉

2025-1-21 14:00:34
 支持一下, 虽然这个芯片已经比较老了, 这里还给出了一段 C51 的驱动代码.
举报

林邵嫔

2025-1-21 14:00:43
   很经典的AD,
举报

刘桂兰

2025-1-21 17:33:59
ADC0808是一个8位的模数转换器,广泛应用于各种电子设备中。以下是ADC0808的一个经典例程,用于驱动和读取模拟信号。

### 硬件连接

1. **模拟输入**:ADC0808有8个模拟输入通道(IN0-IN7),通过3根地址译码线(ADDA、ADDB、ADDC)来选择一个通道进行A/D转换。
2. **数据输出**:D7-D0是A/D转换后的数据输出端,可以直接与微处理器的数据线连接。
3. **控制信号**:
   - **ALE(地址锁存使能)**:用于锁存地址线ADDA、ADDB、ADDC的输出。
   - **START**:启动A/D转换。
   - **EOC(转换结束)**:表示A/D转换完成。
   - **OE(输出使能)**:使能数据输出。
   - **CLK(时钟)**:控制A/D转换的时钟信号。

### 驱动代码

以下是一个简单的C语言例程,用于驱动ADC0808并读取一个通道的模拟值。

```c
#include
#include

// 假设微处理器的端口地址
#define ALE 0x00
#define START 0x01
#define EOC 0x02
#define OE 0x03
#define CLK 0x04
#define DATA 0x05

// 模拟输入通道地址
#define CHANNEL 0x01 // 选择IN0通道

void delay(int cycles) {
    for (int i = 0; i < cycles; i++) {
        __asm__("nop");
    }
}

uint8_t read_adc() {
    uint8_t data = 0;

    // 锁存地址
    outb(ALE, CHANNEL);
    delay(1);

    // 启动转换
    outb(START, 1);
    delay(1);
    outb(START, 0);
    delay(1);

    // 等待转换完成
    while (inb(EOC) == 0);

    // 使能数据输出
    outb(OE, 1);

    // 读取数据
    for (int i = 0; i < 8; i++) {
        outb(CLK, 1);
        delay(1);
        data = (data << 1) | inb(DATA);
        outb(CLK, 0);
        delay(1);
    }

    // 禁用数据输出
    outb(OE, 0);

    return data;
}

int main() {
    uint8_t adc_value = read_adc();
    printf("ADC Value: %dn", adc_value);
    return 0;
}
```

### 说明

1. **outb** 和 **inb** 是假设的函数,用于向端口写入和从端口读取数据。在实际应用中,你需要根据你的微处理器和操作系统使用相应的函数。
2. **delay** 函数用于生成一个小的延迟,以确保信号稳定。
3. **read_adc** 函数用于读取一个通道的模拟值,并返回8位的数据。

这个例程展示了如何使用ADC0808进行基本的A/D转换。你可以根据需要修改通道地址和其他参数。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分