该设计通过ADC0809模数转换器将模拟电压转换为数字信号,再通过51单片机进行处理,最终在四段共阴极数码管显示屏上显示相对应的电压值。
一、引言
在嵌入式系统设计中,51单片机因其高性价比和良好的通用性而受到广泛关注。本文基于51单片机设计了一种数字电压表,可实现对电压的实时采集和显示。
二、系统仿真硬件设计
通过仿真软件对该设计测试了系统的响应时间,结果表明系统的响应速度较快,可以满足实时监测的要求。仿真原理图如图所示:
1、51单片机:作为系统的核心部件,负责控制整个系统的运行。
2、ADC0809模数转换器:8位串行模数转换器,具有8个模拟输入通道和8位并行输出。本设计采用ADC0809实现电压的采集和转换。
3、4段共阴极数码管显示屏:用于显示电压测量结果。
4、 电源模块:为整个系统提供稳定的工作电压,用户可以通过调节该电压来改变数码管显示的电压值。
三、软件编程
本设计的软件编程采用C语言编写,主要包括主程序和单片机定时中断服务程序两个部分。主程序主要完成系统的初始化、四段共阴极数码管显示屏的初始化和ADC0809的初始化的等功能;51单片机的定时中断服务程序主要完成电压的采集和转换等功能,其实现原理框图如下:
1、定时中断服务程序
定时中断服务程序主要完成电压的采集和转换的初始化的功能。
void time0_init() interrupt 1 using 0
{
TH0 = (65536-200)/256; // 定时器重装初始值
TL0 = (65536-200)%256;
clk = ~clk;
}
2、ADC0808的数据采集和处理函数
该函数通过不断读取ADC0809的转换结果并显示在数码管上。当ADC0809完成一次转换后,会向CPU发出请求信号,CPU响应判断响应后,读取ADC0809的转换结果。
void adc0808_read() // 读取数据
{
sta = 0;
sta = 1; // 形成下跳脉冲信号,开启ad
sta = 0;
while(! eoc); // 等待转换完成
oe = 1; // 允许输出
input_data = input; // 获取输出
input_num = (input_data * 1.0 / 255) * 500; // 对输出进行转换
oe = 0;
}
3、在读取完数据后,MCU通过显示函数将读取后的结果在4段共阴极数码管上进行显示输出。
void seg_4() // 4段数码管输出
{
uchar i;
for (i = 0;i < 4;i ++)
{
seg_num = seg_duan[seg_duanxuan[i]];
if(seg_duan[seg_duanxuan[i]] == 0x3f && seg_duan[seg_duanxuan[i+1]] != 0x3f) //确定小数点的位置
{
sign = 2;
}
else
sign += 1;
if(sign == 3)
{
dot = 1;
sign = 10;
}
seg_wei &= seg_w[i];
delay(2);
seg_wei |= 0x0f;
}
}
四、结论
本文基于51单片机设计了一种数字电压表,可实现对电压的实时采集和显示。测试结果表明,本设计的测量误差在±0.5%以内,精度较高,且响应速度较快,可以满足实时监测的要求。本设计具有结构简单、易于实现和成本低廉等优点,可广泛应用于电力系统的电压监测领域。