《数字电压表》课程设计报告
| 课题名称 | 设计者 | ||
|---|---|---|---|
| 学 号 | 指导教师 | ||
| 专 业 | 设计时间 |
摘要
本报告详细阐述了一种基于 [STC89C52 单片机] 的数字电压表的设计与实现方案,该设计以 [ADC0808 模数转换芯片] 作为核心模数转换器,利用 [STC89C52 单片机] 进行数据处理与控制,并通过 [LCD1602 液晶显示屏] 或 [数码管] 进行测量结果的实时显示。
系统硬件部分主要包括电源模块、单片机最小系统、模拟信号调理电路(可选)、A/D 转换模块和显示模块,软件部分采用 [C语言] 进行编程,实现了 A/D 转换的初始化、控制、数据读取、数据处理(如量程切换、数据处理)以及结果显示等功能,经过测试,本设计制作的数字电压表在 [0-5V] 量程内,测量精度可达 [±0.02V],响应速度快,显示稳定,基本达到了设计要求。

数字电压表;单片机;A/D 转换;LCD 显示;课程设计
目录
-
绪论 1.1 设计背景与意义 1.2 设计任务与要求 1.3 设计方案论证
-
系统总体方案设计 2.1 系统设计目标 2.2 系统总体结构框图 2.3 系统工作原理
-
硬件电路设计 3.1 主控模块设计 3.2 A/D 转换模块设计 3.3 显示模块设计 3.4 辅助电路设计(电源、按键等) 3.5 总体电路原理图

-
软件系统设计 4.1 软件开发环境 4.2 主程序流程图 4.3 各功能模块程序设计 4.3.1 A/D 转换子程序 4.3.2 数据处理子程序 4.3.3 显示子程序 4.4 核心代码附录
-
系统调试与结果分析 5.1 硬件调试 5.2 软件调试 5.3 系统整体测试 5.4 测试结果与分析
-
结论与展望 6.1 设计总结 6.2 心得体会 6.3 不足与展望
-
参考文献

-
附录 8.1 元器件清单 8.2 完整电路原理图 8.3 完整源代码
绪论
1 设计背景与意义
电压是电子电路中最基本的参数之一,电压的精确测量在科研、生产、教学和日常生活中具有至关重要的作用,传统的指针式电压表具有读数不直观、内阻低、易受外界磁场影响、精度有限等缺点。
数字电压表(Digital Voltmeter, DVM)是利用模/数(A/D)转换技术,将模拟电压信号转换为数字信号,并进行数字显示的仪表,与指针式电压表相比,数字电压表具有读数直观、精度高、输入阻抗高、抗干扰能力强、易于实现自动化测量和数据处理等优点,学习和设计数字电压表,不仅能够加深对模/数转换技术、单片机原理等课程知识的理解,还能锻炼综合运用硬件和软件解决实际问题的能力,具有重要的理论意义和实践价值。
2 设计任务与要求
本设计的主要任务是设计并制作一个简易的直流数字电压表,具体要求如下:
- 测量范围: 0-5V 直流电压。
- 测量精度: 在满量程内,测量误差不超过 ±0.02V。
- 显示方式: 使用 LCD1602 或 4 位数码管显示测量电压值,单位为 V。
- 刷新率: 显示刷新频率不低于 1 次/秒。
- 扩展功能(可选): 实现量程自动切换(如 0-5V, 0-20V),或增加按键手动切换量程。
3 设计方案论证
实现数字电压表的核心在于 A/D 转换,目前主流的实现方案有三种:
- 纯硬件方案: 采用专用的 ICL7107/7106 等 A/D 转换芯片,配合少量外围元件直接驱动数码管,此方案电路简单,成本低,但功能固定,灵活性差,不易扩展。
- 单片机方案: 以单片机(如 51 系列、STM32、AVR 等)为核心,外接 A/D 转换芯片(如 ADC0808/0809, ADC0832, TLC2543 或芯片自带 ADC),此方案功能灵活,可以通过编程实现多种复杂功能(如数据平均、滤波、通信等),是本次课程设计的主流和推荐方案。
- 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 系统工作原理
- 信号输入与调理: 待测的 0-5V 模拟电压信号首先进入信号调理电路,ADC0808 的参考电压 Vref 为 5V,则输入信号可直接送入,若要测量更高电压,则需要分压电路将其降至 0-5V 范围内。
- A/D 转换: 单片机通过 I/O 口向 ADC0808 发送启动转换信号(START)和通道选择信号(ADD-A, ADD-B, ADD-C),ADC0808 对选中的模拟通道进行转换,转换完成后,输出转换结束信号 EOC。
- 数据读取: 单片机检测到 EOC 信号后,发出输出使能信号 OE,从 ADC0808 的数据端口(D0-D7)读取 8 位数字量。
- 数据处理: 单片机将读取到的 8 位数字量进行计算,计算公式为:
Vout = (Digital_Value / 255) * Vref,Vref 为参考电压,通常取 5V,计算结果可以保留 2-3 位小数。 - 结果显示: 单片机将计算得到的电压值,按照“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 硬件调试
- 电源检查: 使用万用表检查 VCC 和 GND 之间是否为稳定的 +5V 电压。
- 最小系统检查: 检查晶振是否起振(用示波器观察),复位电路是否正常工作。
- 模块独立调试:
- LCD 调试: 编写一个简单的 LCD 初始化和显示“Hello World”的程序,检查 LCD 是否能正常点亮和显示。
- ADC 调试: 在 IN0 口输入一个已知的电压(如 2.5V),编写程序读取 ADC 值,通过串口打印出来,检查读数是否在理论值(约 128)附近。
2 软件调试
- 分段调试: 将主程序分解为初始化、ADC 读取、数据处理、显示等模块,逐一进行调试和验证。
- 断点调试: 在 Keil 中设置断点,观察程序执行流程和变量值的变化,定位逻辑错误。
- 串口打印调试: 在关键步骤(如读取到 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 以内,满足设计要求,误差来源主要包括:
- ADC0808 的量化误差: 8 位 ADC 的理论分辨率为 5V/255 ≈ 0.0196V,这是误差的主要来源。
- 参考电压 Vref 的精度: Vref 不精确为 5.00V,则会引入系统误差。
- 元器件的精度: 电阻、电容等元器件的精度和温漂也会带来微小影响。
结论与展望
1 设计总结
本次课程设计成功实现了一个基于 STC89C52 单片机和 ADC0808 的数字电压表,通过本次设计,我系统地掌握了单片机最小系统设计、A/D 转换芯片的使用、LCD 显示模块的驱动以及 C 语言程序开发等技能,将课堂上学到的理论知识成功应用于实践,解决了一个具体的工程问题。
2 心得体会
在设计和调试过程中,我深刻体会到理论与实践相结合的重要性,起初,对芯片的时序理解不够透彻,导致 ADC 无法正常读取数据,通过查阅数据手册、分析时序图和反复调试,最终解决了问题,模块化编程和调试方法也极大地提高了开发效率和可靠性。
3 不足与展望
本设计还存在一些可以改进的地方:
- 精度有限: 受限于 8 位 ADC,测量精度不高,未来可以选用 10 位、12 位或更高分辨率的 ADC(如 ADC0804, ADS1115)来提高测量精度。
- 功能单一: 目前只能测量 0-5V 的直流电压,未来可以增加量程自动切换电路(使用继电器或模拟开关),以实现更宽范围的电压测量。
- 抗干扰能力: 未加入软件滤波算法(如滑动平均滤波),容易受到噪声干扰,未来可以加入滤波算法,使读数更稳定。
- 数据记录: 可以增加 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 等)