数字电压表课程设计报告Word文档下载推荐.docx
《数字电压表课程设计报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《数字电压表课程设计报告Word文档下载推荐.docx(12页珍藏版)》请在冰豆网上搜索。
重点介绍单片A/D转换器以及由它们构成的基于单片机的数字电压表的工作原理。
数字电压表的诞生打破了传统电子测量仪器的模式和格局。
它显示清晰直观、读数准确,采用了先进的数显技术,大大地减少了因人为因素所造成的测量误差事件。
数字电压表是把连续的模拟量(直流输入电压)转换成不连续、离散的数字形式,并加以显示的仪表。
数字电压表把电子技术、计算技术、自动化技术的成果与精密电测量技术密切的结合在一起,成为仪器、仪表领域中独立而完整的一个分支,数字电压表标志着电子仪器领域的一场革命,也开创了现代电子测量技术的先河。
本设计采用了以单片机为开发平台,控制系采用AT89C52单片机,A/D转换采用ADC0809。
系统除能确保实现要求的功能外,还可以方便进行8路其它A/D转换量的测量、远程测量结果传送等扩展功能。
简易数字电压测量电路由A/D转换、数据处理、显示控制等组成。
模拟式电压表具有电路简单、成本低、测量方便等特点,但测量精度较差,特别是受表头精度的限制,即使采用0.5级的高灵敏度表头,读测时的分辨力也只能达到半格。
再者,模拟式电压表的输入阻抗不高,测高内阻源时精度明显下降。
数字电压表作为数字技术的成功应用,发展相当快。
数字电压表(DigitalVoItMe-ter,DVM),以其功能齐全、精度高、灵敏度高、显示直观等突出优点深受用户欢迎。
特别是以A/D转换器为代表的集成电路为支柱,使DVM向着多功能化、小型化、智能化方向发展。
DVM应用单片机控制,组成智能仪表;
与计算机接口,组成自动测试系统。
目前,DVM多组成多功能式的,因此又称数字多用表(DigitalMultiMeter,DMM)。
DVM是将模拟电压变换为数字显示的测量仪器,这就要求将模拟量变成数字量。
这实质上是个量化过程,即将连续的无穷多个模拟量用有限个数字表示的过程,完成这种变换的核心部件是A/D转换器,最后用电子计数器计数显示,因此DVM的基本组成是A/D转换器和电子计数器。
DVM最基本功能是测直流电压,考虑到仪器的多功能化,可将其他物理量,如电阻、电容、交流电压、电流等,都变成直流电压,因此,还应有一个测量功能选择变换器,它包含在输入电路中。
DVM对直流电压直接测量时的测量精度最高,其他物理量在变换成直流电压时,受功能选择变换器精度的限制,测量精度有所下降。
2、工作原理
系统采用12M晶振产生脉冲做8031的内部时钟信号,通过软件设置单片机的内部定时器T0产生中断信号。
利用中断设置单片机的P2.4口取反产生脉冲做8031的时钟信号。
通过键盘选择八路通道中的一路,将该路电压送入ADC0809相应通道,单片机软件设置ADC0809开始A/D转换,转换结束ADC0809的EOC端口产生高电平,同时将ADC0809的EO端口置为高电平,单片机将转换后结果存到片内RAM。
系统调出显示子程序,将保存结果转化为0.00-5.00V分别保存在片内RAM;
系统调出显示子程序,将转化后数据查表,输出到LED显示电路,将相应电压显示出来,程序进入下一个循环。
3、系统结构框图
4、8031的结构及其功能
在本次课题设计中我们选择了8031芯片。
8031和8051是最常见的mcs51系列单片机,是inter公司早期的成熟的单片机产品,应用范围涉及到各行各业,下面介绍一下它的引脚图等资料。
<
8031管脚图>
4.18031内部结构及其功能概述
8031引脚功能
(1)主电源引脚Vss和Vcc
①Vss接地
②Vcc正常操作时为+5伏电源
(2)外接晶振引脚XTAL1和XTAL2
①XTAL1内部振荡电路反相放大器的输入端,是外接晶体的一个引脚。
当采用外部振荡器时,此引脚接地。
②XTAL2内部振荡电路反相放大器的输出端。
是外接晶体的另一端。
当采用外部振荡器时,此引脚接外部振荡源。
(3)控制或与其它电源复用引脚RST/VPD,ALE/,和/Vpp
①RST/VPD当振荡器运行时,在此引脚上出现两个机器周期的高电平(由低到高跳变),将使单片机复位
在Vcc掉电期间,此引脚可接上备用电源,由VPD向内部提供备用电源,以保持内部RAM中的数据。
②ALE/正常操作时为ALE功能(允许地址锁存)提供把地址的低字节锁存到外部锁存器,ALE引脚以不变的频率(振荡器频率的)周期性地发出正脉冲信号。
因此,它可用作对外输出的时钟,或用于定时目的。
但要注意,每当访问外部数据存储器时,将跳过一个ALE脉冲,ALE端可以驱动(吸收或输出电流)八个LSTTL电路。
对于EPROM型单片机,在EPROM编程期间,此引脚接收编程脉冲(功能)
③外部程序存储器读选通信号输出端,在从外部程序存储取指令(或数据)期间,在每个机器周期内两次有效。
同样可以驱动八LSTTL输入。
④/Vpp、/Vpp为内部程序存储器和外部程序存储器选择端。
当/Vpp为高电平时,访问内部程序存储器,当/Vpp为低电平时,则访问外部程序存储器。
对于EPROM型单片机,在EPROM编程期间,此引脚上加21伏EPROM编程电源(Vpp)。
8031引脚功能:
Vcc:
+5V电源电压。
Vss:
电路接地端。
P0.0~P0.7:
通道0,它是8位漏极开路的双向I/O通道,当扩展外部存贮器时,这也是低八位地址和数据总线,在编程校验期间,它输入和输出字节代码,通道0吸收/发出二个TTL负载。
P1.0~P1.7:
通道1是8位拟双向I/O通道,在编程和校验时,它发出低8位地址。
通道1吸收/发出一个TTL负载。
P2.0~P2.7:
通道2是8位拟双向I/O通道,当访问外部存贮器时,用作高8位地址总线。
通道2能吸收/发出一个TTL负载。
P3.0~P3.7:
通道3准双向I/O通道。
通道3能吸收/发出一个TTL负载,P3通道的每一根线还有
☆另一种功能:
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,外部数据存贮器读脉冲。
RST/VpD:
引脚9,复位输入信号,振荡器工作时,该引脚上2个机器周期的高电平可以实现复位操作,在掉电情况下(Vcc降到操作允许限度以下),后备电源加到此引脚,将只给片内RAM供电。
ALE/PROG:
引脚30,地址锁存有效信号,其主要作用是提供一个适当的定时信号,在它的下降沿用于外部程序存储器或外部数据存贮器的低8位地址锁存,使总线P0输出/输入口分时用作地址总线(低8位)和数据总线,此信号每个机器出现2次,只是在访问外部数据存储器期间才不输出ALE。
所以,在任何不使用外部数据存贮器的系统中,ALE以1/6振荡频率的固定速率输出,因而它能用作外部时钟或定时,8751内的EPROM编程时,此端输编程脉冲信号。
PSEN:
引脚29,程序选通有效信号,当从外部程序存贮器读取指令时产生,低电平时,指令寄存器的内容读到数据总线上。
EA/VPP:
引脚31,当保持TTL高电平时,如果指令计数器小于4096,8051执行内部ROM的指令,8751执行内部EPROM的指令,当使TTL为低电平时,从外部程序存贮器取出所有指令,在8751内的EPROM编程时,此端为21V编程电源输入端。
XTAL1:
引脚18,内部振荡器外接晶振的一个输入端,HMOS芯片使用外部振荡源时,此端必须接地。
XTAL2:
引脚19,内部振荡器外接晶振的另一个输入端,HMOS芯片使用外部振荡器时,此端用于输入外部振荡信号。
5、显示器
本次设计中有显示模块,常用的显示器件比较多,有数码管,LED点阵,1602液晶,12864液晶等。
数码管是最常用的一种显示器件,它是由几个发光二极管组成的8字段显示器件,其特点是价格非常的便宜,使用也非常的方便,显示效果非常的清楚。
小电流下可以驱动每光,发光响应时间极短,体积小,重量轻,抗冲击性能好,寿命长。
但数码管只能是显示0——9的数据。
不能够显示字符。
这也是数码管的不足之处。
经过性能的比较和根据本设计的要求以及价格的考虑,选择数码管显示器。
单位数码管如图4.4所示。
6、模数(A/D)芯片ADC0809
A/D转换器是模拟量输入通道中的一个环节,单片机通过A/D转换器把输入模拟量变成数字量再处理。
此次设计的是利用逐次逼近式ADC0809进行模数转换。
ADC0809是8位逐次逼近型A/D转换器,它是由一个8路的模拟开关、一个地址锁存译码器、一个A/D转换器和一个三态输出锁存器组成。
多路开关可选通8个模拟通道,允许8路模拟量分时输入,共用A/D转换器进行转换。
些A/D转换器是的特点是8位精度,属于并行口,如果输入的模拟量变化大快,必须在输入之前增加采样电路。
综合上述,逐次逼近型A/D转换既兼顾了转换速度,又具有一定的精度,这里选用的是逐次逼近型的A/D转换芯片ADC0809。
图4.6ADC0809内部结构图4.7ADC0809引脚图
7、8279接口芯片
8279的功能及工作原理
8279是Intel公司生产的通用可编程键盘和显示器I/O接口部件。
利用8279,可实现对键盘/显示器的自动扫描,并识别键盘上闭合键的键号,不仅可以大大节省CPU对键盘/显示器的操作时间,从而减轻CPU的负担,而且显示稳定,程序简单,不会出现误动作,由于这些优点,8279芯片日益被设计者所采用。
8279的引脚及内部结构
(1)I/O控制和数据缓冲器
双向的三态数据缓冲器将内部总线和外部总线DBo—DB7,用于传送CPU和8279之间的命令,数据和状态。
为片选信号。
当
为低电平时,CPU才选中8279读写。
A。
用以区分信息的特性。
当A。
为1时,CPU写入8279的信息为命令,CPU从8279读出的信息为8279的状态。
为0时,I/O信息都为数据。
图18279的引脚图
(2)控制逻辑
控制与定时寄存器用以寄存键盘及显示器的工作方式,锁存操作命令,通过译码产生相应的控制信号,使8279的各个部件完成一定的控制功能。
定时控制含有一些计数器,其中有一个可编程的5位计数器,对外部输入时钟信号进行分频,产生100kHz的内部定时信号。
外部时钟输入信号的周期不小于500ns。
(3)扫描计数器
扫描计数器有两种输出方式。
一种为外部译码方式(也称编码方式),计数器以二进制方式计数,4位计数状态从扫描线SL。
~SL3输出,经外部译码器译码出16位扫描线,另一种为内部译码方式(也称译码方式),即扫描计数器的低二位经片内译码器译码后从SL。
一SL3输出。
(4)键输入控制
这个部件完成对键盘的自动扫描,锁存RL。
~RL7的键输入信息,搜索闭合键,去除键的抖动,并将键输入数据写入内部先进先出(FIFO)的存储器RAM。
(5)FIFORAM和显示缓冲器RAM
8279具有8个先进先出(FIFO)的键输入缓冲器,并提供16个字节的显示缓冲器RAM。
8279将段码写入显示缓冲器RAM,8279自动对显示器扫描,将其内部显示缓冲器RAM中的数据在显示器上显示出来。
IRQ为中断请求输出线,高电平有效。
当FIFORAM缓冲器中存有键盘上闭合键的编码时,IRQ线升高,向CPU请求中断,当CPU将缓冲器中的输入键的数据全部读取时,中断请求线下降为低电平;
SHIFT、CNTL/STB为控制键输入线,由内部拉高电阻拉成高电平,也可由外部控制按键拉成低电平。
RL。
~RL7为反馈输入线,作为键输入线,由内部拉高电阻(或称为上拉电阻)拉成高电平,也可由键盘上按键拉成低电平。
SL。
~SL3为扫描输出线,用于对键盘显示器扫描。
OUTB。
-3、OUTA。
-3为显示段数据输出线,可分别作为两个半字节输出,也可作为8位段数据输出口,此时OUTB。
为最低位,OUTA3为最高位。
BD为消隐输出线,低电平有效,当显示器切换时或使用显示消隐命令时,将显示消隐。
RESET为复位输入线,高电平有效。
当RESET输入端出现高电平时,8279被初始复位。
8、硬件原理图
9、c语言程序编写
#include<
Reg51.h>
absacc.h>
#include<
intrins.h>
#defineA_DPORTXBYTE[0x8100]//0809通道0地址
#defineDATXBYTE[0xFF80]//8279数据口地址
#defineCOMXBYTE[0xFF82]//8279状态/命令口地址
#defineucharunsignedchar
#defineuintunsignedint
bitbdatabz=0;
//定义标志
longintval;
ucharidatadiss[4]={0,0,0,0};
//显示缓冲区
ucharcodeledseg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//LED显示常数表
voiddelay(uintz)
{
uintx,y;
for(x=z;
x>
0;
x--)
for(y=110;
y>
y--);
}
//----8279初始化子程序-----
voidinit8279()
COM=0x00;
//置8279工作方式
COM=0x2f;
//置键盘扫描速率
COM=0xc1;
//清除LED显示
delay(200);
//等待清除结束
//-----显示函数-----
voiddisled(d)
ucharidata*d;
uchari;
COM=0x80;
for(i=0;
i<
4;
i++)
{
COM=i+0x80;
DAT=ledseg[*d];
d++;
if(i==3)
{DAT=ledseg[*d]|0x80;
}
//-----显示缓冲区内容显示-----
voiddisp(void)
disled(diss);
//-----显示处理-----
voiddisplay(longsecond)
diss[0]=second%10;
//低位先存
diss[1]=second/10%10;
diss[2]=second/100%10;
diss[4]=second/1000;
disp();
main()
IT0=1;
EX0=1;
EA=1;
delay(100);
//延时
init8279();
while
(1)
A_DPORT=val;
//启动A_D
while(bz==0);
//等待A_D转换结束
display(val);
delay(10);
bz=0;
//清读数标志
voidint_0(void)interrupt0
val=A_DPORT;
//读A_D数据
val=val*5000/256;
bz=1;
//置读数标志