基于单片机的数字电压表设计(共15页).doc
精选优质文档-倾情为你奉上引言数字电压表(Digital Voltmeter)简称DVM,它是采用数字化测量技术,把连续的模拟量(直流输入电压)转换成不连续、离散的数字形式并加以显示的仪表。传统的指针式电压表功能单一、精度低,不能满足数字化时代的需求,采用单片机的数字电压表,由精度高、抗干扰能力强,可扩展性强、集成方便。目前,由各种单片A/D 转换器构成的数字电压表,已被广泛用于电子及电工测量、工业自动化仪表、自动测试系统等智能化测量领域,示出强大的生命力。与此同时,由DVM扩展而成的各种通用及专用数字仪器仪表,也把电量及非电量测量技术提高到崭新水平。本论文重点介绍单片A/D 转换器以及由它们构成的基于单片机的数字电压表的工作原理。1 实训要求 (1)基本要求: 实现8路直流电压检测 测量电压范围0-5V 显示指定电压通道和电压值 用按键切换显示通道 (2)发挥要求 测量电压范围为0-25V 循环显示8路电压2 实训目的 (1) 进一步熟悉和掌握单片机的结构和工作原理; (2) 掌握单片机的借口技术及,ADC0809芯片的特性,控制方法; (3) 通过这次实训设计,掌握以单片机为核心的电路设计的基本方法和技术; (4) 通过实际程序设计和调试,逐步掌握模块化程序设计的方法和调试技术。3 实训意义 通过完成一个包括电路设计和程序开发的完整过程,使自身了解开发单片机应用系统的全过程,强化巩固所学知识,为以后的学习和工作打下基础。4 总体实训方案 测量一个05V的直流电压,通过输入电路把信号送给AD0809,转换为数字信号再送至89s52单片机,通过其P1口经数码管显示出测量值。4.1 结构框图 如图11所示 图114.2 原理及功能8路数字电压表主要利用A/D转换器,其过程为如下:先用A/D转换器对各路电压值进行采样,得到相应的数字量,再按数字量与模拟量成比例关系运算得到相应的模拟电压值,然后把模拟值通过数码管显示出来。设计时假设待测的输入电压为8路,电压值的范围为05v,要求能在4位LED数码上轮流显示或单路显示。测量的最小分辨率为0.019v。根据系统的功能要求,控制系统采用AT89s51单片机,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位地址输入端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输出。引脚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是两个按键开关,分别与单片机的P3.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个相应的存储单元中,如图14所示。A/D转换子程序每隔一定时间调用一次,即隔一段时间对输入电压采样一次。6.3 显示子程序LED数码管采用软件译码动态扫描方式。在显示子程序中包含多路循环显示和单路显示程序。多路循环显示把8个存储单元的数值依次取出送到4位数码管上显示,每一路显示1秒。单路显示程序只对当前选中的一路数据进行显示。每路数据显示需经过转换变成十进制BCD码,放于4个数码管的显示缓冲区中。单路显示或多路循环显示通过标志位00H控制。在显示控制程序中加入了对单路或多路循环按键和通道选择按键的判断。 图13图146.3.1 C语言源程序清单#include <stdio.h>#include <AT89x52.h>#include <intrins.h> /调用_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; /通道选择按键sbit 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=0x00,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;i<t;i+)for (j=0;j<120;j+);/*检测按键子程序*/keytest()if (KEY1=0) /检测循环或单路选择按键是否按下FLAG=!FLAG; /标志位取反,循环,单路显示却换 while(KEY1=0);if(FLAG=1) /单路循环时,检测通道选择按键是否按下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;n<8;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;h<500;h+) /每个通道显示时间控制为1s for(k=0;k<4;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;k<4;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;m<8;m+) ALE=1;_nop_();_nop_();ALE=0;/锁存通道地址 START=1;_nop_();_nop_();START=0;/启动转换 _nop_();_nop_();_nop_();_nop_(); while(EOC=0);/等待转换结束 OE=1;ad_datam=addata;OE=0;/读取当前通道转换数据 s+;ad_con=s;/改变通道地址 ad_con=0x00;/通道地址恢复初值 7 单片机概述AT89S52是一种低功耗、高性能CMOS8位微控制器,具有 8K在系统可编程Flash存储器。使用Atmel公司高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容。AT89S52具有以下标准功能: 8k字节Flash,256字节RAM, 32位I/O 口线,2个数据指针,三个16位定时器/计数器,5个中断优先级2层中断嵌套中断,全双工串行口, 片内晶振及时钟电路。另外,AT89S52可降至0Hz静态逻辑操作,支持2种软件,可选择节电模式。空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。7.1 单片机引脚结构及说明 如图1-5所示图1-5VCC:供电电压。GND:接地。P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P1口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为第八位地址接收。 P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。P3口也可作为AT89C51的一些特殊功能口,如下所示:P3.0 RXD(串行输入口)P3.1 TXD(串行输出口)P3.2 /INT0(外部中断0)P3.3 /INT1(外部中断1)P3.4 T0(记时器0外部输入)P3.5 T1(记时器1外部输入)P3.6 /WR(外部数据存储器写选通)P3.7 /RD(外部数据存储器读选通)P3口同时为闪烁编程和编程校验接收一些控制信号。RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时,ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。EA/VPP:当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。注意加密方式1时,EA将内部锁定为RESET;当EA端保持高电平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源。XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。 XTAL2:来自反向振荡器的输出。 7.1.1 振荡器特性 XTAL1和XTAL2分别为反向放大器的输入和输出。该反向放大器可以配置为片内振荡器。石晶振荡和陶瓷振荡均可采用。如采用外部时钟源驱动器件,XTAL2应不接。有余输入至内部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平要求的宽度。 8 8位A/D转换器芯片ADC0809ADC0809是带有8位A/D转换器、8路多路开关以及微处理机兼容的控制逻辑的CMOS组件。它是逐次逼近式A/D转换器,可以和单片机直接接口。8.1 ADC0809的主要特性 (1) 它是具有8路模拟量输入、8位数字量输出功能的A/D转换器。 (2) 转换时间为100s。 (3) 模拟输入电压范围为0V+5V,不需零点和满刻度校准。 (4)低功耗,约15mW。8.1.1 ADC0809的内部逻辑结构 图16所示 图16由上图可知,ADC0809由一个8路模拟开关、一个地址锁存与译码器、一个A/D转换器和一个三态输出锁存器组成。多路开关可选通8个模拟通道,允许8路模拟量分时输入,共用A/D转换器进行转换。三态输出锁器用于锁存A/D转换完的数字量,当OE端为高电平时,才可以从三态输出锁存器取走转换完的数据。8.1.2 引脚结构 图17所示 图178.1.2.1 ADC0809主要信号引脚的功能如下:IN0IN7:8条模拟量输入通道ALE地址锁存允许信号。对应ALE上跳沿,A、B、C地址状态送入地址锁存器中。START转换启动信号。START上升沿时,复位ADC0809;START下降沿时启动芯片,开始进行A/D转换;在A/D转换期间,START应保持 低电平。本信号有时简写为ST.A、B、C地址线。 通道端口选择线,A为低地址,C为高地址,引脚图中为ADDA,ADDB和ADDC。其地址状态与通道对应关系见表9-1。CLK时钟信号。ADC0809的内部没有时钟电路,所需时钟信号由外界提供,因此有时钟信号引脚。通常使用频率为500KHz的时钟信号EOC转换结束信号。EOC=0,正在进行转换;EOC=1,转换结束。使用中该状态信号即可作为查询的状态标志,又可作为中断请求信号使用。D7D0数据输出线。为三态缓冲输出形式,可以和单片机的数据线直接相连。D0为最低位,D7为最高OE输出允许信号。用于控制三态输出锁存器向单片机输出转换得到的数据。OE=0,输出数据线呈高阻;OE=1,输出转换得到的数据。Vcc +5V电源。Vref参考电源参考电压用来与输入的模拟信号进行比较,作为逐次逼近的基准。其典型值为+5V(Vref(+)=+5V, Vref(-)=-5V).8.1.2.2 ADC0809对输入模拟量要求信号单极性,电压范围是05V,若信号太小,必须进行放大;输入的模拟量在转换过程中应该保持不变,如若模拟量变化太快,则需在输入前增加采样保持电路。地址输入和控制线:4条。数字量输出及控制线:11条ALE为地址锁存允许输入线,高电平有效。当ALE线为高电平时,地址锁存与译码器将A,B,C三条地址线的地址信号进行锁存,经译码后被选中的通道的模拟量进转换器进行转换。A,B和C为地址输入线,用于选通IN0IN7上的一路模拟量输入。通道选择表如下表所示。CBA选择的通道000IN1001IN2010IN3011IN4100IN5101IN6110IN7111IN8 ST为转换启动信号。当ST上跳沿时,所有内部寄存器清零;下跳沿时,开始进行A/D转换;在转换期间,ST应保持低电平。EOC为转换结束信号。当EOC为高电平时,表明转换结束;否则,表明正在进行A/D转换。OE为输出允许信号,用于控制三条输出锁存器向单片机输出转换得到的数据。OE1,输出转换得到的数据;OE0,输出数据线呈高阻状态。D7D0为数字量输出线。CLK为时钟输入信号线。因ADC0809的内部没有时钟电路,所需时钟信号必须由外界提供,通常使用频率为500KHZ,VREF(),VREF()为参考电压输入。8.2 ADC0809的工作过程 (1) 首先确定ADDA、ADDB、ADDC三位地址,决定选择哪一路模拟信号; (2) 使ALE端接受一正脉冲信号,使该路模拟信号经选择开关到达比较器的输入端; (3) 使START接受一正脉冲信号,START的上升沿将逐次逼近寄存器复位,下降沿启动A/D转换; (4) EOC输出信号变低,指示转换正在进行。 (5) A/D转换结束,EOC变为高电平,指示A/D转换结束。此时,数据已保存到8位三态输出锁存器中。此时CPU就可以通过使OE信号为高电平,打开ADC0809三态输出,由ADC0809输出的数字量传送到CPU。8.3 ADC0809应用说明(1) ADC0809内部带有输出锁存器,可以与AT89S51单片机直接相连。(2) 初始化时,使ST和OE信号全为低电平。(3) 送要转换的哪一通道的地址到A,B,C端口上。(4) 是否转换完毕,根据EOC信号来判断。(5) 当EOC变为高电平时,这时给OE为高电平,转换的数据就输出给单片机了。 结论 本实训基于单片机AT89S52采用8位逐次逼近式A/D转换器ADC0809设计的电压检测装置。用单片机进行数据控制、处理,送到显示器显示,硬件结构简单,所用元件较少,大大降低了制作成本。软件采用C语言实现,程序简单可读写性强,效率高。与传统的电路相比,具有方便操作、处理速度快、稳定性高、性价比高的优点,具有一定的使用价值。本设计所测的电源范围为05V,如果想改装大量程范围,可在其输入电路中添加乘法器使大电压降低至可控的范围。本系统以80C51为核心部件,利用软件编程,实现了对直流电压值的测量。尽量做到线路简单,减小电磁干扰,充分利用软件编程,弥补元器件的精度不足。由于水平有限,我们认为系统还有需要改进的地方。今后的学习中还需要继续努力,深入的学习和思考问题。参考文献1胡辉主编单片机原理及应用设计北京:中国水利水电出版社,2005,1284页2谭浩强著C语言程序设计(第三版)北京:清华大学出版社,2005.7,37152页3 张桂红主编单片机原理与应用福州:福建科学技术出版社,2007.2,306315页4 韩志军等编著单片机应用系统设计:入门向导与设计实例北京:机械工业出版社,20051,132147页专心-专注-专业