找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 21741|回复: 10
打印 上一主题 下一主题
收起左侧

单片机数字电压表的设计

  [复制链接]
跳转到指定楼层
楼主
摘 要
电压表是测量仪器中不可缺少的设备,而且随着电子技术的发展,更是经常需要测量高精度的电压,所以数字电压表就成为一种必不可少的测量仪器。目前广泛应用的是采用专门集成电路实现的数字电压表。
本系统以AT89C51单片机为核心,以逐次逼近式A/D转化器ADC0808、数码管显示器为主体,加上按键控制功能,设计了一款简易的数字电压表,通过按键控制,对ADC0808的输入通道进行选择,且通过数码管显示出具体通道数值,可以测量0到5V的八路输入电压。
本次设计还使用按键实现了数码管电路选择显示电压值的功能。能够测量0到5V的直流电压,最小分辨率为0.01。设计大体分为单片机部分、测量部分、数码管显示部分。其中测量部分为本次重点,要求将外部采集的模拟信号转化成数字信号,决定了数字电压表的精度等主要性能指标。
目 录
第1章 绪论
1.1系统的开发背景
1.2 本文研究对象
第2章 方案设计与论证
2.1设计方案与论证
2.2 系统设计要求
2.3总体设计框图
第3章 单元电路设计
3.1最小系统设计
3.2单片机模块设计
3.2 A/D转换设计
3.5 显示电路设计
3.6 模拟输入设计
3.7 按键设计
第4章 系统软件设计
4.1 主程序的设计
4.2 A/D转换程序设计
4.3 显示程序设计
4.4 按键程序设计
第5章 系统仿真与调试
第6章 总结
参考文献
附录I:整体电路原理图
附录II:元器件清单



第1章 绪论1.1系统的开发背景
在电量的测量中,电压、电流和频率是最基本的三个被测量,其中电压量的测量最为经常。而且随着电子技术的发展,更是经常需要测量高精度的电压,所以数字电压表就成为一种必不可少的测量仪器。数字电压表简称DVM,它是采用数字化测量技术,把连续的模拟量转换成不连续、离散的数字形式并加以显示的仪表。由于数字式仪器具有读数准确方便、精度高、误差小、测量速度快等特而得到广泛应用。
传统的指针式刻度电压表功能单一,进度低,容易引起视差和视觉疲劳,因而不能满足数字化时代的需要。采用单片机的数字电压表,将连续的模拟量如直流电压转换成不连续的离散的数字形式并加以显示,从而精度高、抗干扰能力强,可扩展性强、集成方便,还可与PC实时通信。数字电压表是诸多数字化仪表的核心与基础。以数字电压表为核心,可以扩展成各种通用数字仪表、专用数字仪表及各种非电量的数字化仪表。目前,由各种单片机和A/D转换器构成的数字电压表作全面深入的了解是很有必要的。
最近的几十年来,随着半导体技术、集成电路(IC)和微处理器技术的发展,数字电路和数字化测量技术也有了巨大的进步,从而促使了数字电压表的快速发展,并不断出现新的类型。数字电压表从1952年问世以来,经历了不断改进的过程,从最早采用继电器、电子管和形式发展到了现在的全固态化、集成化(IC化),另一方面,精度也从0.01%-0.005%。
目前,数字电压表的内部核心部件是A/D转换器,转换的精度很大程度上影响着数字电压表的准确度,因而,以后数字电压表的发展就着眼在高精度和低成本这两个方面。
1.2 本文研究对象
本文是以简易数字直流电压表的设计为研究内容,本系统主要包括三大模块:转换模块、数据处理模块及显示模块。其中,A/D转换采用ADC0808对输入的模拟信号进行转换,控制核心AT89C51再对转换的结果进行运算处理,最后驱动输出装置LED显示数字电压信号。
第2章 方案设计与论证2.1设计方案与论证
数字电压表的设计方案很多,但采用集成电路来设计较流行。其设计主要是由模拟电路和数字电路两大部分组成,模拟部分包括A/D转换器,基准电源等;数字部分包括振荡器,数码显示,计数器等。其中,A/D转换器将输入的模拟量转换成数字量,它是数字电压表的一个核心部件,对它的选择一般三种选择方案:
方案一、采用双积分A/D转换器MC14433,它有多路调制的BCD码输出端和超量程输出端,采用动态扫描显示,便于实现自动控制。但芯片只能完成A/D转换功能,要实现显示功能还需配合其它驱动芯片等,使得整部分硬件电路板布线复杂,加重了电路设计和实际焊接的工作。
方案二、 A/D转换器采用ICL7107型三位半显示的芯片,输入信号,流经取样电路取样后送到ICL7107型三位半A/D转换器,只需要很少的简单外围元件,就可组成数字电流表模块,直接驱动三位半LED显示器显示,最后输入电流在显示部分显示。由于ICL7107做的LED数字表,最大的缺点就是数字乱跳不稳定,特别最后一位。接口模块:使用数字电路实现,采用译码芯片CD4543作为接口芯片,这种方案能实现功能,但稳定性不高,结构复杂。
方案三、逐次逼近式A/D转换器。它的转换速度更快,而且精度更高,采用ADC0808转换芯片,其中A/D转换器用于实现模拟量向数字量的转换,单电源供电。它是具有8路模拟量输入、8位数字量输出功能的A/D转换器,转换时间为100μs,模拟输入电压范围为0V~5V,不需零点和满刻度校准,功耗低,约15mW。 由于模拟转换电路的种类很多,通过对转换速度,精度和价格方面考虑。
综上所述选择方案三。采用ADC0808为本次设计的转换芯片。单片机模块采用AT89S51单片机作为系统的控制单元,通过A/D转换将被测值转换为数字量送入单片机中,再由单片机来送显。此方案各类功能易于实现,成本低、功耗低,显示稳定。
显示部分可以采用各类数码管或用LED显示器显示。在此简化采用4位八段共阴极数码管对A/D转换变换后的结果加以显示。
2.2 系统设计要求
设计一个数字电压表,基于单片机或数字逻辑电路,设计A/D转化电路、密码校验电路和控制输出与显示电路,实现用户按键输入密码开锁功能。
1、以单片机为控制核心设计数字电压表;
2、可以测量0~5V的8路输入电压值;
3、LED数码管轮流显示或单路选择显示电压值;
4、最小分辨率为0.01V,测量误差约为±0.01V。
2.3总体设计框图
本设计采用以AT89C51单片机控制方案。 利用单片机灵活的编程设计和丰富的IO端口,及其控制的准确性。系统结构框图如图2.1所示。

