数字电压表.docx
《数字电压表.docx》由会员分享,可在线阅读,更多相关《数字电压表.docx(16页珍藏版)》请在冰豆网上搜索。
数字电压表
基于单片机控制的数字电压表
摘 要:
介绍了采用单片机AT89S51和ADC0809相联,用ADC0809采集模拟电压,通过ADC0809内部处理转换成单片机所识别的数字信号,之后将处理过的信号送往驱动显示模块转变成控制数码管显示的二进制数据,ADC0809在进行A/D转换时需要的CLK信号用软件来产生。
由此实现数字电压表的硬件电路与软件编程。
且ADC0809具有8路模拟量输入端口,通过3位地址输入端能从8路中选择一路进行转换,实现8路输入电压值的测量。
关键词:
单片机AT89S51;ADC0809;74LS245数字电压表
1引言
当今社会,单片机的应用相当广泛。
其应用范围小到儿童智能玩具,大到航空航天领域。
根椐现实生活当中已经存在的电压表,为了增强其功能,所以设计出这个基于单片机控制的电压表。
正是鉴于此,本文设计了一种使用单片机和数模转换芯片为核心的数字电压表。
它可以精确(精确到0.02V)测量出欲测的直流电压值,并用数码管显示出测量结果。
2总体设计方案
2.1设计思路
我们用ADC0809把表笔传来的模拟电压信号转变成数字信号,送住单片机AT89S51中进行处理,转变成控制数码管显示的二进制数据。
由于ADC0809在进行A/D转换时需要有CLK信号,而此时的ADC0809的CLK是接在AT89S51单片机的P3.3端口上,也就是要求从P3.3输出CLK信号供ADC0809使用。
因此产生CLK信号的方法就得用软件来产生了。
由于ADC0809的参考电压VREF=VCC,所以转换之后的数据要经过数据处理,在数码管上显示出电压值。
实际显示的电压值为(D/256*VREF)。
总体设计方框图包括八路数据采集、模数转换电路、单片机、数码显示。
如图1所示
八路数据采集
模数转换电路
单片机
数码显示
图1总体设计方框图
2.2系统硬件电路的设计
8路数字电压表应用系统硬件电路由单片机,A/D转换器数码管显示电路和按键处理电路等组成。
ADC0809具有8路模拟量输入通~道IN0~IN7,通过3位地址输入端C,B,A。
C引脚2325进行选择,引脚22为地址锁存控制端ALE当输入为高电平时,C,B,A引脚输入的地址锁存于ADC0809内部的锁存器中。
经内部译码选中相应的模拟通道,引脚6为启动转换控制端START,当输入一个2VS宽的高电平脉冲时,就启动ADC0809开始对输入通道的模拟量进行转换,引脚7为A/D转换结束信号EOC,ADC0809为逐次比较型A/D转换器当开始转换时,EOC信号为低电平,经过一定时间转换结束,转换结束信号EOC输出高电平,转换结束存放于ADC0809内部的输出数据锁存器中。
引脚⑨为A/D转换数据输出允许控制端OE,当OE为高电平时,存放于输出数据锁存器中的数据通过ADC0809的数据线D0~D7输出,引脚⑩为ADC0809的时钟信号输入端CLOCK。
在连接时,ADC0809的数据线D0~D7与AT89C51的P0口相连,ADC0809的地址引脚,地址锁存端ALE,启动信号START,数据输出允许控制端OE分别与AT89C51的P2口相连,转换结束信号EOC与AT89C51的P3.7相连。
时钟信号输入端CLOCK信号由单片机的地址锁存信号ALE得到,单片机的系统时钟为6MHZ,因而ADC0809时钟输入端CLOCK信号的频率为2MHZ。
LED数码管采用动态扫描方式连接,通过AT89C51的P1口和P3.0~P3.3口控制P1为LED数码管的字段码输出端。
P3.0~P3.3口为LED数码管的位选码输出端,通过三极~管驱动并反相。
X1和X2是两个按键开关,分别于单片机的P3.5和P3.6相连,X1用于单路显示或多路循环显示转换控制。
X2用于单路显示时的通道选择。
图2主程序流程图
2.3系统软件程序的设计
多路数字电压表的系统软件程序由主程序,A/D转换子程序和显示子程序组成。
2.3.1主程序
主程序包含初始化部分,调用A/D转换子程序和调用显示子程序。
如图2所示。
初始化部分包含存放通道数据缓冲区初始化和显示缓冲区初始化。
另外,对于单路显示和循环显示系统设置了一个标志位00H控制,初始化时00H设置为0,默认为循环显示,当它为1时改变为单路显示00H位通过单路/循环按键控制。
否
否
是
图3A/D转换子程序流程图
2.3.2A/D转换子程序
A/D转换子程序用于对ADC0809的8路输入模拟电压进行A/D转换,并将转换的数值存为8个相应的存储单元中,如图3所示,A/D转换子程序每隔一定时间调用一次,即隔一段时间对输入电压采样一次。
2.3.3显示子程序
LED数码管采用软件译码动态扫描方式,在显示子程序中包含多循环显示和单路显示程序。
多路循环显示程序把8个存储单元的数值依次取出送到4位数码管上显示,每一路显示一秒。
单路显示程序只对当前选中的一路数据进行显示,每路数据显示时需经过转换变成十进制BCD码放于4个数码管的显示缓冲区中。
单路显示或多路循环显示通过标志位00H控制,在显示控制程序中加入了对单路或多路循环按键和通道选择按键的判断。
3设计原理分析
3.1电路的最小系统
最小系统电路包含复位电路、时钟振荡电路及单路\多路循环控制电路上电自动复位是在加电瞬间通过充电来实现的,在通电瞬间,电容C通过电阻R充电,RST端出现正脉冲,用以复位。
只要电源VCC的上升时间不超过1MS,就可以实现自动上电复位,即接通电源就完成了系统的复位初始化。
而X1、X2是实现单路/多路循环转换按钮。
图4最小系统电路
3.2显示电路
显示电路采用LED数码管显示采用软件译码动态显示,通过AT89C51的P1和P3.0P3.3口控制P1口为LED数码管的子段码输出端,P3.0P3.3口为LED数码管的位选码输出端,通过74LS245驱动,具体电路如图5所示
3.3ADC0809的内部逻辑结构
3.3.1ADC0809内部电路
8路数字电压表主要利用A/D转换器,处理过程是先用A/D转换器对各路电压值进行采样,得到相应的数字量,再按数字量与模拟量成正比关系运算得到对应的模拟电压值,然后把模拟值通过显示器显示出来。
设计时假设待测的输入电压为8路,电压值的范围为0~5V,要求能在4位LED数码管上轮流显示或单路选择显示。
测量的最小分辨率为0.0119V,c测量误差为±0.02V。
:
图5显示电路
根据系统的功能要求,控制系统采用AT89C51单片机,A/D转换器采用ADC0809。
ADC0809是8位精度的A/D转换器。
当输入电压是5V时,输出的数据值为255(0FFH),因此最大分辨率为0.0196V(5∕255)。
ADC0809具有8路模拟量输入端口,通过3位地址输入端能从8路中选择一路进行转换。
如每隔一段时间轮流改变3位地址输入端的地址,就能依次对8路输入电压值进行测量。
LED数码管显示采用软件译码动态显示。
通过按键选择可8路循环显示,也可单路显示。
单路显示可通过按键选择所要显示的通道数。
ADC0809是8路8位ADC芯片,片内有8路模拟开关、地址锁存与译码、256电阻梯形网络、电子开关树、逐次逼近寄存器、比较器和3态输出锁存器等,特别适合与微机接口。
时钟频率=1.26MHz,转换时间=100μs,转换误差≤±1LSB,内含8路数据选择器以便进行8路ADC。
8路8位2进制码LSTTL电平输出,28脚封装。
ADC0809多路开关可选通8个模拟通道,允许8路模拟量分时输入,共用A/D转换器进行转换。
三态输出锁器用于锁存A/D转换完的数字量,当OE端为高电平时,才可以从三态输出锁存器取走转换完的数据。
ADC0809的内部逻辑结构如图6所示。
3.3.2引脚结构
ADC0809具有8路模拟量输入通道IN0~IN7,通过3位地址输入端C、B、A(因脚23、24、25)进行选择。
引脚22为地址锁存控制端ALE,当输入为高电平时,C、B、A引脚输入的地址锁存与ADC0809内部的锁存器中,经内部译码电路译码选中相应的模拟通道。
引脚6为启动转换控制端START,当输入一个2us宽的高电平脉冲时,就启动ADC0809开始对输入通道的模拟量进行转换。
引脚7为A/D转换的结束信号EOC。
ADC0809为逐次比较型A/D转换器,当开始转换时,EOC信号为低电平,经过一定时间,转换结束,转换结束信号EOC输出高电平,转换结果存放与ADC0809内部的输出数据锁存器中。
引脚9为A/D转换数据输出允许控制端OE,当OE为高电平时,存放与输出数据存储器中的数据通过ADC0809的数
图6ADC0809的内部逻辑结构
据线D0~D7输出。
引脚10为ADC0809的时钟信号输入端CLOCK。
在连接时,ADC0809的数据线D0~D7与AT89S51的P0口相连,ADC0809的地址引脚、地址锁存端ALE、启动信号START、数据输出允许控制端OE分别与AT89S51的P2口相连,转换结束信号EOC与AT89S51的P3.7口相连。
时钟信号输入端CLOCK信号,由单片机的地址锁存控制端ALE提供。
单片机的系统时钟为12MHZ。
IN0-IN7:
8条模拟量输入通道
ADC0809对输入模拟量要求:
信号单极性,电压范围是0-5V,若信号太小,必须进行放大;输入的模拟量在转换过程中保持不变,如若模拟量变化太快,则需在输入前增加采样保持电路。
地址输入和控制线:
4条
ALE为地址锁存允许输入线,高电平有效。
当ALE线为高电平时,地址锁存与译码器将A,B,C三条地址线的地址信号进行锁存,经译码后被选中的通道的模拟量进转换器进行转换。
A,B和C为地址输入线,用于选通IN0-IN7上的一路模拟量输入.
数字量输出及控制线:
11条
ST为转换启动信号。
当ST上跳沿时,所有内部寄存器清零;下跳沿时,开始进行A/D转换;在转换期间,ST应保持低电平。
EOC为转换结束信号。
当EOC为高电平时,表明转换结束;否则,表明正在进行A/D转换。
OE为输出允许信号,用于控制三条输出锁存器向单片机输出转换得到的数据。
OE=1,输出转换得到的数据;OE=0,输出数据线呈高阻状态。
D7-D0为数字量输出线。
CLK为时钟输入信号线。
因ADC0809的内部没有时钟电路,所需时钟信号必须由外界提供,通常使用频率为1MHZ,VREF(+),VREF(-)为参考电压输入。
3.3.3ADC0809工作原理
8路模拟信号由ADC0809的IN0~IN7端输入,AT89S51单片机的ALE端口输出的脉冲信号送ADC0809的10脚作为ADC的时钟信号(产生CLK信号的方法就得用软件来产生)。
A/D转换完成之后,从EOC端返回AT89S51一个转换结束信号,单片机随即用
信号将A/D转换的数字输出从D0~D7端经P0口数据总线读入自己的存储器中。
A/D转换过程全部结束。
再经软件程序转换成a~g7段码输出,驱动LED数码管。
各位数码管由位控信号P3.0、P3.1、P3.2、P3.3控制,由74LS245反相驱动将依次巡回点亮数码管。
3.474LS245工作原理
74LS245是我们常用的芯片,用来驱动led或者其他的设备,他是8路同相三态双向总线收发器,可双向传输数据。
74LS245还具有双向三态功能,既可以输出,也可以输入数据。
当8051单片机的P0口总线负载达到或超过P0最大负载能力时,必须接入74LS245等总线驱动器。
当片选端/CE低电平有效时,DIR=“0”,信号由B向A传输;(接收)DIR=“1”,信号由A向B传输;(发送)当/CE为高电平时,A、B均为高阻态。
具体电路有图7所示:
图774LS245原理图
4结束语
通过这次实习,我受益匪浅,对初步设计电路有一个完整的思路。
开始是硬件的设计,整天忙于图书馆和电脑旁查找相关资料,整理材料初步形成大体模式,接着就开始画电路原理图,分析电路。
还有软件设计,运用汇编语言编写程序,并在老师的引导下组装电路板,自己动手焊接元件。
短短几天内,在各位老师的耐心指导和同学的帮助之下,开始在脑海里有了大致的模块,一点点,一块块的电路慢慢拼成完整的电路,于是又开始查找相关的资料,分析电路,根据自己的目的有效的编制程序,对比之下有进一步完善,在形成电路大致模块下又进一步尽可能的减小成本,直到最终电路以自己认为最理想的形式形成。
参考文献
[1]张桂红;单片机原理及应用(第3版).科学技术出版社,2007.2
[2]李朝青.单片机原理及接接口技术[M].北京航空航天大学出版社,1990
[3]彭为,黄科,雷道中;单片机典型系统设计.电子工业出版社,2006.5
[4]周润景,袁伟亭,景晓松;Proteus在MCS-51﹠ARM7系统中的应用百例.电子工业出版社.2006.10
[5]丁元杰.单片机原理及应用[M].北京;机械工业出版社,1996
附录一:
总体电路图
附录二:
程序清单
ORG0000H
LJMPSTART
ORG0030H
;主程序
START:
CLRA
MOVP2,A
MOVR0,#70H
MOVR2,#0DH
LPMEM:
MOV@R0,A
INCR0
DJNZR2,LPMEM
MOV20H,#00H
MOVA,#0FFH
MOVP0,A
MOVP1,A
MOVP3,A
MAIN:
LCALLTEST
LCALLDISPLAY
AJMPMAIN
NOP
NOP
NOP
LJMPSTART
;显示子程序
DISPLAY:
JB00H,DISP11
MOVR3,#08H
MOVR0,#70H
MOV7BH,#00H
DISLP1:
LCALLTUNBCD
MOVR2,#0FFH
DISLP2:
LCALLDISP
LCALLKEYWK1
DJNZR2,DISLP2
INCR0
INC7BH
DJNZR3,DISLP1
RET
DISP11:
MOVA,7BH
SUBBA,#01H
MOV7BH,A
ADDA,#70H
MOVR0,A
DISLP11:
LCALLTUNBCD
MOVR2,#0FFH
DISLP22:
LCALLDISP
LCALLKEYWK2
DJNZR2,DISLP22
INC7BH
RET
;显示数据转换子程序
TUNBCD:
MOVA,@R0
MOVB,#51H
DIVAB
MOV7AH,A
MOVA,B
CLRF0H
SUBBA,#1AH
MOVF0H,C
MOVA,#10H
MULAB
MOVB,#51H
DIVAB
JBF0H,LP2
ADDA,#05H
LP2:
MOV79H,A
MOVA,B
CLRF0H
SUBBA,#1AH
MOVF0H,C
MOVA,#10H
MULAB
MOVB,#51H
DIVAB
JBF0H,LP3
ADDA,#05H
LP3:
MOV78H,A
RET
;LED扫描显示子程序
DISP:
MOVR1,#78H
MOVR5,#0FEH
PLAY:
MOVP1,#0FFH
MOVA,R5
ANLP3,A
MOVA,@R1
MOVDPTR,#TAB
MOVCA,@A+DPTR
MOVP1,A
JBP3.2,PLAY1
CLRP1.7
PLAY1:
LCALLDL1MS
INCR1
MOVA,P3
JNBACC.3,ENDOUT
RLA
MOVR5,A
MOVP3,#0FFH
AJMPPLAY
ENDOUT:
MOVP3,#0FFH
MOVP1,#0FFH
RET
;字段码表
TAB:
DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH
;延时10MS子程序
DL10MS:
MOVR6,#0D0H
DL1:
MOVR7,#10H
DL2:
DJNZR7,DL2
DJNZR6,DL1
RET
;延时1ms子程序
DL1MS:
MOVR4,#0FFH
DL3:
DJNZR4,DL3
MOVR4,#0FFH
DL4:
DJNZR4,DL4
RET
;A/D转换子程序
TEST:
CLRA
MOVP2,A
MOVR0,#70H
MOVR7,#08H
LCALLTESTART
WAIT:
JBP3.7,MOVD
AJMPWAIT
TESTART:
SETBP2.3
NOP
NOP
CLRP2.3
SETBP2.4
NOP
NOP
CLRP2.4
NOP
NOP
NOP
NOP
RET
MOVD:
SETBP2.5
MOVA,P0
MOV@R0,A
CLRP2.5
INCR0
MOVA,P2
INCA
MOVP2,A
CJNEA,#08H,TESTEND
TESTEND:
JCTESTCON
CLRA
MOVP2,A
MOVA,#0FFH
MOVP0,A
MOVP1,A
MOVP2,A
RET
TESTCON:
LCALLTESTART
LJMPWAIT
;按键检测子程序
KEYWK1:
JNBP3.5,KEY1
KEYOUT:
RET
KEY1:
LCALLDISP
JBP3.5,KEYOUT
WAIT11:
JNBP3.5,WAIT12
CPL00H
MOVR2,#0AH
MOVR3,#01H
RET
WAIT12:
LCALLDISP
AJMPWAIT11
KEYWK2:
JNBP3.5,KEY1
JNBP3.6,KEY2
RET
KEY2:
LCALLDISP
JBP3.6,KEYOUT
WAIT22:
JNBP3.6,WAIT21
INC7BH
MOVA,7BH
CJNEA,#08H,KEYOUT11
KEYOUT11:
JCKEYOUT1
MOV7BH,#00H
KEYOUT1:
RET
WAIT21:
LCALLDISP
AJMPWAIT22
END