《基于单片机的数字电压表设计.doc》由会员分享,可在线阅读,更多相关《基于单片机的数字电压表设计.doc(16页珍藏版)》请在金锄头文库上搜索。
1、引言数字电压表(Digital Voltmeter)简称DVM,它是采用数字化测量技术,把连续的模拟量(直流输入电压)转换成不连续、离散的数字形式并加以显示的仪表。传统的指针式电压表功能单一、精度低,不能满足数字化时代的需求,采用单片机的数字电压表,由精度高、抗干扰能力强,可扩展性强、集成方便。目前,由各种单片A/D 转换器构成的数字电压表,已被广泛用于电子及电工测量、工业自动化仪表、自动测试系统等智能化测量领域,示出强大的生命力。与此同时,由DVM扩展而成的各种通用及专用数字仪器仪表,也把电量及非电量测量技术提高到崭新水平。本论文重点介绍单片A/D 转换器以及由它们构成的基于单片机的数字电压
2、表的工作原理。1 实训要求 (1)基本要求: 实现8路直流电压检测 测量电压范围0-5V 显示指定电压通道和电压值 用按键切换显示通道 (2)发挥要求 测量电压范围为0-25V 循环显示8路电压2 实训目的 (1) 进一步熟悉和掌握单片机的结构和工作原理; (2) 掌握单片机的借口技术及,ADC0809芯片的特性,控制方法; (3) 通过这次实训设计,掌握以单片机为核心的电路设计的基本方法和技术; (4) 通过实际程序设计和调试,逐步掌握模块化程序设计的方法和调试技术。3 实训意义 通过完成一个包括电路设计和程序开发的完整过程,使自身了解开发单片机应用系统的全过程,强化巩固所学知识,为以后的学
3、习和工作打下基础。4 总体实训方案 测量一个05V的直流电压,通过输入电路把信号送给AD0809,转换为数字信号再送至89s52单片机,通过其P1口经数码管显示出测量值。4.1 结构框图 如图11所示 图114.2 原理及功能8路数字电压表主要利用A/D转换器,其过程为如下:先用A/D转换器对各路电压值进行采样,得到相应的数字量,再按数字量与模拟量成比例关系运算得到相应的模拟电压值,然后把模拟值通过数码管显示出来。设计时假设待测的输入电压为8路,电压值的范围为05v,要求能在4位LED数码上轮流显示或单路显示。测量的最小分辨率为0.019v。根据系统的功能要求,控制系统采用AT89s51单片机
4、,A/D转换器。当输入电压为5V时,输出的数据值为255(0FFH),因此最大分辨率为0.0196V(5/255)。ADC0809具有8路模拟量输入端口,通过3位地址输入端能从8路中选择一路进行转换。如每隔一段时间依次轮流改变3位地址输入端的地址,就能依次对8路输入电压进行测量。LED数码管显示采用软件译码动态显示。通过按键选择可8路循环显示,也可以单路循环。单路显示可通过按键选择所要显示的通道数。5 硬件电路设计8路数字电压表应用系统硬件电路由单片机、A/D转换器、数码管显示电路和按键处理电路等组成,电路原理图如图12所示。图12ADC0809具有8路模拟量输入通道IN0-IN7,通过3位地
5、址输入端C、B、A(引脚23-25)进行选择。引脚22为地址锁存控制端ALE,当输入为高电平时,C、B、A引脚输入的地址锁存于ADC0809内部是锁存器中,经内部译码电路译码选中相应的模拟通道。引脚6为启动转换控制端START,当输入一个2s宽的高电平脉冲时,就启动ADC0809开始对输入通道的模拟量进行转换。引脚7为A/D转换器,当开始转换时,EOC信号为低电平,经过一段时间,转换结束,转换结束信号EOC输出高电平,转换结果存放于ADC0809内部的输出数据寄存器中。引脚9脚为A/D转换数据输出允许控制端OE,当OE为高电平时,存放于输出数据锁存器中的数据通过ADC0809的数据线D0D7输
6、出。引脚10为ADC0809的时钟信号输入端CLOCK。在连接时,ADC0809的数据线D0D7与AT89S52的P0口相连接,ADC0809的地址引脚、地址锁存端ALE、启动信号START、数据输出允许控制端OE分别与AT89S52的P2口相连接,转换结束信号EOC与AT89S52的P3.7相连接。时钟信号输入端CLOCK信号,由单片机的地址锁存信号ALE得到。LED数码管采用动态扫描方式连接,通过AT89S52的P1口和P3.0P3.3口控制。P1口为LED数码管的字段码输出端,P3.0P3.3口为LED数码管的位选码输出端,通过三极管驱动并反相。S1和S2是两个按键开关,分别与单片机的P
7、3.5和P3.6相连接。S1用于单路显示或多路循环显示转换控制,S2用于单路显示时的通道选择。6 系统软件程序的设计多路数字电压表的系统软件程序由主程序、A/D转换子程序和显示子程序组成。6.1 主程序主程序包含初始化部分、调用A/D转换子程序和调用显示程序,如图13所示。初始化部分包含存放通道数据缓冲区初始化和显示缓冲区初始化。另外,对于单路显示和循环显示,系统设置了一个标志位00H控制。初始化时00H位设置为0,默认为循环显示,当它为1时改变为单路显示。00H位通过单路/循环按键控制。6.2 A/D转换子程序A/D转换子程序用于对ADC0809的8路输入模拟电压进行A/D转换,并将转换的数
8、值存入8个相应的存储单元中,如图14所示。A/D转换子程序每隔一定时间调用一次,即隔一段时间对输入电压采样一次。6.3 显示子程序LED数码管采用软件译码动态扫描方式。在显示子程序中包含多路循环显示和单路显示程序。多路循环显示把8个存储单元的数值依次取出送到4位数码管上显示,每一路显示1秒。单路显示程序只对当前选中的一路数据进行显示。每路数据显示需经过转换变成十进制BCD码,放于4个数码管的显示缓冲区中。单路显示或多路循环显示通过标志位00H控制。在显示控制程序中加入了对单路或多路循环按键和通道选择按键的判断。 图13图146.3.1 C语言源程序清单#include #include #in
9、clude /调用_nop_()延时函数#define ad_con P2 /0809控制口#define addata P0 /0809数据入口#define disdata P1 /数码管显示#define uchar unsigned char#define uint unsigned intuchar number=0x00; /存放单通道显示时的当前通道数sbit ALE=P23; /0809地址锁存信号sbit START=P24; /启动信号sbit OE=P25; /输出允许通道sbit KEY1=P35; /循环或单路选择按键sbit KEY2=P36; /通道选择按键sbi
10、t EOC=P37; /转换结束信号sbit DISX=disdata7;/小数点位sbit FLAG=PSW0; /循环或单路显示标志位Uchar code dis_711=0x3F,0x06,0x5B,0X4F,0x66,0x6D,0x7D,0x07,0x7E,0x6F,0x00;/数码管的字段码uchar code scan_con4=0xF1,0xF2,0xF4,0xF8;/4个LED数码管的位选Uchar data ad_data8=0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;/0809的8个通道转换数据缓冲区uchar data dis5=0x0
11、0,0x00,0x00,0x00,0x00;/显示缓冲区/*主函数*/ main() P0=0xff; /初始化端口 P2=0x00; P1=0xff; P3=0xff; while(1) test();/测量转换数据 scan();/显示数据 /*1秒延时*/delay1ms(uint t)uint i,j;for (i=0;it;i+)for (j=0;j120;j+);/*检测按键子程序*/keytest()if (KEY1=0) /检测循环或单路选择按键是否按下FLAG=!FLAG; /标志位取反,循环,单路显示却换 while(KEY1=0);if(FLAG=1) /单路循环时,检测
12、通道选择按键是否按下if(KEY2=0) number+; if(number=8) number=0; while(KEY2=0); /*显示扫描子程序*/ scan() uchar k,n; int h; if(FLAG=0) /循环显示子程序 dis3=0x00; /通道值清零 for(n=0;n8;n+) /循环8次 dis2=ad_datan/51; /转换为BCD码 dis4=ad_datan%51; dis4=dis4*10; dis1=dis4/51; dis4=dis4%51; dis4=dis4*10; dis0=dis4/51; for(h=0;h500;h+) /每个通
13、道显示时间控制为1s for(k=0;k4;k+) /4位LED循环显示 disdata=dis_7disk; if(k=2) DISX=0; P3=scan_conk; delay1ms(1); P3=0xff; dis3+; /通道值加1 keytest(); /检测按键 if(FLAG=1) /单路显示子程序 dis3=number; for(k=0;k4;k+)/4位LED扫描显示 disdata=dis_7disk; if(k=2) DISX=0; P3=scan_conk; delay1ms(1);P3=0xff; keytest(); /检测按键 /*转换子函数*/test() uchar m; uchar s=0x00; /初始通道位0 ad_con=s;/第一通道地址送0809控制口 for(m=0;m8;m+) ALE=1;_nop_();_nop_();ALE=0;/锁存