图2.1系统结构框图






第3章 单元电路设计3.1最小系统设计

晶振模块设计采用内部时钟方式,利用单片机内部的高增益反相放大器,外部电路简,只需要一个晶振和 2个电容即可,如图3.1所示。
图3.1 时钟电路
电路中的器件选择可以通过计算和实验确定,也可以参考一些典型电路。参数,电路中,电容器C1和C2对震荡频率有微调作用,通常的取值范围是30±10pF,在这个系统中选择了30pF;石英晶振选择范围最高可选24MHz,它决定了单片机电路产生的时钟信号震荡频率,在本系统中选择的是12MHz,因而时钟信号的震荡频率为12MHz。

复位模块设计AT89C51单片机在启动运行时或者出现死机时需要复位,使CPU以及其他功能部件处于一个确定的初始状态,并从这个状态开始工作。复位电路产生的复位信号(高电平有效)由RST引脚送入到内部的复位电路,对AT89C51单片机进行复位,要求至少两个高电平,以便单片机做好准备工作。当上电时,由于电容的电压不能突变,会输出高电平,当电容充电到一定程度,就会输出低电平,单片机利用输出高电平的这段时间复位。电阻和电容的值选择要合适。在这要求R1<图3.3 最小相位系统电路
AT89C51芯片的各引脚功能为:
P0口:8位,漏极开路的双向I/O口。这组引脚共有8条,P0.0为最低位。这8个引脚有两种不同的功能,分别适用于不同的情况。
P1口:8位,准双向I/O口,具有内部上拉电阻。这8个引脚和P0口的8个引脚
类似,P1.7为最高位,P1.0为最低位,当P1口作为通用I/O口使用时,P1.0-P1.7的功能和P0口的第一功能相同,也用于传送用户的输入和输出数据。
P2口:这组引脚的第一功能与上述两组引脚的第一功能相同即它可以作为通用I/O口使用,它的第一功能和P0口引脚的第二功能相配合,用于输出片外存储器的高8位地址,共同选中片外存储器单元,但并不是像P0口那样传送存储器的读/写数据。
P3口:这组引脚的第一功能和其余三个端口的第一功能相同,第二功能为控制功能,每个引脚并不完全相同,如下表2所示:
ALE/PROG:地址锁存允许信号,输出。配合P0口的第二功能使用,在访问外部存储器时,89C51的CPU在P0.0-P0.7引脚线去传送随后而来的片外存储器读/写数据。在不访问片外存储器时,89C51自动在ALE线上输出频率为1/6震荡器频率的脉冲序列。该脉冲序列可以作为外部时钟源或定时脉冲使用。
/EA:片外存储器访问允许信号,低电平有效。可以控制89C51使用片内ROM或使用片外ROM,若/EA=1,则允许使用片内ROM,若/EA=0,则只使用片外ROM。
/PSEN:片外ROM的选通信号低电平有效。在访问片外ROM时,89C51自动在/PSEN线上产生一个负脉冲,作为片外ROM芯片的读选通信号。
RST:复位线,可以使89C51处于复位(即初始化)工作状态。通常89C51复位有自动上电复位和人工按键复位两种。
XTAL1和XTAL2:片内震荡电路输入线,这两个端子用来外接石英晶体和微调电容,即用来连接89C51片内OSC(震荡器)的定时反馈回路。
3.2 A/D转换设计

