四路数字电压表
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
四路数字电压表设计
摘要
随着微电子技术的不断发展,微处理器芯片的集成程度越来越高,单片机已可以在一块芯片上同时集成CPU、存储器、定时器/计数电路,这就很容易将计算机技术与测量控制技术结合,组成智能化测量控制系统。
数字电压表就是采用数字化测量技术,把连续的模拟量转换成不连续、离散的数字形式并加以显示的仪表。
本课程设计是基于单片机的数字电压表的设计,该设计主要由三个模块组成:A/D转换模块,数据处理模块及显示模块。
A/D转换主要由芯片ADC0808来完成,它负责把采集到的模拟量转换为相应的数字量再传送到数据处理模块。
数据处理模块则由芯片AT89C51来完成,其负责把ADC0808传送来的数字量经过一定的数据处理,产生相应的显示码送到显示模块进行显示。
此数字电压表电路相对简单,所用的元件较少,成本低,且测量精度和可靠性较高。
关键词:A/D转换器, AT89C51 , ADC0808
目录
1 绪论 (1)
1.1课题描述 (1)
1.2基本工作原理及框图 (1)
2 相关芯片及硬件电路设计 (2)
2.1AT89C51芯片 (2)
2.2ADC0808芯片 (2)
2.2.1ADC0808芯片介绍 (2)
2.2.2ADC0808转换原理 (3)
2.3时钟电路 (4)
2.4复位电路 (4)
2.5A/D转换电路 (5)
2.6数码显示电路 (6)
2.7总电路 (7)
3 软件设计 (7)
3.1程序设计总方案 (7)
3.2系统子程序设计 (8)
3.2.1初始化程序 (8)
3.2.2A/D转换子程序 (8)
3.2.3显示子程序 (9)
3.3程序设计 (9)
4调试仿真 (11)
总结 (13)
致谢 (14)
参考文献 (15)
1 绪论
1.1 课题描述
数字电压表的诞生打破了传统电子测量仪器的模式和格局。
它显示清晰直观、读数准确,采用了先进的数显技术,大大地减少了因人为因素所造成的测量误差事件。
数字电压表是把连续的模拟量(直流输入电压)转换成不连续、离散的数字形式,并加以显示的仪表。
数字电压表把电子技术、计算技术、自动化技术的成果与精密电测量技术密切的结合在一起,成为仪器、仪表领域中独立而完整的一个分支,数字电压表标志着电子仪器领域的一场革命,也开创了现代电子测量技术的先河[1]。
本课程设计就是利用单片机和A/D 转换器设计的一个四路数字电压表。
1.2 基本工作原理及框图
本实验采用AT89C51单片机芯片配合ADC0808模/数转换芯片构成一个简易的四路数字电压表。
它是由硬件电路和软件所组成,而硬件电路又可分为A/D 转换模块,数据处理模块及数码管显示模块。
其工作过程:模拟电压经过档位切换到不同的分压电路筛减后,经隔离干扰送到A/D 转换器进行A/D 转换。
然后送到数据处理模块中进行数据处理,处理后的数据送到LED 数码管中显示。
通过调节滑动变阻器的值可以改变各路模拟电压的值[2]。
其基本工作原理框图如图1所示。
图1 基本工作原理框图
模拟电压
A/D 转换模块
数据处理模块
数码管显示模块
2相关芯片及硬件电路设计
2.1 AT89C51芯片
AT89C51是51系列单片机的一个型号,它是ATMEL公司生产的。
AT89C51是一个低电压、高性能CMOS 8位单片机。
将通用的微处理器和Flash存储器结合在一起,可反复擦写的Flash存储器可有效地降低开发成本。
AT89C51有PDIP、PQFP/TQFP及PLCC等三种封装形式,以适应不同产品的需求[3]。
其引脚图如图2所示。
图2 AT89C51引脚图
AT89C51提供以下标准功能:4K字节Flash闪速存储器,128字节内部RAM,32个I/O口线,两个十六位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。
同时,AT89C51可降至0Hz的静态逻辑操作,并支持两种软件可选的节电工作模式。
空闲方式停止CPU的工作,但允许RAM,定时/计数器,串行通信口及中断系统继续工作。
掉电方式保存RAM中的内容,但振荡器停止工作并禁止其他所有部件工作直到下一个硬件复位。
2.2 ADC0808芯片
2.2.1 ADC0808芯片介绍
ADC 0808 采用逐次比较的方法完成A/D转换,由单一的+5V电源供电。
片内带有锁存功能的8路选1的模拟开关,由A、B、C的编码来决定所选的通道。
ADC0808完成一次转换需100μs左右,它具有输出TTL三态锁存缓冲器,可直接连接到AT89C51
的数据总线上。
通过适当的外接电路,ADC0808可对0~5V的模拟信号进行转换[4]。
其引脚图如图3所示。
图3 ADC0808引脚图
引脚说明:
(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路模拟通道的切换。
2.2.2 ADC0808转换原理
ADC是一种基本的外围扩展器件,其种类很多,工作原理也不仅相同,比较有代表性的是:单积分型,双积分型,脉宽调制型和逐次比较型(逐次逼近型)。
从产品性价比、转换速度和精度等方面综合分析,逐次比较型ADC是相对应用比较广的类型之一。
逐次逼近型ADC实际采用的方法上从高到底开始逐位设定,比较模拟量输出,再来确定原设定位的正确与否[5]。
逐次比较型ADC原理结构如图4所示。
图4 ADC原理结构图
其工作原理如下:首先,被测模拟电压ui通过逐次比较寄存器,将传递进的脉冲CP信号转换成数字信号,该数字量再经过数/模转换器生成对应的模拟量Us。
当获得模拟量Us 的数值达到并接近被测电压所对应ui后,就可以检测出电压比较器完成最后的反转。
此时,逐次比较积存器的计数值就是被测电压ui所对应的数字量,从而完成模拟量的转换。
2.3时钟电路
单片机工作的时间基准是由时钟电路提供的,在单片机的XTAL.1和XTAL.2两个管脚接一只晶振及两只电容就构成了单片机的时钟电路,电路中电容器C1和C2对振荡频率有微调作用,通常取(30±10)pF石英晶体选择6MHz或12MHz都可以[6]。
其电路图如图5所示。
图5时钟电路图
2.4复位电路
AT89C51单片机要求至少两个高电平,以便单片机做好准备工作。
当上电时,由于电容的电压不能突变,会输出高电平,当电容充电到一定程度,就会输出低电平,单片
机利用输出高电平的这段时间复位[7]。
电阻和电容的值选择要合适,在这要求R1<<R2,所以选取R10=1KΩ,R9=10KΩ。
当按下开关按钮即可使单片机复位,其电路图如图6所示。
图6 复位电路图
2.5 A/D转换电路
如图7所示是ADC0809与AT89C51单片机的转换电路。
ADC0808的数据OUT0-OUT7直接与单片机的总线P0相连,通道IN0-IN3接四路模拟电压RV1-RV4对输入的电压进行模数转换,其他通道直接悬空。
时钟CLK由单片机的ALE取得,对于晶振为12MHz的单片机ALE输出为2MHz的方波,但前面提到ADC0808的时钟频率一般为500KHz,最大能超过1280KHz,但在实际应用中2MHz的信号也可以使ADC0808正常工作。
START、ALE和OE分别由单片机的WR、RD和P2.7经或非门接入、这样主要是满足ADC0808的信号电平与时序的要求。
图7 A/D转换电路图
按此图7中的片选接法,8个模拟输入通道(IN0-IN7)的地址分别为7FF8H-7FFFH。
由于EOC未接入单片机,故只能采用延时等待的方法来读取A/D转换的结果(即当单
片机启动ADC0808后延时一段时间再主动去读ADC0808的转换结果)。
但是如果单片机在进行A/D转换时还要执行其他的程序可以将EOC接在单片机的中断上,这样当A/D 转换完后EOC可以对单片机产生中断使其读取A/D转换的结果。
2.6数码显示电路
单片机对ADC0808的转换的结果采用查询方式进行读取,通过计算,可以在显示器上将模拟量的结果显示出来。
显示子程序采用动态扫描法用4-LED显示器实现四位数码管的数值显示。
4-LED显示器是一个共阴极接法的4位LED数码显示管,其中a,b,c,e,f,g为4位LED各段的公共输出端,1、2、3、4分别是每一位的位数选端,dp 是小数点引出端,4位一体LED数码显示管的内部结构是由4个单独的LED组成,每个LED的段输出引脚在内部都并联后,引出到器件的外部。
为了简化数字式直流电压表的电路设计,在数码管显示电路的设计上采用P3口作为LED的段码输出信号,P1口的低四位作为LED位码的输出控制信号。
该电路的工作原理:当P3口输出段码信号的BCD码后,输出具有一定驱动能力的七段字形码,由于4-LED的段码输入管脚是并联在一起的,所以每一位LED的段码输入管脚都能获得这个段码信号。
若要控制在每一时刻只有一位LED被点亮,必须靠位码信号控制。
P1口低四位输出位码信号后接到LED的位码控制端,因此P1口的低四位的位码信号在每一时刻只有一位是“1”,其他位全为“0”,然后按时间顺序改变输出“1”的位置,控制在每一时刻只有一位LED被点亮,达到动态显示的目的。
图8 数码显示电路
2.7总电路
总体电路图如图9所示。
该电路通过ADC0808芯片采样输入口IN0~IN3输入的0~5 V 的模拟量电压,经过模/数转换后,产生相应的数字量经过其输出通道OUT0~OUT7传送给AT89C51芯片的P0.0和P0.7口。
AT89C51负责把接收到的数字量经过数据处理,产生正确的7段数码管的显示段码,并通过其P1.0~P1.2口传送给数码管,由数码管显示各路的模拟电压值。
1
2
34
1
2
3
4
XT XT PSEN 29P0.0/AD039P1.01P3.0/RXD 1021P2.2/A10ADD C VREF(+)16IN75ST 6OUT8172212CRYST AL2
18
AL1
19
ALE 30EA
31
RST
9
P0.1/AD138P0.2/AD237P0.3/AD336P0.4/AD435P0.5/AD534P0.6/AD633P0.7/AD732P1.12P1.23P1.34P1.45P1.56P1.67P1.78
P3.1/TXD 11P3.2/INT012P3.3/INT113P3.4/T014P3.7/RD
17
P3.6/WR 16P3.5/T115P2.7/A1528P2.0/A8P2.1/A92223P2.3/A1124P2.4/A1225P2.5/A1326P2.6/A1427U1
AT89C51
OUT121ADD B 24ADD A
252312VREF(-)
IN31IN42IN53IN64ART OUT58EOC 7OE
9
CLOCK
10
OUT220OUT714OUT615OUT418OUT319IN228IN127IN0
26
ALE U2
ADC0808
U3:A
7406
34569
8
7406
R1 100
R8
C1
30pF
C2
30pF
C3
1uF
X1
AL
R9
1k
R1010k
V D D
RV1
1k
RV2
1k
RV3
1k
RV4
1k
+5V
+88.8Volts
+88.8Volts
+88.8Volts
+88.8Volts
图10 总体电路图
3 软件设计
3.1程序设计总方案
根据模块的划分原则,将该程序划分初始化模块,A/D 转换子程序和显示子程序,这三个程序模块构成了整个系统软件的主程序,如图11所示。
图11 主程序框图
3.2 系统子程序设计
3.2.1 初始化程序
所谓初始化,是对将要用到的MCS-51系列单片机内部部件或扩展芯片进行初始工作状态设定,初始化子程序的主要工作是设置定时器的工作模式,初值预置,开中断和打开定时器等
3.2.2 A/D转换子程序
A/D转换子程序用来控制对输入的模块电压信号的采集测量,并将对应的数值存入相应的内存单元,其转换流程图如图12所示。
图13 A/D转换流程图
3.2.3 显示子程序
子程序采用动态扫描实现四位数码管的数值显示,在采用动态扫描显示方式时,要使得LED显示的比较均匀,又有足够的亮度,需要设置适当的扫描频率,当扫描频率在70HZ左右时,能够产生比较好的显示效果,一般可以采用间隔10ms对LED进行动态扫描一次,每一位LED的显示时间为1ms。
在本设计中,为了简化硬件设计,主要采用软件定时的方式,即用定时器0溢出中断功能实现11μs定时,通过软件延时程序来实现5ms的延时
3.3 程序设计
根据以上分析,在Keil4编写控制程序如下所示。
#include<reg51.h>
unsigned char
a[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x7 1,},b[4],c=0x01;
sbit START=P2^4;
sbit OE=P2^6;
sbit EOC=P2^5;
sbit add_a=P2^2;
sbit add_b=P2^1;
sbit add_c=P2^0;
sbit led=P2^7;
sbit buzzer=P2^3;
void Delay1ms(unsigned int count);
{ unsigned int i,j;
for(i=0;i<count;i++)
for(j=0;j<120;j++);
}
void show()
{
unsigned int r;
for(r=0;r<4;r++)
{
P1=(c<<r);
P3=b[r];
if(r==2)
P3=P3|0x80;
Delay1ms(1);
}
}
void main(void)
{
unsigned int addata=0,i; while(1)
{
add_a=0; add_b=0;add_c=0;
START=1;
START=0;
while(EOC==0)
{
OE=1;
}
addata=P0;
if(addata>=0x40)
for(i=0;i<=100;i++)
{
led=~led;
buzzer=~buzzer;
}
led=1;
buzzer=1;
}
else
{
led=0;
buzzer=0;
}
addata=addata*1.96;
OE=0;
b[0]=a[addata%10];
b[1]=a[addata/10%10];
b[2]=a[addata/100%10];
b[3]=a[addata/1000];
for(i=0;i<=200;i++)
{
show();
}
add_a=1;
add_b=0;
add_c=0;
START=1;
START=0;
while(EOC==0)
{
OE=1;
}
addata=P0;
if(addata>=0x80)
{
for(i=0;i<=100;i++)
{
led=~led;
buzzer=~buzzer;
}
led=1;
buzzer=1;
}
else
{
led=0;
buzzer=0;
}
addata=addata*1.96;
OE=0;
b[0]=a[addata%10];
b[1]=a[addata/10%10];
b[2]=a[addata/100%10];
b[3]=a[addata/1000];
for(i=0;i<=200;i++)
{
show();
}
}
}
4调试仿真
利用Proteus仿真软件画出电路图,并在Keil4上编写控制程序,并编译生成.hex文件,将,hex文件加载到AT89C51上,然后进行仿真。
通过调节可调电阻RV可改变模拟电压的大小,于是将其四路模拟电压分别设定为+0.00V、+2.50V、+3.50V、+4.99V进行调试,调试仿真图如图14所示。
其调试结果分别为00.00V、02.48V、03.48V、04.99V,通过多次模拟调试对比数码管显示电压与标准电压表上的电压可以发现数字电压表能够实现四路模拟信号的A/D转换,并将转换结果在数码管上显示到小数点后2位,而且
可以通过调节可调电阻输入模拟电压的大小,其绝对误差为0.02V在误差-0.02V~+0.02V 范围内。
故本四路数字电压表符合了本次课程设计的要求。
图14 调试仿真图
总结
本次课程设计主要实现了数字电压表测量四路电压的功能,详细说明了从原理图的设计、电路图的仿真再到软件的调试。
在本次设计采用了AT89C51单片机芯片,与以往的单片机相比增加了许多新的功能,使其功能更为完善,应用领域也更为广泛。
此外,在设计中还用到了模/数转换芯片ADC0808,使数据采集与转换更加容易。
以前在学单片机课程时只是对其理论知识有了初步的理解,通过这次设计,我对单片机的工作原理有了更深的理解。
无论是在硬件连接方面,还是在软件编程方面,我都得到很大提高。
致谢
这次课程设计使我对对单片机原理有了整体的认识,对系统的整体设计框架和流程有了清醒的认识,同时也意识到自己的知识还有待加强,激励我不断充实自己。
在本次课程设计中我遇到了很多问题,最后在李文方老师的辛勤指导下,终于游逆而解完成本次课程设计。
在李老师那里我不仅学到很多实用的专业知识,而且还学到了严谨、务实、认真的工作态度和极强的敬业精神,也让我明白了不畏困难、勇于攀登艰难的重要性,这对我未来的学习和生活产生很大的影响,最后我向李老师表示衷心的感谢。
参考文献
[1] 胡汉才.单片机原理与接口技术[M].北京:清华大学出版社,1995.6.
[2] 楼然苗等.51系列单片机设计实例[M].北京:北京航空航天出版社,2003.3.
[3] 何立民. 单片机高级教程[M].北京:北京航空航天大学出版社,2001.
[4] 张毅刚.单片机原理与应用设计[M].北京:电子工业出版社,2008.
[5] 吕运朋.MCS-51单片机原理、接口机应用[M].北京:北京理工大学出版社,2009.
[6]彭伟.单片机C语言程序设计实例100例[M].北京:电子工业出版社,2010.
[7]于凤明.单片机原理及接口技术[M].北京:中国轻工业出版社.1998.。