第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

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:元器件清单序号标号元器件名称元器件参数

1U1单片机AT89C51

2U2A/D转化器ADC0808

3RV0-RV7滑动变阻器1K

4R1-R10电阻10K

5LED1四位数码管7SEG-MPX4-CC

6LED2一位数码管7SEG-BCD

7C1、C2电容33pF

8C3电容1uF

9KEY1-KEY3按键6*6*5

以上文档下载(word格式 可编辑):

数字电压表的设计.doc

(736.36 KB, 下载次数: 111)

2017-7-1 17:39 上传

点击文件名下载附件

单路电压表c语言编程,单片机数字电压表的设计相关推荐

  1. 单路电压表c语言编程,单片机课程设计(直流数字电压表).pdf

    南京信息工程大学 单片机原理课程设计报告 设计题目: 直流数字电压表设计 专业班级: 测控技术与仪器 学生姓名: 倪阳 肖照飞 学生学号: 20112341905 20112341910 指导老师: ...

  2. 单路电压表c语言编程,用AT89C51单片机制作的数字电压表

    此数字电压表,利用A/D转换原理将被测模拟量转换成数字量,并通过控制系统用数字方式显示测量结果.本设计采用AT89C51单片机,ADC0809进行模/数转换,能够测量8路0-5V的输入电压值,可用四位 ...

  3. c语言delay_利用C语言编程单片机,制作可以根据环境光照调整亮度的智能灯

    上一节,我们利用C语言编程单片机仿制了达文西的"古怪手电筒",达成了"在有光的时候就会亮,在没有光的情况下绝对不会亮!"的目标. 其实在此基础上,C语言还能做些 ...

  4. C语言编程可调电子钟设计,基于ZG211使用C语言编程的电子钟显示设计(最终版)...

    <基于ZG211使用C语言编程的电子钟显示设计.doc>由会员分享,可在线阅读全文,更多相关<基于ZG211使用C语言编程的电子钟显示设计(最终版)>请在www.woc88.c ...

  5. c语言如何在1序号方编程,《基于ZG211使用C语言编程的电子钟显示设计最终版》...

    <基于ZG211使用C语言编程的电子钟显示设计.doc>由会员分享,可免费在线阅读全文,更多与<基于ZG211使用C语言编程的电子钟显示设计(最终版)>相关文档资源请在帮帮文库 ...

  6. 基于51单片机数字电压表的设计 仿真、程序、原理图(转发)

    摘 要 数字电压表简称DVM,数字电压表基本原理是将输入的模拟电压信号转化为数字信号,再进行输出显示.而A/D转换器的作用是将连续变化的模拟信号量转化为离散的数字信号,器基本结构是由采样保持,量化,编 ...

  7. dac梯形波c语言编程,单片机项目第11章单片机与AD接口.ppt-资源下载在线文库www.lddoc.cn...

    单片机项目第11章 单片机与AD接口.ppt 第11章 单片机与AD接口,11.1 项目内容数字电压表的设计 11.2 程序设计 11.3 相关知识,11.1 项目内容数字电压表的设计,11.1.1 ...

  8. 访问外部扩展C语言编程,单片机C语言编程(系统扩展IC)8.ppt

    单片机C语言编程(系统扩展IC)8 第8章 单片机系统扩展 第8章 单片机系统扩展 目 录 8.1 扩展并行三总线 8.2 扩展简单并行输入/输出口 8.3 扩展并行数据存储器 8.4 串行扩展总线接 ...

  9. c语言编程单片机中的sbit,单片机sfr和sbit的用法

    描述 单片机sfr和sbit详解 sfr用于将一个单片机的特殊功能寄存器(special function register)赋值给一个变量,这样在后面的程序中就可以中这个变量指引(refer to) ...

最新文章

  1. Codeforces Round #324 (Div. 2) E. Anton and Ira 贪心
  2. 程承熊LEE微购店的买家秀
  3. 教育部最新通知,中高考又有大变化,学生欲哭无泪,家长炸锅了
  4. DNS实现域名负载均衡
  5. MySQL设计索引的原则
  6. easyexcel获取所有sheet页名称_老板让我汇总多个sheet,我不会,同事却说使用PQ仅需2步搞定...
  7. java date linux,Java中Date,SimpleDateFormat
  8. 什么是高并发,如何避免高并发
  9. 夫妻俩在互联网公司工作,年收入曝光,网友:这么高!
  10. 剑指offer全书题解 (Python)【更新完毕】
  11. java怎样用类模板创建对象_java入门(十四) | 面向对象(OOP)之类和对象
  12. 堆优化的Dijkstra
  13. 田径运动会管理系统之Java
  14. jQuery文档加载完毕的几种写法
  15. 筛选法建立初始堆_MTT法检测细胞增殖
  16. qt引入txt文件_QT 读取txt文件的几种方法
  17. Java基于WEB的商品库存管理系统
  18. 8个免费、高质量PPT素材网站,值得收藏
  19. Windows OCR推荐
  20. matlab aic sic,请教ADF检验时AIC准则和SIC准则不一致时怎么办?

热门文章

  1. 还记得,你发送的第一封电子邮件是什么时候吗?
  2. docker安装orcale-12c
  3. R语言导入数据文件(数据导入、加载、读取)、使用haven包的read_dta函数导入Stata中的dta格式文件
  4. 视频编辑软件:迅捷视频工具箱
  5. Pytorch 创建Tensor
  6. 微信小程序通过百度智能云实现人脸检测
  7. 提高数据处理速度_气相色谱仪用数据处理
  8. idw matlab 程序_matlab小波变换程序
  9. TX2和主机连接的几种方式
  10. 双向循环链表 (C语言实现双向循环链表) ------- 算法笔记003