基于单片机的±5V数字电压表设计
点击链接下载资料:https://download.csdn.net/download/m0_51061483/91933131
1. 系统功能介绍
本系统设计了一种基于 51 单片机 和 ADC0808 模数转换芯片 的双极性数字电压表。系统能够实现对 −5V 到 +5V 范围内直流电压的测量,并通过 数码管实时显示 测量结果。该设计充分体现了模拟信号采集、A/D 转换与单片机数字处理相结合的电子测量系统原理。
传统数字电压表通常仅支持 0~5V 或 0~10V 的单极性电压测量,而在电路实验、信号检测及嵌入式测试场合中,经常需要测量正负双极性电压,因此设计一个**±5V可测的数字电压表**具有重要的实际意义。
系统通过 信号调理电路 将输入电压(−5V~+5V)转换为 0~5V 的电压范围,以适配 ADC0808 的输入要求。单片机对 ADC 输出的数字信号进行计算、转换为对应的电压值,并通过 数码管动态扫描技术 实时显示测量结果,能够显示电压数值及其正负符号。
2. 系统电路设计
系统的整体硬件设计由以下几个部分组成:
- 主控单片机模块
- 模拟信号调理模块
- 模数转换模块(ADC0808)
- 数码管显示模块
- 电源模块
下面将分别介绍各模块的电路功能与设计要点。
2.1 主控单片机模块
本系统采用 STC89C52 单片机作为核心控制器。该芯片基于 8051 内核,具有 8KB Flash 程序存储器、256B RAM、3 个 16 位定时器、32 个 I/O 口,完全满足系统的采集与显示控制需求。
主要功能
- 负责初始化系统与 ADC0808;
- 从 ADC0808 读取数字信号;
- 计算并转换为实际电压值;
- 驱动数码管显示电压值;
- 实现符号显示(正负号)。
接口分配
- P0口:连接 ADC0808 的数据输出口;
- P1口:作为数码管段选信号;
- P2口:作为位选信号控制数码管扫描;
- P3口部分引脚用于 ADC 控制信号,如
ALE、START、EOC、OE; - VCC 接 +5V 电源,GND 接地。
单片机内部程序使用定时器产生扫描节拍,以固定频率刷新显示内容,使人眼看到稳定的数字显示。
2.2 模拟信号调理模块
由于 ADC0808 只能接受 0~5V 的输入电压 ,而待测信号范围为 −5V~+5V ,因此需要一个信号变换电路,将输入电压线性映射到 ADC 的输入范围。
转换原理
设输入电压为 Vin,范围为 −5V~+5V。希望输出电压 Vout 在 0~5V 范围内,则有以下线性映射关系:
Vout = (Vin + 5) / 2
当 Vin = −5V → Vout = 0V
当 Vin = 0V → Vout = 2.5V
当 Vin = +5V → Vout = 5V
为实现该线性变换,使用 运算放大器 构成加法与比例放大电路。
关键设计
- 运放选型:选用低漂移、低噪声的运放,如 LM358 或 TL082。
- 电阻匹配:采用精密电阻,以保证比例关系准确。
- 输入保护:在输入端串接限流电阻,并并联稳压二极管,防止电压过高损坏ADC输入。
该调理电路的稳定性直接决定了电压表的测量精度,因此设计时要注意放大倍数及零点偏置的准确性。
2.3 模数转换模块(ADC0808)
ADC0808 是一款带 8 路模拟输入的 8 位逐次逼近型 A/D 转换器,能够将模拟电压转换为数字信号,并通过 8 位数据总线输出。
主要特性
- 分辨率:8 位(共 256 个量化级);
- 输入电压范围:0~5V;
- 转换时间:约 100μs;
- 输出形式:8 位二进制码。
接口连接
-
数据输出:连接到单片机的 P0 口;
-
控制信号:
ALE:地址锁存使能;START:启动转换;EOC:转换结束信号;OE:输出使能;
-
地址选择:通过 ADD A、ADD B、ADD C 选择输入通道。
在本系统中,只使用 ADC0808 的一个通道(例如 CH0)进行单路电压采集。
模拟电压计算公式
当 ADC 输出值为 D(范围 0~255),则对应输入电压为:
Vadc = D × 5 / 255
由信号调理关系可反算原输入电压:
Vin = 2 × Vadc − 5
单片机通过该公式计算得到最终测量值并显示。
2.4 数码管显示模块
本系统使用三位共阳极数码管,用于显示测得电压的数值及符号。
显示内容
- 第一位:正负号;
- 第二至第四位:电压数值;
- 小数点用于显示精度(如 ±3.25V)。
驱动方式
采用 动态扫描技术,即所有数码管的段线并联,位选线由单片机控制轮流点亮。通过快速刷新(约1ms周期),实现多位数码管的稳定显示。
段码定义
每个数码管由 7 个段(a~g)及小数点组成。单片机通过查表方式输出对应数字的段码。
2.5 电源模块
系统电源设计包括:
- +5V 电源:为单片机与 ADC 提供逻辑电源;
- ±5V 电源:为信号调理运放提供双极性电源;
- 电源滤波:在电源线上并联电解电容与瓷片电容,降低电源噪声;
- 稳压芯片:使用 7805 线性稳压芯片稳定输出 5V。
该电源模块保证了系统长期运行的稳定性与测量精度。
3. 系统程序设计
程序部分采用 C语言 编写,基于 Keil μVision 开发环境。程序总体上包括以下模块:
- 主程序模块;
- ADC0808 控制与采集模块;
- 电压计算模块;
- 数码管显示模块;
- 定时中断扫描模块。
3.1 主程序设计
主程序的主要任务是完成系统初始化、周期性采集电压值、计算并刷新显示。其结构如下:
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit ALE = P3^4;
sbit START = P3^5;
sbit EOC = P3^2;
sbit OE = P3^6;
uchar code SEG_TABLE[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
float voltage = 0;
uchar disp_buf[4];
void delay(uint t)
{
uint i,j;
for(i=0;i<t;i++)
for(j=0;j<120;j++);
}
void ADC_Init()
{
ALE = 0; START = 0; OE = 0;
}
uchar Read_ADC()
{
uchar dat;
ALE = 1; delay(1); ALE = 0;
START = 1; delay(1); START = 0;
while(EOC == 0);
OE = 1;
dat = P0;
OE = 0;
return dat;
}
void Display()
{
uchar i;
for(i=0;i<4;i++)
{
P1 = SEG_TABLE[disp_buf[i]];
P2 = 1 << i;
delay(2);
P2 = 0;
}
}
void main()
{
uchar adc_value;
float v_adc;
ADC_Init();
while(1)
{
adc_value = Read_ADC();
v_adc = (float)adc_value * 5.0 / 255.0;
voltage = 2 * v_adc - 5.0;
if(voltage < 0)
{
disp_buf[0] = 10; // 表示 '-'
voltage = -voltage;
}
else disp_buf[0] = 11; // 表示 '+'
uint temp = (uint)(voltage * 100);
disp_buf[1] = temp / 100;
disp_buf[2] = (temp / 10) % 10;
disp_buf[3] = temp % 10;
Display();
}
}
该程序的主要流程如下:
- 初始化ADC0808;
- 周期性启动A/D转换;
- 读取数字值并计算对应电压;
- 将电压值分解成整数与小数部分;
- 动态刷新数码管显示。
3.2 ADC0808 控制程序
ADC控制部分包括启动信号、等待转换完成以及读取结果。核心代码如下:
uchar Read_ADC()
{
uchar dat;
ALE = 1; delay(1); ALE = 0;
START = 1; delay(1); START = 0;
while(EOC == 0);
OE = 1;
dat = P0;
OE = 0;
return dat;
}
该函数通过控制 ALE 与 START 完成采样与启动转换,并等待 EOC 变高后输出数据。转换时间约为 100μs,能够满足实时测量需求。
3.3 电压换算与符号判断程序
根据ADC输出值,单片机计算出对应输入电压:
v_adc = (float)adc_value * 5.0 / 255.0;
voltage = 2 * v_adc - 5.0;
当电压为负时,符号位置显示"−";当为正时显示"+"。并将绝对值部分分解为整数与小数部分进行显示。
3.4 数码管显示程序
为了提高显示效率,系统采用动态扫描法。通过快速轮流点亮各位数码管,使人眼视觉形成连续的数字显示。
void Display()
{
uchar i;
for(i=0;i<4;i++)
{
P1 = SEG_TABLE[disp_buf[i]];
P2 = 1 << i;
delay(2);
P2 = 0;
}
}
刷新周期约为 8ms,可获得稳定清晰的显示效果。
3.5 定时中断程序(可选)
为进一步优化系统性能,可使用定时器中断实现周期性刷新显示,而主循环仅负责采集数据,从而提升显示的流畅性与系统响应速度。
void Timer0_ISR() interrupt 1
{
Display();
}
4. 系统性能分析与结论
4.1 系统精度
ADC0808 的分辨率为 8 位,因此最小分辨电压为:
ΔV = 5 / 255 ≈ 0.0196V
经信号线性映射后,对应输入电压分辨率为:
ΔVin = 2 × ΔV = 0.0392V
即约为 40mV/位,满足一般教学实验及低速测量需求。
4.2 系统优点
- 测量范围广:实现 ±5V 范围测量;
- 显示直观:数码管显示电压值与正负号;
- 可靠性高:模拟信号调理有效保护ADC;
- 通用性强:可扩展至多通道电压检测;
- 结构简单:成本低、适合教学实验与嵌入式应用。
4.3 结论
本设计通过软硬件结合,成功实现了基于 51 单片机的 ±5V 双极性数字电压表。系统从信号调理、电压采样、模数转换到显示输出均采用模块化设计,结构清晰、功能完善。经仿真验证,在 Proteus 平台上系统能稳定测量电压值,动态响应良好,显示正确,为数字测量类实验提供了可靠的参考方案。