02- 模块化编程-006 ADC0808数码显示对比

1、ADC0808 芯片介绍

        ADC0808是一款集成的CMOS设备,包含8位模拟至数字转换器、8通道多路复用器和与微处理器兼容的控制逻辑。8位A/D转换器采用逐次逼近作为转换技术。转换器特点包括高阻抗斩波稳定比较器、256R电压分压器、模拟开关树和逐次逼近寄存器。8通道多路复用器可以直接访问8个单端模拟信号。

        该设备消除了外部零点和满量程调整的需要。通过锁存和解码的多路复用器地址输入以及锁存的TTL TRI-STATE®输出,提供了与微处理器的简易接口。

        ADC0808的设计通过结合几种A/D转换技术的最理想方面进行了优化。ADC0808和ADC0809提供高速、高精度、温度依赖性小、长期精度和重复性极佳,并且功耗极低。这些特点使得该设备非常适合从过程和机器控制到消费和汽车应用的应用。 

特点
  • 易于与所有微处理器接口

  • 可以比率计量操作或使用5 Vpc或模拟跨度调整的电压参考

  • 不需要零点或满量程调整

  • 8通道多路复用器,带地址逻辑

  • 输入范围0V至5V,单5V电源供电

引脚定义

IN0~IN7:8路模拟量输入端。

D0~D7:8位数字量输出端。

ADDA、ADDB、ADDC:3位地址输入线,用于选择8路模拟通道中的一路,选择情况见表。

ALE:地址锁存允许信号,输入,高电平有效。

START:A/D转换启动信号,输入,高电平有效。

EOC:A/D转换结束信号,输出。当启动转换时,该引脚为低电平,当A/D转换结束时,该线脚输出高电平。

OE:数据输出允许信号,输入,高电平有效。当转换结束后,如果从该引脚输入高电平,则打开输出三态门,输出锁存器的数据从D0~D7送出。

CLK:时钟脉冲输入端。要求时钟频率不高于640KHZ. REF+、REF-:基准电压输入端。

 时序图

典型电路 

 2、仿真电路

电路中,12位的max1241和adc0808电压采样结果形成对比,红色数码管显示的是 adc0808,蓝色数码管显示的是max1241的采样结果,结果表明,两者误差相差10倍以上。

3、软件代码

ADC0808.c
/*********************************************************************
 * 模块名称: Adc0808.h
 * 模块名:ADC0808控制模块
 * 功能描述: 该模块定义了与ADC0808进行通信所需的宏和函数原型
 * 创 建 人:bianjingyuan 
 * 日期:2024-10-30
 * 编译环境:Windows XP + MPLAB IDE 8.83 + Picc 9.60
 * 版本号:1.0
 * 修改记录:
 *********************************************************************/
// 数据类型定义
#define 	uchar 	unsigned char
#define 	uint  	unsigned int
#define 	ulong 	unsigned long
#define 	nop		asm("NOP")
#define 	sleep  	asm("sleep")
//**************************新增模块的相关定义**********************************/
// 定义0808通信端口
/*解析:
START、EOC 和 OE 是用于0808通信的端口信号。
TRISD3 = 0 配置RD3为输出,表示在代码中START信号将由微控制器驱动。
TRISD4 = 1 配置RD4为输入,表示在代码中EOC信号为微控制器从外部设备读取的信号。
TRISA0 = 0 配置RA0为输出,表示在代码中OE信号将由微控制器驱动。
*/
#define START   RD3   	// RD3作为输出
#define EOC     RD4   	// RD4作为输入
#define OE      RA0   		// RA0作为输出

// 宏定义 - 这里定义了PORTC为某个特定的硬件寄存器
#define ADC_DATA_PORT PORTC

//**************************本模块的函数定义**********************************/
uchar ad_result=0;
extern void delayus(uchar a);// 延时10us最准
/*********************************************************************
 * 函数名: Adc0808_Read
 * 功能描述: 读取ADC0808的转换结果
 * 调用函数: delayus()
 * 全局变量: ad_result, START, EOC, OE
 * 输    入: 无
 * 返    回: ADC转换结果(无符号字符)
 *********************************************************************/
