250 likes | 394 Views
项目 9 数字式电压表的设计. ★ 知识目标 : 1. A/D 转换器相关的基本知识; 2. A/D 转换器与单片机的接口技术。 ★ 能力目标 : 1. 能够正确使用 A/D 转换器; 2. 能够设计单片机与 A/D 转换器的接口并编程控制 A/D 转换器; 3. 会用 Keil C51 软件对源程序进行编译调试及与 Protues 软件联调,实现电路仿真。. 项目 9 数字式电压表的设计. 1. 提出任务 利用单片机和 A/D 转换器设计一个测量系统,可以实现 0 - 5V 的模拟电压,并在数码管上显示出来。.
E N D
项目9 数字式电压表的设计 ★ 知识目标: 1. A/D转换器相关的基本知识; 2. A/D转换器与单片机的接口技术。 ★ 能力目标: 1. 能够正确使用A/D转换器; 2. 能够设计单片机与A/D转换器的接口并编程控制A/D转换器; 3. 会用Keil C51软件对源程序进行编译调试及与Protues软件联调,实现电路仿真。
项目9 数字式电压表的设计 • 1.提出任务 • 利用单片机和A/D转换器设计一个测量系统,可以实现0-5V的模拟电压,并在数码管上显示出来。 电压表应用非常广泛,在电力工业生产中经常要用电压表来检测电 网电压,在仪器、仪表及家用电器的维修中经常要用电压表来检 测电压。以下介绍用AT89S51单片机设计实现这一功能的方法。
项目9 数字式电压表的设计 • (1)硬件电路设计 • 系统要求的是实现模拟电压的测量,并实现数字显示,由于单片机输入量和输出量信号都是数字量,因此需要一种特殊的电路,将模拟量转换为单片机能够识别的数字量。A/D转换器就是用来实现这一过程的电路。 • 根据数字式电压表的实现功能,硬件电路的设计与器件选择,也可从如下4个方面考虑: A/D转换电路、单片机控制器电路、LED显示电路等。这里选择具有内部程序存储器的AT89S51单片机作为控制电路,加上典型的8位并得传输的A/D转换芯片ADC0809作为模/数转换器,硬件电路原理图如图9.1所示。 • 由于ADC0809的时钟最大是1280kHz,而在系统中使用的是12MHz,超出了ADC0809的极限。在程序设计中为了简化电路,使用定时器来完成ADC0809的时钟输入。电路中使用P2.7作为脉冲输入端。
项目9 数字式电压表的设计 • ADC0809芯片的EOC与单片机P2.0连接,START和ALE与单片机P2.6连接,OE与单片机P2.5连接,单片机P0定义为数据读入端口,ADC0809芯片的ADDA、ADDB和ADDC接地。 • 显示使用的是LED数码管,采用动态显示的方式实现电压的显示。P1.0至P1.4接是数码管的位选,P3接的是数码管的段码。 • 基准电电压接的是正电源+5V,RV2分压输出作为输入的测试电压,接入ADC0809芯片的INO通道。 • 仿真试验时可采用A/D转换集成电路ADC0808芯片来进行仿真分析。有些Proteus仿真软件未带A/D转换集成电路ADC0809芯片。
项目9 数字式电压表的设计 图9.1 数字电压表电路图
项目9 数字式电压表的设计 • (2)软件设计思路 • 对于显示采用动态显示。为了使人能够更好地观看显示结果,显示数据的频率不能过快,程序中设定间隔为1S电压转换一次。 • 对于ADC0809数据的是如何读取的呢?主要有以下几个步骤: • (1)初始化时使START和OE信号全为低电平 • (2)将要转换的通道地址送A、B、C端口上,在ALE上加锁存脉冲 • (3)在START端给出一个至少有100ns宽的正脉冲信号 • (4)是否转换完毕根据EOC信号来判断。如果EOC为低电平,表示在转换过程中;如果EOC变为高电平,表示转换完毕。 • (5)使OE为高电平,转换数据就输出给单片机。当数据传送完毕后,将OE置为低电平,使ADC0809输出为高阻状态,让出数据线。
根据程序流程图编写的源程序如下: //文件名dy9-1.c #include<reg51.h> #define uchar unsigned char #include <intrins.h> code uchar TAB[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //定义数码管显示数值 uchar str_TME[4]={0,0,0,0,}; //定义数码管显示初始值 void delay(uchar ms) //定义延迟程序 { uchar i; while(ms--) for(i=0;i<125;i++); } uchar tmel=0; uchar ad_dat; bit sim=1; 项目9 数字式电压表的设计 3. 源程序编写
/***********************计数器中断函数,用于控制电压转*********************/***********************计数器中断函数,用于控制电压转********************* *******************时间间隔,此程序设定间隔为1S电压转换一次***************/ void tme_tr0(void) interrupt 1 { TL0=0xb0; TH0=0x3c; if(++tmel==20) { tmel=0; sim=1; } } /*****************定义数码管显示***************************/ sbit k1=P1^0; sbit k2=P1^1; sbit k3=P1^2; sbit k4=P1^3; void VAL_xs() { P3=(TAB[str_TME[0]])&0x7f; //显示小数点 k1=1; delay(5); 项目9 数字式电压表的设计 3. 源程序编写
k1=0; P3=TAB[str_TME[1]]; k2=1; delay(5); k2=0; P3=TAB[str_TME[2]]; k3=1; delay(5); k3=0; P3=TAB[str_TME[3]]; k4=1; delay(5); k4=0; } /****************************************************************************** AD0809子程序 *******************************************************************************/ sbit st=P2^6; sbit eoc=P2^0; sbit oe=P2^5; sbit adclk=P2^7; void delay_ot() { uchar i; for(i=0;i<100;i++); } 项目9 数字式电压表的设计
void ad_Convert() { st=0; adclk=0; _nop_(); st=1; adclk=1; _nop_(); st=0; adclk=0; while(eoc); _nop_(); _nop_(); while(eoc==0) { adclk=1; delay_ot(); adclk=0; delay_ot(); } P0=0xff; _nop_(); _nop_(); oe=1; _nop_(); _nop_(); _nop_(); ad_dat=P0; oe=0; } 项目9 数字式电压表的设计
void changs() //转换程序 { double sum; uchar val_Integer; //定义整数变量 unsigned int val_Decimal; //定义小数变量 sum=ad_dat*0.0196078; val_Integer=(uchar)sum; val_Decimal=(unsigned int)((sum-val_Integer)*1000); str_TME[3]=val_Decimal%10; str_TME[2]=val_Decimal/10%10; str_TME[1]=val_Decimal/100; str_TME[0]=val_Integer; } 项目9 数字式电压表的设计
/******************************************************************************/****************************************************************************** 主程序 *******************************************************************************/ main() { P1=0xc0; IE=0x82; TMOD=0x01; IP=0x01; TL0=0xb0; TH0=0x3c; TR0=1; while(1) { VAL_xs(); if(sim==1) { ad_Convert(); //电压转换 changs(); //数据转换 sim=0; } } } 项目9 数字式电压表的设计
项目9 数字式电压表的设计 4.程序调试与电路仿真 • 运行C语言编辑软件,在编辑区中输入上面的源程序,并以“dy9-1.c”为文件名存盘。 • 运行Keil C51,然后建立一个“dy9-1.uv2”的工程项目。把源程序文件“dy9-1.c”添加到工程项目中,进行编译,得到目标代码文件“dy9-1.hex”。 • 运行Proteus,在编辑窗口中绘制如图9.1所示的电路图并存盘。然后选中单片机AT89S51,左键点击AT89S51,出现如图9.2所示的对话框,在Program File后面的 “”按钮,找到刚才编译好的“dy9-1.hex”文件,然后点击“OK”就可以进行仿真了。点击模拟调试按钮的运行按钮“”,进入调试状态。
项目9 数字式电压表的设计 图9.2 添加“dy9-1.hex”文件对话框
◇ 知识链接 • 1.A/D转换器概述 • 在实际的测量和控制系统中检测到的常是时间、数值都连续变化的物理量,这种连续变化的物理量称之为模拟量,与此对应的电信号是模拟电信号。模拟量要输入到单片机中进行处理,首先要经过模拟量到数字量的转换,单片机才能接收、处理。实现模/数转换的部件称A/D转换器或ADC。 • 2.A/D转换器的性能指标 • 性能指标是选用ADC芯片型号的依据,也是衡量芯片质量的重要参数,ADC的主要性能指标主要有以下几个: • (1)分辨率 • 表示输出数字量变化一个相邻数码所需输入模拟电压的变化量。定义为满刻度电压与2 n 之比值,其中n为ADC的位数。
◇ 知识链接 • 例如 • A/D转换器AD574A的分辨率为12位,即该转换器的输出数据可以用2 12 个二进制数进行量化,其分辨率为1LSB。用百分数来表示分辨率为: • 1/212 ×100 % = (1/4096)×100 % ≈ 0.024414 % ≈ 0.0244 % • 当转换位数相同、而输入电压的满量程值VFS不同时,可分辩的最小电压值不同。例如,分辨率为12位,VFS = 5V时,可分辨的最小电压是1.22 mV;而VFS = 10V时,可分辨的最小电压是2.44 mV,当输入电压的变化低于此值时,转换器不能分辨。例如,4.999-5V所转换的数字量均为4095。 • (2)量化误差 • 在不计其它误差的情况下,一个分辨率有限的ADC的阶梯状转移特性曲线与具有无限分辨率的ADC转移特性曲线之间的最大偏差,称为量化误差。
◇ 知识链接 • (3)偏移误差 • 输入信号为零时,输出信号不为零的值。 • (4)满刻度误差 • 是指满刻度输出数码所对应的实际输入电压与理想输入电压之差。 • (5)线性度 • 有时又称为非线性度,是指转换器实际的转移函数与理想直线的最大偏移。 • (6)绝对精度 • 在一个变换器中,任何数码所对应的实际模拟电压与其理想的电压值之差并非是一个常数,把这个差的最大值定义为绝对精度。 • (7)相对精度 • 把绝对精度中的最大偏差表示为满刻度模拟电压的百分数。 • (8)转换速率 • 能够重复进行数据转换的速度,即每秒转换的次数。完成一次A/D转换所需的时间,是转换速率的倒数。
◇ 知识链接 • 3. A/D转换器的基本原理 • 由于模拟量时间和(或)数值上是连续的,而数字量在时间和数值上都是离散的,所以转换时要在时间上对模拟信号离散化(采样),还要在数值上离散化(量化),一般步骤为:
◇ 知识链接 • 4. ADC0809简介 • ADC0809是采样频率为8位的、以逐次逼近原理进行模—数转换的器件。其内部有一个8通道多路开关,它可以根据地址码锁存译码后的信号,只选通8路模拟输入信号中的一个进行A/D转换。主要特性有: • (1)8路8位A/D转换器,即分辨率8位; • (2)具有转换起停控制端; • (3)转换时间为100μs; • (4)单个+5V电源供电; • (5)模拟输入电压范围0~+5V,不需零点和满刻度校准; • (6)工作温度范围为-40~+85摄氏度; • (7)低功耗,约15mW。
◇ 知识链接 • 由图9.3可知,ADC0809由一个8路模拟开关、一个地址锁存与译码器、一个A/D转换器和一个三态输出锁存器组成。多路开关可选通8个模拟通道,允许8路模拟量分时输入,共用A/D转换器进行转换。三态输出锁器用于锁存A/D转换完的数字量,当OE端为高电平时,才可以从三态输出锁存器取走转换完的数据。 图9.3 ADC0809的内部逻辑结构
各脚功能如下:D7-D0:8位数字量输出引脚。IN0-IN7:8位模拟量输入引脚。VCC:+5V工作电压。GND:地。REF(+):参考电压正端。REF(-):参考电压负端。START:A/D转换启动信号输入端。ALE:地址锁存允许信号输入端。(以上两种信号用于启动A/D转换).EOC:转换结束信号输出引脚,开始转换时为低电平,当转换结束时为高电平。OE:输出允许控制端,用以打开三态数据输出锁存器。CLK:时钟信号输入端(一般为500KHz)。 ADC0809芯片的引脚图如图9.4所示。 图9.4 ADC0809芯片的引脚图
◇ 知识链接 • A、B、C:地址输入线。 • ADC0809对输入模拟量要求:信号单极性,电压范围是0-5V,若信号太小,必须进行放大;输入的模拟量在转换过程中应该保持不变,如若模拟量变化太快,则需在输入前增加采样保持电路。 • 地址输入和控制线:4条 。 • ALE为地址锁存允许输入线,高电平有效。当ALE线为高电平时,地址锁存与译码器将A,B,C三条地址线的地址信号进行锁存,经译码后被选中的通道的模拟量进转换器进行转换。A,B和C为地址输入线,用于选通IN0-IN7上的一路模拟量输入。通道选择表如下表9-1所示。
◇ 知识链接 表9-1 ADC0809通道选择表 • 数字量输出及控制线:11条 • ST为转换启动信号。当ST上跳沿时,所有内部寄存器清零;下跳沿时,开始进行A/D转换;在转换期间,ST应保持低电平。EOC为转换结束信号。当EOC为高电平时,表明转换结束;否则,表明正在进行A/D转换。OE为输出允许信号,用于控制三条输出锁存器向单片机输出转换得到的数据。OE=1,输出转换得到的数据;OE=0,输出数据线呈高阻状态。D7-D0为数字量输出线。 • CLK为时钟输入信号线。因ADC0809的内部没有时钟电路,所需时钟信号必须由外界提供,通常使用频率为500KHZ, • VREF(+),VREF(-)为参考电压输入。
任务小结 • 本项目是利用单片机和A/D转换器设计一个测量系统,可以实现0-5V的模拟电压,并在数码管上显示出来。通过实验结果的分析,效果较好,达到了预期效果,设计使用的元件数较少使用方便是比较明显的优势。通过学习,掌握了单片机系统对电压的采集、处理、显示等知识点,并掌握了ADC0809的工作原理以及与单片机的接口技术。通过扩展,可在实际测量中测量任何电压或其它的参数。
思考与练习 • 试修改程序,实现对各个通道电压的测量。 • 使用ADC0809完成其它电路的测量功能。