数字电压表课程设计如何实现?

99ANYc3cd6 课程介绍 1

《数字电压表》课程设计报告

课题名称 设计者
学 号 指导教师
专 业 设计时间

摘要

本报告详细阐述了一种基于 [STC89C52 单片机] 的数字电压表的设计与实现方案,该设计以 [ADC0808 模数转换芯片] 作为核心模数转换器,利用 [STC89C52 单片机] 进行数据处理与控制,并通过 [LCD1602 液晶显示屏][数码管] 进行测量结果的实时显示。

系统硬件部分主要包括电源模块、单片机最小系统、模拟信号调理电路(可选)、A/D 转换模块和显示模块,软件部分采用 [C语言] 进行编程,实现了 A/D 转换的初始化、控制、数据读取、数据处理(如量程切换、数据处理)以及结果显示等功能,经过测试,本设计制作的数字电压表在 [0-5V] 量程内,测量精度可达 [±0.02V],响应速度快,显示稳定,基本达到了设计要求。

数字电压表课程设计如何实现?-第1张图片-指南针培训网

数字电压表;单片机;A/D 转换;LCD 显示;课程设计


目录

  1. 绪论 1.1 设计背景与意义 1.2 设计任务与要求 1.3 设计方案论证

  2. 系统总体方案设计 2.1 系统设计目标 2.2 系统总体结构框图 2.3 系统工作原理

  3. 硬件电路设计 3.1 主控模块设计 3.2 A/D 转换模块设计 3.3 显示模块设计 3.4 辅助电路设计(电源、按键等) 3.5 总体电路原理图

    数字电压表课程设计如何实现?-第2张图片-指南针培训网
  4. 软件系统设计 4.1 软件开发环境 4.2 主程序流程图 4.3 各功能模块程序设计 4.3.1 A/D 转换子程序 4.3.2 数据处理子程序 4.3.3 显示子程序 4.4 核心代码附录

  5. 系统调试与结果分析 5.1 硬件调试 5.2 软件调试 5.3 系统整体测试 5.4 测试结果与分析

  6. 结论与展望 6.1 设计总结 6.2 心得体会 6.3 不足与展望

  7. 参考文献

    数字电压表课程设计如何实现?-第3张图片-指南针培训网
  8. 附录 8.1 元器件清单 8.2 完整电路原理图 8.3 完整源代码


绪论

1 设计背景与意义

电压是电子电路中最基本的参数之一,电压的精确测量在科研、生产、教学和日常生活中具有至关重要的作用,传统的指针式电压表具有读数不直观、内阻低、易受外界磁场影响、精度有限等缺点。

数字电压表(Digital Voltmeter, DVM)是利用模/数(A/D)转换技术,将模拟电压信号转换为数字信号,并进行数字显示的仪表,与指针式电压表相比,数字电压表具有读数直观、精度高、输入阻抗高、抗干扰能力强、易于实现自动化测量和数据处理等优点,学习和设计数字电压表,不仅能够加深对模/数转换技术、单片机原理等课程知识的理解,还能锻炼综合运用硬件和软件解决实际问题的能力,具有重要的理论意义和实践价值。

2 设计任务与要求

本设计的主要任务是设计并制作一个简易的直流数字电压表,具体要求如下:

  1. 测量范围: 0-5V 直流电压。
  2. 测量精度: 在满量程内,测量误差不超过 ±0.02V。
  3. 显示方式: 使用 LCD1602 或 4 位数码管显示测量电压值,单位为 V。
  4. 刷新率: 显示刷新频率不低于 1 次/秒。
  5. 扩展功能(可选): 实现量程自动切换(如 0-5V, 0-20V),或增加按键手动切换量程。

3 设计方案论证

实现数字电压表的核心在于 A/D 转换,目前主流的实现方案有三种:

  1. 纯硬件方案: 采用专用的 ICL7107/7106 等 A/D 转换芯片,配合少量外围元件直接驱动数码管,此方案电路简单,成本低,但功能固定,灵活性差,不易扩展。
  2. 单片机方案: 以单片机(如 51 系列、STM32、AVR 等)为核心,外接 A/D 转换芯片(如 ADC0808/0809, ADC0832, TLC2543 或芯片自带 ADC),此方案功能灵活,可以通过编程实现多种复杂功能(如数据平均、滤波、通信等),是本次课程设计的主流和推荐方案。
  3. FPGA 方案: 采用现场可编程门阵列实现 A/D 控制和数据处理,此方案性能极高,适合高速、高精度的应用,但开发难度大,成本高,不适合作为基础课程设计。