A/D转换器是模拟量输入通道中的一个环节,单片机通过A/D转换器把输入模拟量变成数字量再处理。ADC0808是采样分辨率为8位的、以逐次逼近原理进行模/数转换的器件。其内部有一个8通道多路开关,它可以根据地址码锁存译码后的信号,只选通8路模拟输入信号中的一个进行A/D转换。A/D转换电路如图3.4所示。
图3.4 ADC0808 转换电路
ADC0808芯片有28条引脚,采用双列直插式封装,各引脚功能为:
(1) IN0~IN7:8路模拟量输入端。
(2) D0~D7:8位数字量输出端口。
(3) START:A/D转换启动信号输入端。
(4) ALE:地址锁存允许信号,高电平有效。
(5) EOC:输出允许控制信号,高电平有效。
(6) OE: 输出允许控制信号,高电平有效。
(7) CLK:时钟信号输入端。
(8)ADDA、ADDB、ADDC:转换通道地址,控制8路模拟通道的切换。ADDA、ADDB、ADDC分别与地址线或数据线相连,三位编码对应8个通道地址端口,ADDA、ADDB、ADDC=000~111分别对应IN0~IN7通道的地址端口。

使用方法:
ADC0808采用逐次比较的方法完成A/D转换,由单一的+5V电源供电。片内带有锁存功能的8路选1的模拟开关,由ADDA、ADDB、ADDC的编码来决定所选的通道。ADC0808完成一次转换需100μs左右,它具有输出TTL三态锁存缓冲器,可直接连接到AT89C51的数据总线上。通过适当的外接电路,ADC0808可对0~5V的模拟信号进行转换。
3.5 显示电路设计

电压显示采用四位共阴极数码管,这种数码管可显示4位值,每位由8个发光二极管(以下简称字段)即a、b、c、d、e、f、g、dp字段构成,通过控制不同的LED的亮灭的不同组合可用来显示数字09及小数点“”。数码管又分为共阴极和共阳极两种结构。本次课程设计采用共阴极。
图3.5 四位数码管电路

