1、数字电压表单片机设计1 引言数字电压表的基本工作原理是利用A/D转换电路将待测的模拟信号转换成数字信号,通过相应换算后将测试结果以数字形式显示出来的一种电压表。较之于一般的模拟电压表,数字电压表具有精度高、测量准确、读数直观、使用方便等优点。电压表的数字化测量,关键在于如何把随时连续变化的模拟量转化成数字量,完成这种转换的电路叫模数转换器(A/D)。数字电压表的核心部件就是A/D转换器,由于各种不同的A/D转换原理构成了各种不同类型的DVM。一般说来,A/D转换的方式可分为两类:积分式和逐次逼近式。积分式A/D转换器是先用积分器将输入的模拟电压转换成时间或频率,再将其数字化。根据转化的中间量不
2、同,它又分为U-T(电压-时间)式和U-F(电压-频率)式两种。逐次逼近式A/D转换器分为比较式和斜坡电压式,根据不同的工作原理,比较式又分为逐次比较式及零平衡式等。斜坡电压式又分为线性斜坡式和阶梯斜坡式两种。在高精度数字电压表中,常采用由积分式和比较式相结合起来的复合式A/D转换器。本设计以AT89C51单片机为核心,以逐次比较型A/D转换器ADC0808、液晶显示器LCD1602为主体,构造了一款简易的数字电压表,能够测量1路05V直流电压,最小分辨率0.02V。2 仿真软件介绍2.1 仿真软件简介2.1.1 Proteus 6 ProfessionalISIS 6 Professiona
3、软件是它不仅具有其它EDA工具软件的仿真功能,还能仿真单片机及外围器件。它是目前最好的仿真单片机及外围器件的工具。虽然目前国内推广刚起步,但已受到单片机爱好者、从事单片机教学的教师、致力于单片机开发使用的科技工作者的青睐。它从原理图布图、代码调试到单片机和外围电路协同仿真,一键切换到PCB设计,真正实现了从概念到产品的完整设计。是目前将电路仿真软件、PCB设计软件和虚拟模型仿真软件三合一的设计平台,其处理器模型支持8051、HC11、PIC10/12/16/18/24/30/DsPIC33、AVR、ARM、8086和MSP430等,2010年即将增加Cortex和DSP系列处理器,并持续增加其
4、他系列处理器模型。在编译方面,它也支持IAR、Keil和MPLAB等多种编译器。ISIS 6 Professiona软件具有的功能:原理布图;PCB自动或人工布线;SPICE电路仿真。2.1.2 Keil uVision2Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部分组合在一起。Keil C51集成开发环境主要由菜单栏、工具栏、源文件编辑窗口、工程窗口和输出窗口五部分组成。工具栏为一组快捷工具图标,主要包括基本文件工具栏、建造工具栏和调试工具栏,基本文件工具栏包括新建、打开、拷贝、粘贴等基本操作。
5、建造工具栏主要包括文件编译、目标文件编译连接、所有目标文件编译连接、目标选项和一个目标选择窗口。调试工具栏位于最后,主要包括一些仿真调试源程序的基本操作,如单步、复位、全速运行等。在工具栏下面,默认有三个窗口。左边的工程窗口包含一个工程的目标(target)、组(group)和项目文件。右边为源文件编辑窗口,编辑窗口实质上就是一个文件编辑器,我们可以在这里对源文件进行编辑、修改、粘贴等。下边的为输出窗口,源文件编译之后的结果显示在输出窗口中,会出现通过或错误(包括错误类型及行号)的提示。3 硬件设计3.1单片机控制模块设计单片机控制模块的作用是为控制各单元电路的运行并完成数据的换算或处理,主要
6、由单片机、时钟电路、复位电路组成。3.1.1时钟电路单片机工作的时间基准是由时钟电路提供的,在单片机的XTAL1和XYAL2两个管脚接一只晶振及两只电容就构成了单片机的时钟电路,电路中电容器和对振荡频率有微调作用,通常取(3010)pF石英晶体选择6MHz或12MHz都可以。时钟电路如图1所示。 图1 系统时钟电路 图2 系统复位电路3.1.2复位电路单片机的RST管脚为主机提供了一个外部复位信号输入口。复位信号是高电平有效,高电平有效的持续时间为2个机器周期以上。单片机的复位方式可由手动复位方式完成。复位电路如图2所示。3.2逐次逼近式A/D转换模块设计逐次逼近型A/D转换器属于直接型A/D
7、转换器,它能把输入的模拟电压直接转换为输出的数字代码,而不需要经过中间变量。主要由比较器、环形分配器、控制门、寄存器和D/A转换器组成。3.2.1 ADC0808简介1ADC0808引脚功能图3 引脚图IN0IN7:8路模拟量输入。A、B、C:3位地址输入,2个地址输入端的不同组合选择八路模拟量输入。ALE:地址锁存启动信号,在ALE的上升沿,将A、B、C上的通道地址锁存到内部的地址锁存器。D0D7:八位数据输出线,A/D转换结果由这8根线传送给单片机。OE:允许输出信号。当OE=1时,即为高电平,允许输出锁存器输出数据。START:启动信号输入端,START为正脉冲,其上升沿清除ADC080
8、8的内部的各寄存器,其下降沿启动A/D开始转换。EOC:转换完成信号,当EOC上升为高电平时,表明内部A/D转换已完成。2ADC0808内部结构图逐次逼近型A/D转换器ADC0808由八路模拟开关、地址锁存和译码器、比较器、D/A转换器、寄存器、控制电路和三态输出锁存器等组成。其内部结构如图4所示。图4 ADC0808内部结构3.2.2 A/D转换电路设计集成摸数转换芯片ADC0808实现的A/D转换电路如图5所示,被测信号由ADC0808模拟输入端输入,完成A/D转换后送入单片机,经相应处理后送出显示。图5 ADC0808和单片机的连接3.3显示模块设计3.3.1 LCD显示模块LCD显示器
9、分为字段显示和字符显示两种。其中字段显示和LED显示相似,只要送对应的信号到相应的管脚就能显示。字符显示是根据需要显示基本字符。本设计采用的是字符型显示。系统中采用LCD1602作为显示器件输出信息。和传统的LED数码管显示器件相比,液晶显示模块具有体积小、功耗低、显示内容丰富等优点,而且不需要外加驱动电路,现在液晶显示模块已经是单片机使用设计中最常用的显示器件了。LCD1602可以显示2行16个汉字。3.3.2 LCD1602的引脚功能LCD1602模块的引脚如图6所示,其引脚功能如下:RS:数据和指令选择控制端,RS=0命令状态;RS=1数据。R/W:读写控制线,R/W=0写操作;R/W=
10、1读操作。A:背光控制正电源,K:背光控制地。E:数据读写操作控制位,E线向LCD模块发送一个脉冲,LCD模块和单片机间将进行一次数据交换。DB0DB7:数据线,可以用8位连接,也可以只用高4位连接,节约单片机资源。VDD:电源端 ,VEE:亮度控制端(1-5V),VSS:接地端。图6 LCD1602模块3.3.3 LCD1602的显示操作1四种基本操作LCD有四种基本操作,具体如表1所示。表1 LCD和单片机之间有四种基本操作RSR/W操作00写命令操作(初始化,光标定位等)01读状态操作(读忙标志位)10写数据操作(要显示内容)11读数据操作(可以把显示存储区中的数据反读出来)(1)读状态
11、字:执行读状态字操作,如表3-1满足RS=0,R/W=1。根据管脚功能,当为有效电平时,状态命令字可从LCD模块传输到数据总线。同时可以保持一段时间,从而实现读状态字的功能。读状态字流程如图7所示。图7 读入状态字流程图(2)命令字表2所示为命令字,其主要介绍了指令名称、控制信号及控制代码。其指令名称是指要实现的功能;控制代号是采用的十六进制的数值表示的。1)清零操作是指输入某命令字后即能将整个屏幕显示的内容全部清除;2)归home位:将光标送到初始位;其中的号为任意,高低电平均可;3)输入方式:设光标移动方向并指定整体显示,是否移动。I/D=0:减量方式,S=1:移位方式,S=0:不移位;4
12、)显示状态:D指设置整体显示开关;C指设置光标显示开关;B指设置光标的字符闪耀;5)光标画面滚动:R/L指右移或左移;S/C指移动总体或光标;6)功能设置:DL接口数位,L指显示行数,F显示字型;如DL=1:8位=0,4位N=1:2行=0:1行,G=1:510=0:57(点阵);7)CGRAM地址设制:相当于一个数据库,可以在其中选择所需要的符号;8)DDRAM地址设制:显示定位;9)读BF和AC:B为最高位忙的标志,F为标志位;10)写数据:将数据按要求写入到对应的单元;11)读数据:读相应单元内的数据;表2 命令字指令名称控制信号控制代码RSRWD7D6D5D4D3D2D1D0清屏0000
13、000001归HOME位000000001*输入方式设制00000001I/DS显示状态设制0000001DCB无标画面滚动000001S/CRL*功能设置00001DLNF*CGRAM地址设制0001A5A4A3A2A1A0DDRAM地址设制001A6A5A4A3A2A1A0读BF和AC01BFAC6AC5AC4AC3AC2AC1AC0写数据10数 据读数据11数 据(3)写命令字由表2可知当RS=0,R/W=0时,才可以通过单片机或用户指令把数据写到LCD模块,此时就对LCD进行调制。可采用查询方式:先读入状态字,再判断忙标志位,最后写命令字。图8所示为写命令字的流程图。图8 写命令字流程
14、图1)定义光标位置显示数据的某位,就是把显示数据写在相应的DDRAM地址中,DDRAM地址占7位。Set DDRAM address命令如表3所示。光标定位,写入一个显示字符后,DDRAM地址会自动加1或减1,加或减由输入方式设置。表3 Set DDRAM address命令RSR/WDB7DB6DB5DB4DB3DB2DB1DB0001AC6AC5AC4AC3AC2AC1AC0第1行DDRAM地址和第2行DDRAM地址并不连续,如表3-4所示。表4 DDRAM地址row12345141516line180H81H82H83H84H8dH8eH8fHline20c0H0c1H0c2H0c3H0
15、c4H0cdH0ceH0cfH2)LCD初始化从通电开始延时,先经过判忙后再进行功能设置,过一段时间后可以设制显示状态(如设制行、位或阵列)再经过延时清屏后才可以设置输入方式,具体实现过程如图9所示。图9 LCD初始化流程图2LCD显示程序设计LCD显示程序的设计一般先要确定LCD的初始化、光标定位、确定显示字符后,显示流程如图10显示。图10 LCD显示程序流程图4系统软件设计根据需要,可将系统软件按照功能划分为4个模块,分别是主程序模块、A/D转换模块、液晶显示模块、中断服务程序模块(改变显示的小数点位置),各模块的功能关系如图11所示。编写系统软件时,可首先编写各模块的底层驱动程序,而后
16、是系统联机调试,编写上层主程序。图11 系统软件框图4.1主程序设计图12 主程序流程图主程序主要负责初始化工作:设置定时器、寄存器的初值,启动A/D转换,读取转换结果,处理量程转换响应,控制液晶实时显示等,其流程图如图12所示。4.2 A/D转换程序A/D转换程序的功能是采集数据,在整个系统设计中占有很高的地位。当系统设置好后,单片机扫描转换结束管脚P2.6的输入电平状态,当输入为高电平则转换完成,将转换的数值转换并显示输出。若输入为低电平,则继续扫描。程序流程图如图13所示。图13 A/D转换程序流程图程序如下:#define START P3_4 /ATART,ALE接口。0-1-0:启
17、动AD转换。#define EOC P3_3 /转换完毕由0变1.#define OUTPORT P2 /AD转换函数,返回转换结果。unsigned int uiADTransform() unsigned int uiResult; START=1; /启动AD转换。 START=0; while(EOC=0); /等待转换结束。 uiResult=OUTPORT; /出入转换结果。 uiResult=(100*uiResult)/51; /处理运算结果。 return uiResult; 5 系统仿真首先采用Keil Vision编译器进行源程序编译及仿真调试,调试好程序后将目标文件导入
18、Proteus进行软件调试。在Proteus ISIS编辑窗口中单击开始仿真按钮,4位LED数码管显示相应的电压值。调试结果如图14所示。图14 仿真结果图6 结论本设计以AT89C51单片机为控制核心,通过集成摸数转换芯片ADC0808将被测信号转换成数字信号,经单片机内部程序处理后,由液晶显示器LCD1602显示测量结果。仿真测试表明,系统性能良好,测量读数稳定易读、更新速度合理,直流电压测量范围为0.005.00V,最小分辨率为0.02V,满足任务书指标要求。但是,该系统也存在一定程度的不足,例如:1、输入电压易发生干扰不稳定,且驱动能力可能存在不足,需在被测信号的输入端加上一部分驱动电
19、路,比如将量程转换电路改成带放大能力的自动量程转换电路,将幅值较小的信号经适当放大后再测量,可显著提高精度;2、输出量可用平均值算法来改善,使测量准确度更高。3、若能将测量的电压值实时保存,使用时将更方便。4、ADC0808可实现对8个通道的输入信号轮流转换,本设计仅仅使用了其中一个通道,造成了较大的资源浪费。若能对电路稍加改进,实现对多路信号的轮流测量并自动保存相应结果,其使用价值将会更大。参考文献1 徐爱钧.智能化测量控制仪表原理 M.北京:北京航空航天大学出版社,20042 吴金戌,沈庆阳,郭庭吉.8051单片机实践和使用M.北京:清华大学出版社,20023 黄智伟.全国大学生电子设计竞
20、赛训练教程M.北京:电子工业出版社,20044 汪德彪.MCS-51单片机原理及接口技术M. 第1版.北京:电子工业出版社,2003附录源程序: #include includes.h#define TIME0H 0x3C#define TIME0L 0xB0 /全局变量unsigned char uc_Clock=0; /定时器0中断计数bit b_DATransform=0; /把电压显示在LCD上void vShowVoltage(unsigned int uiNumber)unsigned char ucaNumber3,ucCount;if(uiNumber999) uiNumber
21、=999; ucaNumber0=uiNumber/100; /把计算数字的每个位存入数组。 ucaNumber1=(uiNumber-100*(int)ucaNumber0)/10; ucaNumber2=uiNumber-100*(int)ucaNumber0-10*ucaNumber1;for(ucCount=0;ucCount3;ucCount+) vShowOneChar(ucaNumberucCount+48);/从首位到末位逐一输出。 if(ucCount=0) vShowOneChar(.); /*主函数*void main()/ TMOD=0x01; /定时器0,模式1。 T
22、H0=TIME0H; TL0=TIME0L; TR0=1; /启动定时器。 ET0=1; /开定时器中断。 EA=1; /开总中断 vdInitialize(); vWriteCMD(0x84); /写入显示起始地址(第二行第一个位置) vShowChar(Voltage:); vWriteCMD(0xC9); vShowChar(V); while(1) if(b_DATransform=1) b_DATransform=0; vWriteCMD(0xC4); vShowVoltage(uiADTransform(); /void Time0() interrupt 1 if(uc_Cloc
23、k=0) uc_Clock=5; b_DATransform=1; else uc_Clock-; TH0=TIME0H; /恢复定时器0。 TL0=TIME0L;/#include #define START P3_4 /ATART,ALE接口。0-1-0:启动AD转换。#define EOC P3_3 /转换完毕由0变1.#define OUTPORT P2 /AD转换函数,返回转换结果。*/转换结果是3位数,小数点在百位和十位之间*unsigned int uiADTransform() unsigned int uiResult; START=1; /启动AD转换。 START=0;
24、while(EOC=0); /等待转换结束。 uiResult=OUTPORT; /出入转换结果。 uiResult=(100*uiResult)/51; /处理运算结果。 return uiResult;/*驱动程序*/#include SMC1602.h/void vWriteCMD(unsigned char ucCommand) vDelay(); /先延时。 LCDE=1; /然后把改为写入命令状态。 LCDRS=0; LCDRW=0; LCDPORT=ucCommand; /再输出命令。 LCDE=0; /最后执行命令。/void vWriteData(unsigned char
25、ucData) vDelay(); /先延时。 LCDE=1; /然后把改为写入数据状态。 LCDRS=1; LCDRW=0; LCDPORT=ucData; /再输出数据。 LCDE=0; /最后显示数据。void vShowOneChar(unsigned char ucChar) switch(ucChar) case : vWriteData(0x20);break; case !: vWriteData(0x21);break; case : vWriteData(0x22);break; case #: vWriteData(0x23);break; case $: vWriteD
26、ata(0x24);break; case %: vWriteData(0x25);break; case &: vWriteData(0x26);break; case : vWriteData(0x27);break; case (: vWriteData(0x28);break; case ): vWriteData(0x29);break; case *: vWriteData(0x20);break; case +: vWriteData(0x2A);break; case -: vWriteData(0x2D);break; case /: vWriteData(0x2F);bre
27、ak; case =: vWriteData(0x3D);break; case : vWriteData(0x3E);break; case ?: vWriteData(0x3F);break; case .: vWriteData(0x2E);break; case : vWriteData(0x3A);break; case 0: vWriteData(0x30);break; case 1: vWriteData(0x31);break; case 2: vWriteData(0x32);break; case 3: vWriteData(0x33);break; case 4: vWriteData(0x34);break; case 5: vWriteData(0x35);break; case 6: vWriteData(0x36);break; case 7: vWriteData(0x37);break; case 8: vWriteData(0x38);break; case 9: vWriteData(0x39);break; case A: vWriteData(0x41);break; case B: vWriteData(0x42);break; case C: vWr
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1