综合考虑课程设计的难度、成本和灵活性,本设计采用 基于 STC89C52 单片机和 ADC0808 的设计方案


系统总体方案设计

1 系统设计目标

设计一个以 STC89C52 单片机为控制核心,通过 ADC0808 将待测的模拟电压转换为数字量,经单片机处理后,在 LCD1602 上显示最终电压值的数字电压表。

2 系统总体结构框图

graph TD
    A[待测直流电压] --> B(信号调理/分压电路);
    B --> C(A/D转换模块 ADC0808);
    C --> D(单片机主控模块 STC89C52);
    D --> E(LCD显示模块 LCD1602);
    F(按键模块) --> D;
    G(电源模块) --> B;
    G --> C;
    G --> D;
    G --> E;

3 系统工作原理

  1. 信号输入与调理: 待测的 0-5V 模拟电压信号首先进入信号调理电路,ADC0808 的参考电压 Vref 为 5V,则输入信号可直接送入,若要测量更高电压,则需要分压电路将其降至 0-5V 范围内。
  2. A/D 转换: 单片机通过 I/O 口向 ADC0808 发送启动转换信号(START)和通道选择信号(ADD-A, ADD-B, ADD-C),ADC0808 对选中的模拟通道进行转换,转换完成后,输出转换结束信号 EOC。
  3. 数据读取: 单片机检测到 EOC 信号后,发出输出使能信号 OE,从 ADC0808 的数据端口(D0-D7)读取 8 位数字量。
  4. 数据处理: 单片机将读取到的 8 位数字量进行计算,计算公式为:Vout = (Digital_Value / 255) * Vref,Vref 为参考电压,通常取 5V,计算结果可以保留 2-3 位小数。
  5. 结果显示: 单片机将计算得到的电压值,按照“X.XX V”的格式,通过 LCD1602 显示出来,系统循环执行上述步骤,实现实时测量与显示。

硬件电路设计

1 主控模块设计

本设计选用 STC89C52RC 单片机作为主控制器,它是一款低功耗、高性能的 CMOS 8 位微控制器,拥有 8K 字节在系统可编程 Flash 存储器、512 字节 RAM、32 个 I/O 口线、3 个 16 位定时器/计数器、8 个中断源等资源,足以满足本设计的控制需求。 电路包括:单片机最小系统,即电源(VCC-40, GND-20)、时钟电路(晶振 Y1-18,19 和电容 C1, C2)和复位电路(按键 S1 和电阻 R1, 电容 C3)。

2 A/D 转换模块设计

选用 ADC0808 芯片,它是 8 位逐次逼近式 A/D 转换器,有 8 个模拟输入通道。

  • 连接方式:
    • IN0-IN7: 接入模拟输入信号,本设计使用 IN0 通道。
    • ADD-A, ADD-B, ADD-C: 接单片机的 P0.0, P0.1, P0.2,用于通道选择。
    • ALE, START: 接单片机 P2.7,ALE 上升沿锁存通道地址,START 上升沿启动转换。
    • EOC: 接单片机 P3.2(INT0),用于查询转换是否结束。
    • OE: 接单片机 P2.7,与 START 并联,当 EOC 变为高电平时,单片机拉低 OE 读取数据。
    • D0-D7: 接单片机的 P1 口,用于传输转换后的 8 位数字量。
    • VCC, GND, Vref(+), Vref(-): VCC 接 +5V,GND 接地,Vref(+) 接 +5V,Vref(-) 接地,此时输入电压范围为 0-5V。

3 显示模块设计