共阴极数码管0~9的C51编码为:
  • uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x7f,0x6f};
  • uchar code table[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
其中1不带小数点,2带小数点。
共阳极就是数码管的每段都接高电平,这样要是哪段亮就这段就得接地。
通道选择显示采用7SEG-BCD,该数码管内含译码器,外部不需要再配,适用于直接加BCD码,即直接加四位二进制数,显示0到F。这个数码管用于显示ADC0808的选择输入通道。

图3.6 数码管电路

3.6 模拟输入设计
通过可变电阻一端接电源+5v,一端接地GND,通过改变电阻的阻值,从而改变所测电压值,实现电压的模拟信号输入。分别将八个输入接入ADC0808中IN0到IN7引脚实现八路的输入电压。将通过按键选择某一路输入,实现单路选择输出电压。

图3.7 模拟输入电路
3.7 按键设计
通过两个按键控制ADC0808的输入通道同时将通道数传递给通道显示的数码管。按键一的功能为加一,即每按下一次,通道数加一。按键二的功能为减一,即每按一下,通道数减一。实现单路选择显示电压。按键模型如图3.8所示。


图3.8 按键电路
要实现按键的功能需要知道ADC0808的ADDA、ADDB、ADDC的功能。ADC0808一个8路模拟开关,一个地址锁存与译码器、一个8位A/D转换器和一个三态输出锁存器组成。多路开关可选通8个模拟通道IN0—IN7,允许8路模拟分量输入,共用A/D转换器 进行转换。地址输入和控制线:4条,ALE为地址锁存允许输入线,高电平有效。当ALE线为高电平时,地址锁存与译码器将A,B,C三条地址线的地址信号进行锁存,经译码后被选中的通道的模拟量进转化器进行转换。A,B,C为地址输入线,用于选通IN0—IN7上的一路模拟量输入。


第4章 系统软件设计4.1 主程序的设计
由于ADC0808在进行A/D转换时需要有CLK信号,而此时的ADC0808的CLK是连接在AT89C51单片机的30管脚,也就是要求从30管脚输出CLK信号供ADC0808使用。因此产生CLK信号的方法就等于从软件产生。电压表系统有主程序,A/D转换子程序、按键子程序和显示子程序。主程序框图如图4.1所示。
图4.1 主程序流程图
4.2 A/D转换程序设计
ADC0808对模拟量输入信号进行转换通过判断EOC(P3.2来确定转换是否完成若EOC为0则继续等待若EOC为1则把OE置位,将转换完成。加入按键控制,通过按键控制ADC0808对输入电路的选择,从而实现单路选择电路电压满足设计要求。程序流程图如4.2所示。
    图4.2 A/D程序流程图
其中A/D转换子程序的C语言代码如下
sbit START=P3^0;
sbit OE=P3^1;
sbit EOC=P3^2;
uint data  tvdata;   
void main(void)
{
  ET0=1;
  EA=1;
  TMOD=0x02;
  TH0=216;
  TL0=216;
  TR0=1;
while(1)
  {
   START=1;
   START=0;          //启动转换
   while(EOC==0);
   OE=1;
   tvdata=P1;
   tvdata*=20-0.01;
   OE=0;
}
}
4.3 显示程序设计
系统上电后,配置数码管个引脚,然后对其进行初始化,再调用的读写函数,可将采集处理后的电压数值实时显示。其程序流程图如图4.3所示。




图4.3 显示程序流程图

其中显示子程序的C语言代码如下:
uchar code  tv[]={0xfe,0xfd,0xfb,0xf7};
uchar code  a[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void ledxianshi(void)     
{
  uchar k,i;
  if(tvdata>5000)
  tvdata=5000;
  led[0]=tvdata%10;
  led[1]=tvdata/10%10;
  led[2]=tvdata/100%10;
  led[3]=tvdata/1000;
  for(k=0;k<4;k++)
  {
   P2=tv[k];
   i=led[k];
   P0=a[ i];
   if(k==3)
   {
    P07 =1;
              }
   delay();
  }
}
4.4 按键程序设计
通过按键控制ADC0808选择的输入通道。开始之后,进行通道选择,一个按键使通道加1,一个减1,从而选择输入,影响输出。按键按下之后,重新进行AD转换,重新显示电压值与通道。
图4.3 按键程序流程图

其中按键子程序的C语言代码如下:
void xuan( uint a)
{
  if(a==0)
  {
  P37=0;P36=0;P35=0;
  }
  if(a==4)
  {
  P37=0;P36=0;P35=1;
  }
   if(a==2)
  {
  P37=0;P36=1;P35=0;
  }
   if(a==6)
  {
  P37=0;P36=1;P35=1;
  }
   if(a==1)
  {
  P37=1;P36=0;P35=0;
  }
   if(a==5)
  {
  P37=1;P36=0;P35=1;
  }
   if(a==3)
  {
  P37=1;P36=1;P35=0;
  }
   if(a==7)
  {
  P37=1;P36=1;P35=1;
  }
}
              if( KEY2==0)
    {               
                    b--;
                              delay();
                              xuan(b);
                              delay();                                         
                              if(b==0)
                                          b=7;            
              }              
              if( KEY1==0)
    {               
                    b++;delay( );
                                xuan(b);
                              if(b==7)
                                          b=0;               
              }              



第5章 系统仿真与调试
使用Proteus绘制原理图,然后将Keil生成的hex程序文件载入到单片机中,点击运行:
按下按键,选择IN5即通道5时,仿真与如图5.1所示。

图5.1 通道5仿真图
如图所示,通过按键选择通道五实现显示单路电压,数码管显示数字5。测量电压为2.038V,实际电压为2.03V,误差小于0.01,满足设计要求。
为确定结果的准确性,需要多次测量对比。

按下按键,选择IN7即通道7时,仿真与如图5.2所示。
图5.2 通道7仿真图
如图所示,测量电压为0.919V,实际电压为0.92V,误差小于0.01,满足设计要求,且可通过按键选择通道七实现显示单路电压,数码管显示数字7。
仿真结果分析:输入的电压从0~5V变化时,数字电压表能够测量出并利用数码管显示出来。测量的精度与要求的一致,前两位精确,百分位不作精确。要更精确,只需修改相应的源程序代码即可。
第6章 总结
本系统由单片机系统、A/D转化电路、LCD显示和按键系统组成。数字电压表能完成测量0~5V的8路输入电压值并且通过按键控制可以使LED数码管单路选择显示电压值的功能。本系统利用单片机控制,LCD显示,按键配合,系统成本低廉,功能强大实用。
本文设计的基于AT89C51的数字电压表具有简单的软硬件设计电路、低廉的开发成本、简便的操作方法,在实际应用工作应能好,测量电压准确,精度高。并通过Proteus仿真实现了预期的功能,实现八路输入电压单路选择输入显示电路电压值,且可以满足现在的误差要求最小分辨率为0.01V,测量误差约为±0.01V。。
但是设计数字电压表需要结合实际综合考虑很多因素,因此该数字电压表设计需要在实际中进一步完善和改进。 要想在现实生活中推广,还必须针对实际应用场合的需要,进一步完善系统功能的程序具有一定的推广价值。
                                          



附录I:整体电路原理图
附录II:元器件清单
序号
标号
元器件名称
元器件参数
1
U1
单片机
AT89C51
2
U2
A/D转化器
ADC0808
3
RV0-RV7
滑动变阻器
1K
4
R1-R10
电阻
10K
5
LED1
四位数码管
7SEG-MPX4-CC
6
LED2
一位数码管
7SEG-BCD
7
C1、C2
电容
33pF
8
C3
电容
1uF
9
KEY1-KEY3
按键
6*6*5


以上文档下载(word格式 可编辑):
数字电压表的设计.doc (736.36 KB, 下载次数: 157)




分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏13 分享淘帖 顶3 踩
回复

使用道具 举报

沙发
ID:142559 发表于 2017-7-25 20:46 | 只看该作者
没程序吧!
回复

使用道具 举报

板凳
ID:142559 发表于 2017-7-25 20:47 | 只看该作者
没有程序吗?
回复

使用道具 举报

地板
ID:438003 发表于 2018-12-3 17:08 来自手机 | 只看该作者
找了好久,感谢分享
回复

使用道具 举报

5#
ID:439838 发表于 2018-12-5 11:07 | 只看该作者
谢谢分享.
回复

使用道具 举报

6#
ID:542201 发表于 2020-6-12 15:53 | 只看该作者
感谢分享
回复

使用道具 举报

7#
ID:794233 发表于 2020-7-7 20:38 | 只看该作者
文件里面什么都没有
回复

使用道具 举报

8#
ID:234560 发表于 2020-7-10 16:40 | 只看该作者
有个问题:
既然是电压表,那被测电压就有超出预期的可能,不做过压保护OVP,不是容易烧掉?
回复

使用道具 举报

9#
ID:65956 发表于 2021-11-25 08:28 | 只看该作者
8位ADC测电压是不可能作到分辨率0.01V的,5/256你算算分辨率是多少
回复

使用道具 举报

10#
ID:72088 发表于 2021-11-25 10:47 | 只看该作者
aking991 发表于 2021-11-25 08:28
8位ADC测电压是不可能作到分辨率0.01V的,5/256你算算分辨率是多少

对,12位的ADC才能做到完整的0.001V分辨率,他这个只能做到0.05
回复

使用道具 举报

11#
ID:937525 发表于 2021-11-27 15:43 | 只看该作者
感谢分享!想求一下程序和仿真QAQ
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表