简易数字电压表的设计摘要:随着电子技术的发展,电子测量已成为广大电子工作者必须掌握的手段,测量的精度和功能的要求也越来越高,电压的测量则尤为突出,最为普遍。本设计利用单片机技术结合A/D转换芯片ADC0804构建了一个直流数字电压表。本文首先简要介绍了设计电压表的主要方式以及单片机系统的优势,然后详细介绍了直流数字电压表的设计流程,以及硬件系统和软件系统的设计,并给出了硬件电路的设计细节,包括各部分电路的走向,芯片的选择以及方案的可行性分析等关键词:单片机(MCU);电压表;A/D转换引言:在电量的测量中,电压,电流和频率是最基本的三个被测量,其中电压量的测量最为常见。而且随着电子技术的发展,更是经常要测量高精度的电压,所以数字电压表就成为一种必不可少的测量仪器。数字电压表DigitalVoltmeter简称DVM,它是采用数字化测量技术,把连续的模拟量(直流或交流输入电压)转换成不连续,离散的数字形式并加以显示的仪表。由于数字式仪器具有读数准确方便,精度高,误差小,灵敏度高和分辨率高,测量速度快等特点而倍受青睐,数字式电压表就是基于这种需求而发展起来的,是一种必不可少的电子测量仪表。本设计从各个角度分析了由单片机组成的数字电压表的设计过程及各部分电路的组成及原理,并且分析了程序如何驱动单片机进而使系统运行起来的原理及方法,如图1-1。图1-1系统框图本设计主要分为两部分:硬件电路和软件程序。而硬件电路又大体可分为单片机小系统电路,输入电路,A/D转换电路,LCD显示电路,各部分电路的设计及原理将在硬件电路设计部分详细介绍;程序的设计使用C语言编程,利用软件对其编译和仿真,详细的设计算法将会在程序设计部分详细介绍。一、方案设计与论证1.单片机系统模块方案在本设计中涉及到一个关键系统模块——单片机系统模块,而目前单片机的种类繁多,主要有主流的8位单片机和高性能的32位单片机,结合本设计各方面因素,8位单片机对于本设计已经是绰绰有余了,单片机是指一个集成在一块芯片上的完整计算机系统具有一个完整计算机所需要的大部分部件:CPU,内存,总线系统等。而目前常用的8位单片机有51单片机系统模块液晶显示模块A/D转换模块输入电路模块系列单片机,AVR单片机,PIC单片机。应用最广的还是intel的51系列单片机。系列单片机的特点是:51硬件结构合理,指令系统规范,加之生产历史悠久,世界上有许多芯片公司都买了51的芯片核心专利技术,并在其基础上扩充其性能,使得芯片的运行速度变得更快,性价比更高。AVR单片机是atmel公司推出较新的单片机,特点是:高性能,低功能,高速度,指令单周期为主,但性价方面比51单片机要高。有专门的I/O方向寄存器。虽然有较强的驱动电压,但I/O口使用不比51单片机方便。PIC单片机系统是美国微芯公司的产品,也是市面上增长最快的单片机之一属精简指令集单片机,特点是:高速度,高性能,但在性价方面比51单片机要高,也专门的I/O方向寄存器,I/O口使用不比51单片机方便。综上所述,本设计将选用51系列单片机。对本设计而言,采用8位51系列单片机STC89C51,STC89C51系列单片机是宏晶科技推出的新一代超强抗干扰/高速/低功耗的单片机,是MCS-51系列单片机的派生产品;它们在指令系统中、硬件系统和片内资源与标准的8052单片机完全兼容,DIP-40封装系列与8051为pin-to-pin兼容,指令代码是与8051完全兼容的单片机。STC89C51单片机具有增强型12时钟/机器周期、6时钟机器/周期任意选择,工作电压为5.5V-3.4V(5V单片机)/3.8V-2.0V(5V单片机);工作频率范围:0-40MHZ,相当于普通8051的0-80MHZ。实际频率可达48MHZ。用户应用程序空间为4K/8K/13K/16K/20K/32K/64K字节;片上集成1280字节/512字节RAM;有32/36个通用I/O口,P1/P2/P3/P4是准双向口;集成ISP(在系统可编程)/IPA(在应用可编程),无需专用的编程器/仿真器,可通过串行口(P3.0/P3.1)直接下载用户程序,8K程序3秒就可以完成一片,具备EEPROM功能,工作温度范围在0-750,共有3个16位定时器/计数器,其中定时器T0还可以当成2个8位定时器使用。2.A/D转换器选择方案在设计中,要求精度小于1,不是很高,而ADC0804价格低廉,能满足我们的需要,所以选择它。ADC0804是一个八位,单通道,低价格的A/D转换器,主要特点是:模数转换时间大约100微秒,方便的TTL或CMOS标准接口;可以满足差分电压输入;具有参考电压输入端;内含时钟发生器;单电源工作时(0V-5V)输入信号电压范围是0V-5V,不需要调零等等。所以选择了它。3.显示器选择方案在本设计中要求显示最后电压的数字值和电压的单位,数码管只能显示0—9的数据,不能够显示字符;LED点阵是由好多个发光二极管组成的,可以显示数字,中英文字符,但用LED点阵显示的软件程序设计比较麻烦;1602液晶能够同时显示162即32个字符。且其内部的字符发生存储器已经存储了160个不同的点阵字符图形,包括阿拉伯数字,英文字母的大小写,常用的符号和日文假名等,每一个均有一个固定的代码。使用时直接编写程序按一定的时序即可。它的特点是显示字迹清楚,价格相对便宜。因此,在本设计中选用1602。二、原理分析与硬件电路图1.单片机小系统:CPU部分:采用STC89C51芯片,封装DIP-40。40个引脚,用四是个排针引出,40脚接VCC,20脚接GND,VCC与GND之间用一个小电容耦合。P0,P1,P2,P3作I/O接口。9接RES。18,19接晶振。31接EA。2.数模(A/D)芯片ADC0804ADC0804芯片的封装引脚图及说明。/CS芯片选择信号,低电平有效/RD外部读取转换结果的控制输出信号。/RD为高电平时,DB0—DB7处理高阻抗,/RD为低电平时,数字数据才会输出。/WR用来启动转换的控制输入,相当于ADC的转换开始,当/WR为从高电平变为低电平时,转换器被清除;当/WR回到高电平时,转换正式开始。CS、RD、WR,是数字控制的输入端,满足TTL逻辑电平。其中CS和WR用来控制A/D,转换的启动信号。CS、RD用来读取A/D转换的结果,当它们同时为低电平时,输出二进制数据。芯片参数:工作电压:+5V,即VCC=+5V。模拟输入电压范围:0~+5V,即0≤Vin≤+5V。分辨率:8位,即分辨率为1/2=1/256,转换值介于0~255之间。转换时间:100us(fCK=640KHz时)。转换误差:±1LSB。参考电压:2.5V,即Vref=2.5V。ADC0804的转换原理:ADC0804是属于连续渐进式(SuccessiveApproximationMethod)的A/D转换器,这类型的A/D转换器除了转换速度快(几十至几百us)、分辨率高外,还有价钱便宜的优点,普遍被应用于微电脑的接口设计上。ADC0804与CPLD的链接图:各个管脚的作用:D0-D7:八位数字量输出端;CLK:为芯片工作提供工作脉冲,时钟电路如图所示,时钟频率计算方式是:fCK=1/(1.1×R×C)CS:片选信号;WR:写信号输入端;RD:读信号输入端;INTR:转换完毕中断提供端;3.A/D转换芯片与单片机的连接连接原理图如下:4.液晶与单片机连接1602引脚如下图1所示,各引脚功能见表1,主要引脚功能如下:V0:液晶显示器对比度调整端,接正电源时对比度最弱;接地电源时对比度最高。RS:寄存器选择,高电平时选择数据寄存器;低电平时选择指令寄存器,R/W:读写信号线,高电平时进行读操作;低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令或者显示地址;当RS为高电平、R/W为低电平时可以写入数据。E:使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。LCDI602有11个控制指令,其功能见表2。LCD1602的典型电路连接如图2所示:三、测试方法与测试结果1、测试仪器:恒压源、自制数字电压表2、测试方法:将程序导入后,为简易的电压表提供稳压直流电,分别测试电压显示比较其是否在误差范围内与给定值接近。3、测试结果如下表:给定电压1.01.52.02.53.03.54.04.5时测电压1.051.562.122.593.063.654.164.6绝对误差0.050.060.120.090.060.150.160.1四、结论通过本次专业技能大赛,我们队员深刻的认识到学好专业知识的重要性,加深了对单片机理论的理解,也理解了理论联系实际的含义,并是我们认识到对单片机方面的知识了解太少,对于书本上的很多知识还不能灵活运用,有很多我们需要掌握的知识在等着我们去学习,虽然在本次设计中对于知识的运用和衔接还不够熟练,我们会在以后的学习生活中弥补我们的不足。这个课题虽然看似简单,但是实际上挺难,对我们的实际动手能力是一个相当大的考验,也对我们的程序设计方案提出了很高的要求,这也对我们今后的工作敲响了警钟,掌握基础知识,且不能眼高手低。这次专业技能大赛是对过去所学知识的系统提高和扩充的过程,为今后的发展打下了良好的基础。在大学的课堂的学习知识再给我们灌输专业知识,而我们应该把所学的甬道现实生活中去,此次的简易数字电压表的设计给我们奠定了一个实践基础,我们会在以后的学习生活中磨练自己,更好地处理所遇到的问题,使自己适应与竞争。五、程序#includereg52.h#defineuintunsignedint#defineucharunsignedcharsbitcs=P0^4;sbiten=P0^1;//LCD1602位声明sbitrs=P0^0;sbitwr=P0^2;sbitrd=P0^3;uintrg=0,rg1;ucharcodeaddr_tab[]={//便于根据汉字坐标求出地址0x80+0x00,0x80+0x01,0x80+0x02,0x80+0x03,0x80+0x04,0x80+0x05,0x80+0x06,0x80+0x07,//第一行字位置0x80+0x40,0x80+0x41,0x80+0x42,0x80+0x43,0x80+0x44,0x80+0x45,0x80+0x46,0x80+0x47//第二行字位置};voidwrite_string(ucharx,uchary,uchar*p);voiddelay(uintms)//延时函数{uchari,j;for(j=0;jms;j++)for(i=110;i0;i--);}voidwrite_com(ucharcom)//LCD1602写命令{rs=0;en=0;P1=com;delay(1);en=1;delay(1);en=0;}voidwrite_dat(uchardat)//LCD1602写数据{rs=1;en=0;P1=dat;delay(1);en=1;delay(1);en=0;}voidLcdinit()//LCD1602初始化{en=0;write_com(0x38);//设置16×2显示,8位数据delay(1);write_com(0x01);//显示清屏delay(1);write_com(0x06);//读数时字符后移,屏幕不移动delay(1);write_com(0x0c);//开显示,不显示光标,不闪烁delay(1);write_string(0,0,ElectronicDesign);write_string(1,0,Welcome!!!);delay(100);}voidADCstart(){wr=1;wr=0;wr=1;delay(1);}voidrange();voidmain(){cs=0;Lcdinit();while(1){range();}}voidwrite_string(ucharx,uchary,uchar*p){write_com(addr_tab[8*x+y]);while