选用 LCD1602 字符型液晶显示模块,它可以显示 2 行,每行 16 个英文字符或数字。

  • 连接方式:
    • RS (寄存器选择): 接单片机 P2.5
    • RW (读写选择): 接单片机 P2.6 (或直接接地,只写不读)
    • E (使能信号): 接单片机 P2.7
    • D0-D7 (数据总线): 接单片机的 P0 口(需接上拉电阻排)
    • VDD, VSS, V0, A, K: VDD 接 +5V,VSS 接地,V0 接电位器中间脚用于调节对比度,A 接 +5V 背光正极,K 接地背光负极。

4 辅助电路设计

  • 电源模块: 使用 USB 5V 供电或 220V 交流转 5V 直流的适配模块为整个系统供电。
  • 按键模块(可选): 增加一个按键用于手动切换量程或校准,按键一端接地,另一端接单片机的一个 I/O 口(如 P3.3),通过软件检测电平变化。

5 总体电路原理图

(此处应插入使用 Altium Designer, KiCad, Proteus 或 Visio 等软件绘制的完整电路原理图)


软件系统设计

1 软件开发环境

  • 编程语言: C语言
  • 开发工具: Keil C51 (µVision5)
  • 编程器/下载器: STC-ISP
  • 仿真软件(可选): Proteus

2 主程序流程图

graph TD
    A[开始] --> B[系统初始化];
    B --> C[启动ADC转换];
    C --> D[等待EOC信号];
    D --> E{EOC=1?};
    E -- 是 --> F[读取ADC数据];
    E -- 否 --> D;
    F --> G[数据处理];
    G --> H[LCD显示];
    H --> C;

3 各功能模块程序设计

3.1 A/D 转换子程序
// 函数名: Get_ADC_Value
// 功能: 读取指定通道的ADC转换值
// 参数: channel (0-7)
// 返回值: 8位ADC转换值
unsigned char Get_ADC_Value(unsigned char channel) {
    // 1. 锁存通道地址
    P0 = channel; // P0口低三位作为通道地址
    ALE = 1;
    _nop_();
    ALE = 0;
    // 2. 启动转换
    START = 1;
    _nop_();
    START = 0;
    // 3. 等待转换结束
    while(EOC == 0); // 查询EOC引脚
    // 4. 读取数据
    OE = 1;
    unsigned char value = P1; // 从P1口读取数据
    OE = 0;
    return value;
}
3.2 数据处理子程序
// 函数名: Calculate_Voltage
// 功能: 将ADC数字量转换为电压值
// 参数: adc_value (0-255)
// 返回值: 电压值,单位为0.01V (250 代表 2.50V)
unsigned int Calculate_Voltage(unsigned char adc_value) {
    // 假设Vref = 5.00V
    // Vout = (adc_value / 255.0) * 5.00
    // 为了避免浮点运算,放大100倍
    // Vout_100 = (adc_value * 500) / 255
    return (unsigned long)(adc_value * 500) / 255;
}
3.3 显示子程序
// 函数名: Display_Voltage
// 功能: 在LCD上显示电压值
// 参数: voltage_100 (电压值,单位为0.01V)
void Display_Voltage(unsigned int voltage_100) {
    char buf[16];
    float voltage_float = voltage_100 / 100.0;
    // 使用sprintf格式化字符串
    sprintf(buf, "Voltage: %.2f V", voltage_float);
    // 调用LCD显示函数,将buf显示在第一行
    LCD_DisplayString(0, 0, buf);
}

4 核心代码附录

(此处可以附上 main.c 文件的核心代码部分)


系统调试与结果分析

1 硬件调试

  1. 电源检查: 使用万用表检查 VCC 和 GND 之间是否为稳定的 +5V 电压。
  2. 最小系统检查: 检查晶振是否起振(用示波器观察),复位电路是否正常工作。
  3. 模块独立调试:
    • LCD 调试: 编写一个简单的 LCD 初始化和显示“Hello World”的程序,检查 LCD 是否能正常点亮和显示。
    • ADC 调试: 在 IN0 口输入一个已知的电压(如 2.5V),编写程序读取 ADC 值,通过串口打印出来,检查读数是否在理论值(约 128)附近。

