基于单片机的±5V数字电压表设计

基于单片机的±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 口,完全满足系统的采集与显示控制需求。

主要功能
  1. 负责初始化系统与 ADC0808;
  2. 从 ADC0808 读取数字信号;
  3. 计算并转换为实际电压值;
  4. 驱动数码管显示电压值;
  5. 实现符号显示(正负号)。
接口分配
  • P0口:连接 ADC0808 的数据输出口;
  • P1口:作为数码管段选信号;
  • P2口:作为位选信号控制数码管扫描;
  • P3口部分引脚用于 ADC 控制信号,如 ALESTARTEOCOE
  • 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

为实现该线性变换,使用 运算放大器 构成加法与比例放大电路。

关键设计
  1. 运放选型:选用低漂移、低噪声的运放,如 LM358 或 TL082。
  2. 电阻匹配:采用精密电阻,以保证比例关系准确。
  3. 输入保护:在输入端串接限流电阻,并并联稳压二极管,防止电压过高损坏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 电源模块

系统电源设计包括:

  1. +5V 电源:为单片机与 ADC 提供逻辑电源;
  2. ±5V 电源:为信号调理运放提供双极性电源;
  3. 电源滤波:在电源线上并联电解电容与瓷片电容,降低电源噪声;
  4. 稳压芯片:使用 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();
	}
}

该程序的主要流程如下:

  1. 初始化ADC0808;
  2. 周期性启动A/D转换;
  3. 读取数字值并计算对应电压;
  4. 将电压值分解成整数与小数部分;
  5. 动态刷新数码管显示。

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;
}

该函数通过控制 ALESTART 完成采样与启动转换,并等待 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 系统优点

  1. 测量范围广:实现 ±5V 范围测量;
  2. 显示直观:数码管显示电压值与正负号;
  3. 可靠性高:模拟信号调理有效保护ADC;
  4. 通用性强:可扩展至多通道电压检测;
  5. 结构简单:成本低、适合教学实验与嵌入式应用。

4.3 结论

本设计通过软硬件结合,成功实现了基于 51 单片机的 ±5V 双极性数字电压表。系统从信号调理、电压采样、模数转换到显示输出均采用模块化设计,结构清晰、功能完善。经仿真验证,在 Proteus 平台上系统能稳定测量电压值,动态响应良好,显示正确,为数字测量类实验提供了可靠的参考方案。

相关推荐
djarmy4 小时前
使用定时器14(GPIOF9复用映射到TIM14_CH1)控制LED0闪烁实验
stm32·单片机·嵌入式硬件
GilgameshJSS5 小时前
STM32H743-ARM例程29-HTTP
c语言·arm开发·stm32·单片机·http
学工科的皮皮志^_^5 小时前
锂电池充放电管理学习
经验分享·笔记·单片机·嵌入式硬件·学习·1024程序员节
点灯小铭5 小时前
基于单片机的滴速液位输液报警系统
单片机·毕业设计·课程设计·1024程序员节·期末大作业
CiLerLinux6 小时前
第三章 FreeRTOS 任务相关 API 函数
开发语言·单片机·物联网·c#
wanglong371311 小时前
STM32单片机PWM驱动无源蜂鸣器模块C语言程序
stm32·单片机·1024程序员节
清风66666613 小时前
基于单片机的故障检测自动保护智能防夹自动门设计及LCD状态显示系统
单片机·毕业设计·课程设计·1024程序员节·期末大作业
nuoyigui988918 小时前
modbus rtu通信协议总结
单片机
不脱发的程序猿19 小时前
如何检测和解决I2C通信死锁
stm32·单片机·嵌入式·1024程序员节