uchar Adc0808_Read(void)
{
    // 首先是START信号,由低变高再变低
    START = 0;
    START = 1; // 清空ADC0808的内部寄存器值
    delayus(10);
    START = 0; // 下降沿开始AD转换

    // 然后看EOC信号,由高到低
    while (EOC == 0); // 等待EOC信号为0,表示转换完成

    // OUTPUT ENABLE(OE)信号变高,然后读取输出信号
    OE = 1;           // 使能输出
    ad_result = ADC_DATA_PORT; // 使用宏定义来读取数据
    OE = 0;           // 关闭输出
    
    return ad_result; // 返回ADC转换结果
}
main.c
//********************************************************************
//*  文件名:main.c
//*  文件描述:单片机主程序,负责系统初始化和电压显示
//*  编译环境: Windows XP + MPLAB IDE 8.83 + Picc 9.60
//*  编程者: bianjingyuan
//*  编程日期: 2024-11-06
//*  版本号:1.0
//*  修改记录:无
//********************************************************************
void main()
{
    Initial_System();     // 初始化系统设置
    ad_init();            // 初始化AD转换功能
    Set_Port_IO();        // 设置端口IO方向
    max7219_int();        // 初始化MAX7219显示驱动

    di();                 // 禁用全局中断
    TRISD0 = 1;           // RD0为转换结果输入
    TRISD4 = 1;           // 配置RD4为输入
    TRISC = 0b11111111;   // 配置RC端口为输入
    max1241_init_io();    // 初始化MAX1241模块

    add3 = 0; add2 = 0;  // 清除显示数据
    add1 = 0; add0 = 0;

redo:
    counter = 0;
    for (k = 10; k > 0; k--)  // 进行10次采样,以获得5.115V电压基准
    {
        max1241_read_io();    // 读取MAX1241转换结果
        counter = counter + adre_1241; // 累加转换结果
    }
    
    cal_hex(counter >> 3);   // 计算结果并转为十六进制
    send(0x05, add3 + 128);  // 发送小数点相关数据,用于显示电压
    send(0x06, add2);
    send(0x07, add1);
    send(0x08, add0);

    counter = 0;
    for (k = 20; k > 0; k--)  // 进行20次采样,以获得ADC0808转换结果
    {
        Adc0808_Read();       // 读取ADC0808的转换结果
        counter = counter + ad_result; // 累加ADC转换结果
    }
    
    cal_hex(counter);        // 计算并转为十六进制
    send(0x01, add3 + 128); // 发送ADC结果
    send(0x02, add2);
    send(0x03, add1);
    send(0x04, add0);

    delay1s();              // 延时1秒
    delayms(100);           // 延时100毫秒
    delayus(10);            // 延时10微秒
    delay1s();              // 再次延时1秒

    goto redo;              // 循环返回到redo标签
}

4、代码解析

        该代码实现了对 ADC0808 的控制与数据读取。ADC0808 是一种8位模数转换器,具有8通道的多路复用输入。代码通过定义宏、设置引脚以及实现读取函数,实现与 ADC0808 的通信。模块的主要功能包括:

  1. 定义数据类型及控制信号

    • 使用宏定义了一些常用的数据类型缩写及控制信号,如 STARTEOC 和 OE,分别用于启动转换、检测转换结束和使能数据输出。
    • 定义 ADC_DATA_PORT 为数据读取端口。
  2. 读取转换结果

    • Adc0808_Read() 函数用于执行模数转换并读取转换结果。通过控制引脚信号顺序,实现对 ADC0808 的启动、转换完成检测,以及数据读取。

 5、硬件资源分配表 

序号 引脚 类别 方向 功能定义 功能内容 相关寄存器及配置
1 RD3 数字IO 输出 START 启动信号 TRISD3 = 0
2 RD4 数字IO 输入 EOC 转换完成信号 TRISD4 = 1
3 RA0 数字IO 输出 OE 输出使能信号 TRISA0 = 0
4 PORTC 数据端口 输入 ADC_DATA_PORT 读取ADC数据 数据端口(PORTC)

6、软件流程图


        在这个流程图中:

  • 启动ADC转换过程:流程的起点,开始ADC的转换过程。
  • 设置START信号由低变高再变低:设置ADC的START信号,通常是一个脉冲信号,用于启动ADC转换。
  • 等待EOC信号变高:等待转换结束信号EOC(End of Conversion)变为高电平,表示转换完成。
  • 使能输出(OE)读取转换结果:使能输出使能信号(OE),准备读取转换结果。

7、仿真运行结果

 

 

上一篇:详解overlay网络和underlay网络


下一篇:Codeforces Round 984 (Div. 3)-C. Anya and