项目 9 数字式电压表的设计
-
Upload
addison-hickman -
Category
Documents
-
view
42 -
download
14
description
Transcript of 项目 9 数字式电压表的设计
项目 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 数字式电压表的设计
1 CLK
8 3
7 2
6 15
4 eoc3
2 start
8
76
5eoc
4
CLKoe
oe
11
22
3344
5566
7788
11
22
33
44
start
OUT121
ADD B24
ADD A25
ADD C23
VREF(+)12
VREF(-)16
IN31
IN42
IN53
IN64
IN75
START6
OUT58
EOC7
OE9
CLOCK10
OUT220
OUT714
OUT615
OUT817
OUT418
OUT319
IN228
IN127
IN026
ALE22
U1
ADC0809
XTAL218
XTAL119
ALE30
EA31
PSEN29
RST9
P0.0/AD039
P0.1/AD138
P0.2/AD237
P0.3/AD336
P0.4/AD435
P0.5/AD534
P0.6/AD633
P0.7/AD732
P1.01
P1.12
P1.23
P1.34
P1.45
P1.56
P1.67
P1.78
P3.0/RXD10
P3.1/TXD11
P3.2/INT012
P3.3/INT113
P3.4/T014
P3.7/RD17
P3.6/WR16
P3.5/T115
P2.7/A1528
P2.0/A821
P2.1/A922
P2.2/A1023
P2.3/A1124
P2.4/A1225
P2.5/A1326
P2.6/A1427
U2
AT89S51
+88.8
Volts
RV210k
R3
100RR4
100RR5
100RR6
100RR7
100RR8
100RR9
100RR10
100R
+88.8
Volts
+5V
图 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 输出为高阻状态,让出数据线。
项目 9 数字式电压表的设计
• 根据程序流程图编写的源程序如下:
• //文件名 dy9-1.c•#include<reg51.h>
• #define uchar unsigned char• #include <intrins.h>• code uchar TAB[]={0xc0,0xf9,0xa
4,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;
3. 源程序编写
项目 9 数字式电压表的设计
• /***********************计数器中断函数 ,用于控制电压转 *********************
• *******************时间间隔 ,此程序设定间隔为 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);
3. 源程序编写
项目 9 数字式电压表的设计
• 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%1
0;• 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 数字式电压表的设计•运行 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”就可以进行仿真了。点击模拟调试按钮的运行按钮“”,进入调试状态。
4. 程序调试与电路仿真
项目 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 所示。
◇ 知识链接
• 数字量输出及控制线: 11条 • ST 为转换启动信号。当 ST上跳沿时,所有内部寄存器清零;下跳沿时,开始进行 A/D
转换;在转换期间, ST应保持低电平。 EOC 为转换结束信号。当 EOC 为高电平时,表明转换结束;否则,表明正在进行 A/D 转换。 OE 为输出允许信号,用于控制三条输出锁存器向单片机输出转换得到的数据。 OE= 1 ,输出转换得到的数据; OE= 0 ,输出数据线呈高阻状态。 D7- D0 为数字量输出线。
• CLK为时钟输入信号线。因 ADC0809 的内部没有时钟电路,所需时钟信号必须由外界提供,通常使用频率为 500KHZ,
• VREF(+), VREF(-)为参考电压输入。
表 9-1 ADC0809 通道选择表C B A 选择的通道 C B A 选择的通道0 0 0 IN0 1 0 0 IN40 0 1 IN1 1 0 1 IN50 1 0 IN2 1 1 0 IN60 1 1 IN3 1 1 1 IN7
任务小结
•本项目是利用单片机和 A/D 转换器设计一个测量系统,可以实现 0- 5V 的模拟电压,并在数码管上显示出来。通过实验结果的分析,效果较好,达到了预期效果,设计使用的元件数较少使用方便是比较明显的优势。通过学习,掌握了单片机系统对电压的采集、处理、显示等知识点,并掌握了 ADC0809 的工作原理以及与单片机的接口技术。通过扩展,可在实际测量中测量任何电压或其它的参数。
•思考与练习 •试修改程序,实现对各个通道电压的测量。•使用 ADC0809 完成其它电路的测量功能。