2 软件调试

  1. 分段调试: 将主程序分解为初始化、ADC 读取、数据处理、显示等模块,逐一进行调试和验证。
  2. 断点调试: 在 Keil 中设置断点,观察程序执行流程和变量值的变化,定位逻辑错误。
  3. 串口打印调试: 在关键步骤(如读取到 ADC 值、计算后)通过串口打印中间结果,便于分析问题。

3 系统整体测试

使用高精度可调直流稳压电源作为标准信号源,输出不同的标准电压值(如 0.5V, 1.0V, 2.0V, 3.5V, 4.8V),用本设计的数字电压表进行测量,同时用另一块高精度数字万用表作为标准,记录测量结果。

4 测试结果与分析

标准电压 (V) 本设计测量值 (V) 绝对误差 (V) 相对误差 (%)
50 51 +0.01 +2.0%
00 01 +0.01 +1.0%
00 02 +0.02 +1.0%
50 51 +0.01 +0.29%
80 82 +0.02 +0.42%

结果分析: 从上表可以看出,本设计制作的数字电压表在 0-5V 量程内,测量误差基本在 ±0.02V 以内,满足设计要求,误差来源主要包括:

  1. ADC0808 的量化误差: 8 位 ADC 的理论分辨率为 5V/255 ≈ 0.0196V,这是误差的主要来源。
  2. 参考电压 Vref 的精度: Vref 不精确为 5.00V,则会引入系统误差。
  3. 元器件的精度: 电阻、电容等元器件的精度和温漂也会带来微小影响。

结论与展望

1 设计总结

本次课程设计成功实现了一个基于 STC89C52 单片机和 ADC0808 的数字电压表,通过本次设计,我系统地掌握了单片机最小系统设计、A/D 转换芯片的使用、LCD 显示模块的驱动以及 C 语言程序开发等技能,将课堂上学到的理论知识成功应用于实践,解决了一个具体的工程问题。

2 心得体会

在设计和调试过程中,我深刻体会到理论与实践相结合的重要性,起初,对芯片的时序理解不够透彻,导致 ADC 无法正常读取数据,通过查阅数据手册、分析时序图和反复调试,最终解决了问题,模块化编程和调试方法也极大地提高了开发效率和可靠性。

3 不足与展望

本设计还存在一些可以改进的地方:

  1. 精度有限: 受限于 8 位 ADC,测量精度不高,未来可以选用 10 位、12 位或更高分辨率的 ADC(如 ADC0804, ADS1115)来提高测量精度。
  2. 功能单一: 目前只能测量 0-5V 的直流电压,未来可以增加量程自动切换电路(使用继电器或模拟开关),以实现更宽范围的电压测量。
  3. 抗干扰能力: 未加入软件滤波算法(如滑动平均滤波),容易受到噪声干扰,未来可以加入滤波算法,使读数更稳定。
  4. 数据记录: 可以增加 SD 卡模块,实现测量数据的存储与导出功能,便于后续分析。

参考文献

[1] 康华光. 电子技术基础(数字部分)[M]. 第6版. 北京: 高等教育出版社, 2025. [2] 谭浩强. C程序设计(第五版)[M]. 北京: 清华大学出版社, 2025. [3] STC89C52RC Datasheet [EB/OL]. 宏晶科技官网. [4] ADC0808 Datasheet [EB/OL]. National Semiconductor Corporation. [5] LCD1602 Datasheet [EB/OL]. Hitachi Corporation.


附录

1 元器件清单

序号 元件名称 型号/参数 数量 备注
1 单片机 STC89C52 1
2 A/D 转换器 ADC0808 1
3 晶振 12MHz 1
4 液晶屏 LCD1602 1
5 按键 6mm*6mm 1 复位用
6 电阻 10kΩ 1 上拉
7 电阻 1kΩ 8 LCD 数据线上拉
8 电容 30pF 2 晶振负载
9 电容 10μF 1 复位电路
10 集成电路插座 DIP40 1
11 集成电路插座 DIP28 1
12 PCB 板 / 面包板 - 1

2 完整电路原理图

(此处应插入最终的电路原理图)

3 完整源代码

(此处应附上所有 C 语言的完整源代码,如 main.c, lcd.c, adc.c 等)

标签: 硬件电路设计 A/D转换技术 软件编程实现

抱歉,评论功能暂时关闭!