基于AT89C51的简易数字电压表设计文档格式.docx
《基于AT89C51的简易数字电压表设计文档格式.docx》由会员分享,可在线阅读,更多相关《基于AT89C51的简易数字电压表设计文档格式.docx(20页珍藏版)》请在冰豆网上搜索。
2.1数字电压表的实现原理
ADC0808是8位的A/D转换器。
当输入电压为5.00V时,输出的数据值为255(0FFH),因此最大分辨率为0.0196(5/255)。
ADC0808具有8路模拟量输入端口,通过3位地址输入端能从8路中选择一路进行转换。
如每隔一段时间依次轮流改变3位地址输入端的地址,就能依次对8路输入电压进行测量。
LED数码管显示采用软件译码动态显示。
通过按键选择可对8路循环显示,也可单路显示,单路显示可通过按键选择显示的通道数。
2.2数字电压表的设计要求
可以测量0~5V范围内的3路直流电压值。
在4位LED数码管上轮流显示各路电压值或单路选择显示,其中3位LED数码管显示电压值,显示范围为0.00V~5.00V,1位LED数码管显示路数,3路分别为0-2。
要求测量的最小分辨率为0.02V。
3系统硬件设计
3.1设计思路
多路数字电压表应用系统硬件电路由单片机、A/D转换器、数码管显示电路和按键处理电路组成,由于ADC0808在进行A/D转换时需要有CLK信号,本试验中ADC0808的CLK直接由外部电源提供为500kHz的方波。
由于ADC0808的参考电压VREF=VCC,所以转换之后的数据要经过数据处理,在数码管上显示出电压值。
实际显示的电压值(D/256*VREF)ADC0808采用逐次逼近法转换,把模拟电压转换成16进制的D,由于是对直流电压0~5V进行采集,所以D对应的电压为V0
,我们的目的就是要把V0显示在LED显示器上,因为单片机不好进行小数点计算,所以有:
V0=2*D扩大了100倍,扩大100倍后的结果高八位放寄存器B,低八位放寄存器A,分寄存器B为0或不为0的情况进行存取数据,得到的结果个位放入R0,十位放入R1,通过查表使之显示在LED显示器。
图3-1总体框图
3.2设计过程
简易数字电压测量电路由A/D转换、数据处理及显示控制等组成。
电路原理图见附录2。
A/D转换由集成电路0808完成。
0808具有8路模拟输入端口,地址(23-25)脚可决定对哪路模拟输入作A/D转换,22脚为地址锁存控制,当输入为高电平时,对地址信号进行锁存。
6脚为测试控制,当输入一个2us宽高电平脉冲时,就开始A/D转换。
7脚为A/D转换结束标志,当A/D转换结束时7脚输出高电平。
9脚为A/D转换数据输出允许控制,当OE脚为高电平时,A/D转换数据从该端口输出。
10脚为0808的时钟输入端,由外部信号源提供。
单片机的P1、P3.0-P3.3端口作为四位LED数码管现实控制。
P3.5端口用作单路显示/循环显示转换按钮,P3.6端口用作单路显示时选择通道。
P0端口作A/D转换数据读入用,P2端口用作0808的A/D转换控制。
3.3AT89C51的功能介绍
3.3.1简单概述
AT89C51是一种带4K字节闪存可编程可擦除只读存储器(FPEROM—FlashProgrammableandErasableReadOnlyMemory)的低电压、高性能CMOS8位微处理器,俗称单片机。
AT89C51是一种带2K字节闪存可编程可擦除只读存储器的单片机。
单片机的可擦除只读存储器可以反复擦除1000次。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。
AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
外形及引脚排列如图3-2所示。
图3-2AT89C51芯片模型
3.3.2主要功能特性
(1)4K字节可编程闪烁存储器。
(2)32个双向I/O口;
128×
8位内部RAM。
(3)2个16位可编程定时/计数器中断,时钟频率0-24MHz。
(4)可编程串行通道。
(5)5个中断源。
(6)2个读写中断口线。
(7)低功耗的闲置和掉电模式。
(8)片内振荡器和时钟电路。
3.3.3AT89C51的引脚介绍
89C51单片机多采用40只引脚的双列直插封装(DIP)方式,下面分别简单介绍。
(1)电源引脚
电源引脚接入单片机的工作电源。
Vcc(40引脚):
+5V电源。
GND(20引脚):
接地。
(2)时钟引脚
XTAL1(19引脚):
片内振荡器反相放大器和时钟发生器电路的输入端。
XTAL2(20引脚):
片内振荡器反相放大器的输出端。
图3-3电源接入方式
3)复位RST(9引脚)
在振荡器运行时,有两个机器周期(24个振荡周期)以上的高电平出现在此引脚时,将使单片机复位,只要这个脚保持高电平,51芯片便循环复位。
(4)
/Vpp(31引脚)
为外部程序存储器访问允许控制端。
当它为高电平时,单片机读片内程序存储器,在PC值超过0FFFH后将自动转向外部程序存储器。
当它为低电平时,只限定在外部程序存储器,地址为0000H~FFFFH。
Vpp为该引脚的第二功能,为编程电压输入端。
3.4ADC0808的引脚及功能介绍
3.4.1芯片概述
ADC0808是一种典型的A/D转换器。
它是由8位A/D转换器,一个8路模拟量开关,8位模拟量地址锁存译码器和一个三态数据输出锁存器组成;
+5V单电源供电,转化时间在100us左右;
内部没有时钟电路,故需外部提供时钟信号。
芯片模型如图3-4所示。
图3-4ADC0808芯片模型
3.4.2引脚简介
(1)IN0~IN7:
8路模拟量输入端。
(2)D0~D7:
8位数字量输出端口。
(3)START:
A/D转换启动信号输入端。
(4)ALE:
地址锁存允许信号,高电平有效。
(5)EOC:
输出允许控制信号,高电平有效。
(6)OE:
输出允许控制信号,高电平有效。
(7)CLK:
时钟信号输入端。
(8)A、B、C:
转换通道地址,控制8路模拟通道的切换。
A、B、C分别与地址线或数据线相连,三位编码对应8个通道地址端口,A、B、C=000~111分别对应IN0~IN7通道的地址端口。
3.4.3ADC0808的转换原理
ADC0808采用逐次比较的方法完成A/D转换,由单一的+5V电源供电。
片内带有锁存功能的8路选1的模拟开关,由A、B、C的编码来决定所选的通道。
ADC0809完成一次转换需100μs左右,它具有输出TTL三态锁存缓冲器,可直接连接到AT89C51的数据总线上。
通过适当的外接电路,ADC0808可对0~5V的模拟信号进行转换。
图3-5ADC0808与单片机的连接
3.574LS373芯片的引脚及功能
3.5.1芯片概述
74LS373是一种带有三态门的8D锁存器,其在本设计中是锁存P0口的低8位地址,芯片模型如图3-6所示。
3.5.2引脚介绍
(1)D0~D7:
8位数据输入线;
(2)Q0~Q7:
8位数据输出线
(3)G:
数据输入锁存选通信号。
当加到该引脚的信号为高电平时,外部数据选通到内部锁存器,负跳变时,数据锁存到锁存器中。
:
数据输出允许信号,低电平有效。
当该信号为低电平时,三态门打开,锁存器中的数据输出到数据输出线上,当该信号为高电平时,输出线为高阻态。
74LS373用作地址锁存器时,应使OE为低电平,此时锁存使能端C为高电平时,输出Q1~Q8
状态与输入端D1~8状态相同;
当C发生负的跳变时,输入端D1~D8
数据锁入Q1~Q8。
51单片机的ALE信号可以直接与74LS373的C连接。
在MCS-51单片机系统中,常采用74LS373作为地址锁存器使用,其连接方法如上图所示。
其中输入端D1~D8接至单片机的P0口,输出端提供的是低8位地址,G端接至单片机的地址锁存允许信号ALE。
输出允许端OE接地,表示输出三态门一直打开。
图3-774LS373与单片机连接
3.6LED数码管的控制显示
3.6.1LED数码管的模型
LED数码管模型如图3-8所示。
3.6.2LED数码管的接口简介
LED的段码端口A~G分别接至AT89C51的P1.0~P1.7口,位选端1~4分别接至P3.5、P3.4、P3.1、P3.0,如图3-9所示。
3.7硬件电路图
用Protues软件仿真设计的电路如图3-10所示。
图3-10仿真电路
4系统软件程序的设计
多路数字电压表系统软件程序主要有主程序、A/D转换子程序和中断显示程序组成。
4.1主程序
主程序包含初始化部分、调用A/D转换子程序和相应外部0中断显示电压数值程序,初始化部分包含存放通道的缓冲区初始化和显示缓冲区初始化。
另外,对于单路显示和循环显示,系统设置了一个标志位00H控制,初始化时00H位设置为0,默认为循环显示,当它为1时改变为单路显示控制,00H位通过单路、循环按键控制。
流程图如图4-11所示。
主程序:
voidmain()
{
ucharvalue[4];
while
(1)
{
AD_shift(AD_get());
value_shift(value);
Display(value);
}
4.2A/D转换子程序
A/D转换子程序用于对ADC0808的4路输入模拟电压进行A/D转换,并将转换的数值存入4个相应的存储单元中,A/D转换子程序每隔一定时间调用一次,即隔一段时间对输入电压采样一次,如图4-12所示。
图4-12A/D转换流程图
子程序:
#include<
reg51.h>
#defineucharunsignedchar
#defineuintunsignedint
#defineAD_dataP1
//AD0808数据输出端
#defineLED_portP0
//数码管段
#defineLED_posP3
//数码管位
sbitSTART=P2^5;
sbitOE=P2^7;
sbitEOC=P2^6;
sbitALE=P2^2;
uintDCtemp=0;
//电压临时数据
ucharcodeLED_seg[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
ucharcodepos[4]={0x01,0x02,0x04,0x08};
voidDelay(uchart)
//延时函数
uchari,j,k;
for(i=0;
i<
t;
i++)
for(j=0;
j<
20;
j++)
for(k=0;
k<
k++);
}
ucharAD_get()
ucharDCdata;
START=0;
ALE=1;
//因为模拟输入只采用一路,地址段直接接地,使用IN0作为输入端
START=1;
ALE=0;
while(EOC==0);
OE=1;
DCdata=AD_data;
OE=0;
Delay(10);
returnDCdata;
voidAD_shift(ucharDCdata)
{
uchari;
floatDC=0;
8;
if(DCdata&
1<
<
i)
DC+=(1<
i)*19.6;
}
DCtemp=(int)DC;
voidvalue_shift(ucharvalue[])
value[0]=DCtemp/1000;
value[1]=DCtemp/100%10;
value[2]=DCtemp/10%10;
value[3]=DCtemp%10;
voidDisplay(ucharvalue[])
4;
LED_pos=pos[i];
//位控制
if(i==0)
LED_port=LED_seg[value[i]]+0x80;
//段码
else
LED_port=LED_seg[value[i]];
Delay
(1);
4.3中断显示程序
设计中采用中断的方式来读取转换完成的数据能节省CPU的资源
当系统设置好后,一旦数据转换完成,便会进入外部中断0,然后在中断中读取转换的数值,处理数据并送数码管显示输出。
LED数码管采用软件译码动态扫描的方式。
在中断程序中包含多路循环显示程序和单路显示程序,多路循环显示程序把4个存储单元的数值依次取出送到4个数码管上显示,每一路显示一秒。
单路显示程序只对当前选中的一路数据进行显示。
每路数据显示时需经过转换变成十进制BCD码,放于4个数码管显示缓冲区中。
单路或多路循环显示通过标志位00H控制。
在显示控制程序中加入了对单路或多路循环按键的判断。
中断程序:
5电压表的调试及性能分析
5.1调试与测试
本设计应用Proteus6及KEIL51软件,首先根据自己设计的电路图用Proteus6软件画出电路模型,关于这个软件的使用通过查一些资料和自己的摸索学习;
然后我们用KEIL51软件对所编写的程序进行编译、链接,如果没有错误和警告便可生成程序的hex文件,将此文件加到电路图上使软硬件结合运行,最后进行端口电压的对比测试,测试的第一路对比见图5-14中标准电压值采用Proteus6软件中的模拟电压表测得。
从图中可以看出,简易数字电压表与“标准”数字电压表测得的绝对误差均在0.02V以内,这与采用8位A/D转换器所能达到的理论误差精度相一致,在一般的应用场合可以完全满足要求。
(1)当IN0口输入电压值为0.05V时,显示结果如图5-15所示,测量误差为0.1V。
图5-15
(2)当IN0输入电压值为1.50V时,显示结果如图5-16所示,测量误差为0.04V。
图5-16
(3)当IN0口输入电压值为3.50V时,显示结果如图5-17,测量误差为0.06V。
图5-17
5.2分析性能
通过以上仿真测量结果可得到简易数字电压表与“标准”数字电压表对比测试表,如下表5-1所示:
表5-1简易数字电压表与“标准”数字电压表对比测试表
标准电压值/V
简易电压表测量值/V
绝对误差/V
0.00
0.50
0.52
0.02
1.00
1.50
1.51
0.01
2.00
2.02
2.50
3.00
3.50
3.51
4.00
4.99
5.00
由于单片机AT89C51为8位处理器,当输入电压为5.00V时,ADC0808输出数据值为255(FFH),因此单片机最高的数值分辨率为0.0196V(5/255)。
这就决定了电压表的最高分辨率只能到0.0196V,从上表可看到,测试电压一般以0.01V的幅度变化。
从上表可以看出,简易数字电压表测得的值基本上比标准电压值偏大0-0.01V,这可以通过校正ADC0808的基准电压来解决。
因为该电压表设计时直接用5V的供电电源作为电压,所以电压可能有偏差。
当要测量大于5V的电压时,可在输入口使用分压电阻,而程序中只要将计算程序的除数进行调整就可以了。
参考文献
[1]孙肖子.电子设计指南[M].北京:
高等教育出版社,2006.
[2]康华光.电子技术基础[M].北京:
高等教育出版社.
[3]欧阳文.ATMEL89系列单片机的原理与开发实践[M].中国电力出版社.
[4]谭浩强.C程序设计[M].北京:
清华大学出版社.
[5]周责奎.控制仪表与计算机控制设置[M].化学工业出版社.
[6]李青.电路与电子技术基础[M].浙江:
科学技术出版社.
[7]孙育才.新型AT89S52系列单片机及其应用[M].北京:
[8]蔡美琴.MCS-51系列单片机系统及其应用[M].北京:
[9]陈尚松.电子测量与仪器[M].电子工业出版社.
[10]苗红霞.单片机实现数字电压表的软硬件设计[J].河海大学常州分校学报,2002,16.3.
[11]胡卓敏,王丽娟.基于STC89C51的数字电压表设计[J].电子元器件应用,2009,11,11.
[12]冯占岭.数字电压表及数字多用表检测技术[M].北京:
中国计量出版社,2003.
[13]梁廷贵.积分式A/D转换器[M].北京:
科学技术文献出版社,2003.
[14]魏立峰.单片机原理及应用技术[M].北京:
北京大学出版社,2005.
[15]张毅刚.单片机原理及应用[M].北京:
高等教育出版社,2003.
致谢
经过为期一个多月的设计,从查阅资料到设计草案的确定,百忙之中老师在各个环节给予了我们悉心教导,使我得以最终完成毕业设计。
在这三年中,老师的谆谆教导、同学的互帮互助使我在专业技术和为人处事方面都得到了很大的提高。
感谢学校在我三年的大学生活当中对我的教育与培养,感谢江苏农林学院的所有专业老师,没有你们的辛勤劳动,就没有我们今日的满载而归,感谢大学三年曾经帮助过我的所有同学。
在制作毕业设计过程中我曾经向老师们和同学们请