多路数字电压表的设计.docx
- 文档编号:4487579
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:14
- 大小:108.96KB
多路数字电压表的设计.docx
《多路数字电压表的设计.docx》由会员分享,可在线阅读,更多相关《多路数字电压表的设计.docx(14页珍藏版)》请在冰豆网上搜索。
多路数字电压表的设计
8.3多路数字电压表的设计
数字电压表是电子测量中经常用到的电子器件,传统的指针式电压表功能单一、精度低、不能满足数字时代的要求。
而采用单片机的数字电压表精度高、抗干扰能力强、可扩展性强、使用方便,在日常生活中广泛应用。
8.3.1多路数字电压表的功能要求
多路数字电压表的功能要求如下:
(1)输入电压为8路。
(2)电压值的范畴为0~5V。
(3)测量的最小分辨率为0.019V,测量误差为0.02V。
。
(4)能通过显示器显示通道和通道电压,有效位数为小数点后两位
8.3.2多路数字电压表的总体设计
多路数字电压表的总体结构如图8.9所示,处理过程如下:
先用A/D转换器对各路电压值进行采样,得到相应的数字量,再按数字量与模拟量成正比关系运算得到对应的模拟电压值,然后把模拟值通过显示器显示出来,另外可以通过按键选择通道。
图8.9多路数字电压表的总体结构图
根据系统的功能要求,控制系统采用AT89C52单片机,A/D转换器采用ADC0808(0809)。
ADC0808(0809)是8位的A/D转换器。
当输入电压为5.00V时,输出的数据值为255(0FFH),因此最大分辨率为0.0196V(5/255)。
ADC0808(0809)具有8路模拟量输入端口,通过3位地址输入端能从8路中选择一路进行转换。
如每隔一段时间依次轮流改变3位地址输入端的地址,就能依次对8路输入电压进行测量。
显示器采用LCD显示器,显示效果好。
按键可只设定一个,用于选择显示的当前通道。
8.3.3多路数字电压表硬件电路
多路数字电压表具体硬件电路如图8.10所示。
图8.10多路数字电压表的电路原理图
其中,ADC0808(0809)的数据线D0~D7与AT89C52的P2口相连,地址输入端ADDA、ADDB、ADDC与AT89C52的P3口的低3位P3.0、P3.1、P3.2相连,地址锁存控制端ALE和启动信号START连接在一起与P3.7相连,数据输出允许控制端OE与P3.6相连,转换结束信号EOC与P1.3相连。
ADC0809的时钟信号输入端CLOCK与P1.4相连,而P1.4由定时/计数器0控制,每10s取反一次,则CLOCK的时钟周期为20s,频率为50KHz,满足ADC0808(0809)的时钟要求。
参考电压VREF+接+5V电源,参考电压VREF-接地,则当输入电压为5.00V时,输出的数据值为255(0FFH),当输入电压为0V时,输出的数据值为0(00H),最大分辨率为0.0196V(5/255)。
显示器LCD1602的数据线与89C52的P0口相连,RS与P1.7相连,R/
与P1.6相连,E端与P1.5相连。
按键只设定了一个K1,与AT89C52的P1.0,用于进行通道选择,当按下一次,通道加1,显示下一个通道。
8.3.4多路数字电压表软件程序
多路数字电压表系统软件程序由主程序、A/D转换子程序和显示驱动程序组成,这里只介绍主程序、A/D转换子程序。
1.主程序
主程序流程如图8.11所示。
首先是对定时计数器和LCD初始化,在LCD上显示提示信息,然后进入循环,在循环中依次为:
调用A/D转换子程序对8个通道转换一次,判通道键是否按下,按下则当前通道地址加1,当前通道值转换成电压值,
显示当前通道。
2.A/D转换子程序
A/D转换子程序用于对ADC0808的8路输入模拟电压进行一次A/D转换,并将转换的数值存入8个相应的存储单元中,流程图如图8.12所示。
A/D转换子程序每隔一定时间调用一次,即隔一段时间对输入电压采样一次。
图8.11主程序流程图8.12A/D转换子程序流程
3.汇编语言源程序清单
;30H~37H存放转换的数字量
;38H~3BH分别放电压当前通道电压的个位、小数点后1位、小数点后2位
;3CH单片为通道计数器
RSBITP1.7;定义LCD1602端口线
RWBITP1.6
EBITP1.5
STBITP3.7;定义0808控制线
OEBITP3.6
EOCBITP1.3
CLKBITP1.4
KEY1BITP1.0;通道选择按键
ORG0000H
LJMPMAIN
ORG000BH
CPLCLK;定时/计数器0中断,产生转换时钟
RETI
ORG50H
;主程序
MAIN:
MOVSP,#50H
MOV39H,#'.'
MOVTMOD,#02H
MOVTH0,#246
MOVTL0,#246
SETBET0
SETBEA
SETBTR0
LCALLDL10MS
ACALLINIT
MOVA,#81H;写入显示缓冲区起始地址为第1行第1列
ACALLWC51R
MOVA,#'A';第1行第2列显示字母'H'
ACALLWC51DDR
MOVA,#'D';第1行第3列显示字母"O"
ACALLWC51DDR
MOVA,#'D';第1行第4列显示字母'W'
ACALLWC51DDR
MOVA,#'R';第1行第5列显示字母'U'
ACALLWC51DDR
MOVA,#':
';第2行第6列显示字母'!
'
ACALLWC51DDR
MOVA,#0C0H;写入显示缓冲区起始地址为第2行第5列
ACALLWC51R
MOVA,#'V';第2行第5列显示字母'A'
ACALLWC51DDR
MOVA,#'A';第2行第6列显示字母'R'
ACALLWC51DDR
MOVA,#'L';第2行第7列显示字母'E'
ACALLWC51DDR
MOVA,#'U';第2行第8列显示字母''
ACALLWC51DDR
MOVA,#'E';第2行第9列显示字母'Y'
ACALLWC51DDR
MOVA,#':
';第2行第10列显示字母'O'
ACALLWC51DDR
LOOP:
LCALLTEST;调用ADC0808转换程序8个通道转换一次
JBKEY1,NEXT;有键按下,当前通道地址加1
WAIT2:
JNBKEY1,WAIT2
INC3CH
MOVA,3CH
CJNEA,#08,NEXT
MOV3CH,#00
NEXT:
MOVA,#30H;取出当前通道值,转换成电压值所对应的字符
ADDA,3CH
MOVR0,A
MOVA,@R0
MOVB,#51
DIVAB
ADDA,#30H
MOV38H,A
MOVA,B
CLRF0
SUBBA,#1AH
MOVF0,C
MOVA,#10
MULAB
MOVB,#51
DIVAB
JBF0,LOOP2
ADDA,#5
LOOP2:
ADDA,#30H
MOV3AH,A
MOVA,B
CLRF0
SUBBA,#1AH
MOVF0,C
MOVA,#10
MULAB
MOVB,#51
DIVAB
JBF0,LOOP3
ADDA,#5
LOOP3:
ADDA,#30H
MOV3BH,A
MOVA,#88H;写入显示缓冲区起始地址为第1行第9列
ACALLWC51R
MOVA,3CH
ADDA,#30H;第1行第9列显示通道号
ACALLWC51DDR
MOVA,#0C8H;写入显示缓冲区起始地址为第2行第9列
ACALLWC51R
MOVA,38H;第2行第9列显示整数部分
ACALLWC51DDR
MOVA,39H;第2行第10列显示小数点
ACALLWC51DDR
MOVA,3AH;第2行第11列显示小数点后1位
ACALLWC51DDR
MOVA,3BH;第2行第12列显示小数点后2位
ACALLWC51DDR
AJMPLOOP
;初始化子程序
INIT:
MOVA,#00000001H;清屏
ACALLWC51R
MOVA,#00111000B;使用8位数据,显示两行,使用5×7的字型
LCALLWC51R
MOVA,#00001100B;显示器开,光标关,字符不闪烁
LCALLWC51R
MOVA,#00000110B;字符不动,光标自动右移一格
LCALLWC51R
RET
;检查忙子程序
F_BUSY:
PUSHACC;保护现场
MOVP0,#0FFH
CLRRS
SETBRW
WAIT:
CLRE
SETBE
JBP0.7,WAIT;忙,等待
POPACC;不忙,恢复现场
RET
;写入命令子程序
WC51R:
ACALLF_BUSY
CLRE
CLRRS
CLRRW
SETBE
MOVP0,ACC
CLRE
RET
;写入数据子程序
WC51DDR:
ACALLF_BUSY
CLRE
SETBRS
CLRRW
SETBE
MOVP0,ACC
CLRE
RET
;*****************************************************
;A/D转换子程序,8个通道转换一次转换结果依次存入30H~37H
;*****************************************************
TEST:
MOVR0,#30H
MOVR2,#00H
TESTART:
MOVP2,#0FFH
MOVA,R2
MOVP3,A
CLRST
NOP
NOP
SETBST
NOP
NOP
CLRST
NOP
NOP
WAIT1:
JNBEOC,WAIT1
MOVD:
SETBOE
NOP
NOP
MOVA,P2
MOV@R0,A
CLROE
NOP
NOP
INCR0
INCR2
CJNER2,#8,TESTART
RET
;*************************************
;延时子程序
;*************************************
DL10MS:
MOVR6,#0D0H;延时10MS子程序
DL1:
MOVR7,#10H
DL2:
DJNZR7,DL2
DJNZR6,DL1
RET
END
4.C语言源程序清单
#include
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitRS=P1^7;//定义LCD1602端口线
sbitRW=P1^6;
sbitEN=P1^5;
sbitST=P3^7;//定义0808控制线
sbitOE=P3^6;
sbitEOC=P1^3;
sbitCLK=P1^4;
sbitkey1=P1^0;//通道选择按键
uchardatachnumber;//存放当前通道号
uchardisbuffer[4]={0,'.',0,0};//定义显示缓冲区
uchardataad_data[8]={0,0,0,0,0,0,0,0};//0808的8个通道转换数据缓冲区
uinttemp;
//检查忙函数
voidfbusy()
{
P0=0xff;
RS=0;
RW=1;
EN=1;
EN=0;
while((P0&0x80))
{
EN=0;
EN=1;
}
}
//写命令函数
voidwc51r(ucharj)
{
fbusy();
EN=0;
RS=0;
RW=0;
EN=1;
P0=j;
EN=0;
}
//写数据函数
voidwc51ddr(ucharj)
{
fbusy();//读状态;
EN=0;
RS=1;
RW=0;
EN=1;
P0=j;
EN=0;
}
voidinit()
{
wc51r(0x01);//清屏
wc51r(0x38);//使用8位数据,显示两行,使用5*7的字型
wc51r(0x0c);//显示器开,光标开,字符不闪烁
wc51r(0x06);//字符不动,光标自动右移一格
}
/********0808转换子函数********/
test()
{
ucharm;
for(m=0;m<8;m++)
{
P3=m;//送通道地址
ST=0;_nop_();_nop_();ST=1;_nop_();_nop_();ST=0;//锁存通道地址启动转换
_nop_();_nop_();_nop_();_nop_();
while(EOC==0);//等待转换结束
OE=1;ad_data[m]=P2;OE=0;//读取当前通道转换数据
}
}
//************延时函数************
voiddelay(uinti)//延时函数
{uinty,j;
for(j=0;j
for(y=0;y<0xff;y++){;}}
}
//定时器/计数器T0产生0808的时钟
voidT0X(void)interrupt1using0
{CLK=~CLK;}
voidmain(void)
{
uchari;
SP=0X50;TMOD=0x02;TH0=246;TL0=246;
ET0=1;EA=1;TR0=1;
delay(10);
init();
wc51r(0x81);//写入显示缓冲区起始地址为第1行第1列
wc51ddr('A');//第1行第1列显示字母A
wc51ddr('D');//第1行第2列显示字母D
wc51ddr('D');//第1行第3列显示字母D
wc51ddr('R');//第1行第4列显示字母R
wc51ddr(':
');//第1行第4列显示字母:
wc51r(0xC0);//写入显示缓冲区起始地址为第2行第1列
wc51ddr('V');//第2行第1列显示字母V
wc51ddr('A');//第2行第2列显示字母A
wc51ddr('L');//第2行第3列显示字母L
wc51ddr('U');//第2行第4列显示字母U
wc51ddr('E');//第2行第5列显示字母E
wc51ddr(':
');//第2行第6列显示字母:
while
(1)
{
test();//调用ADC0808转换程序8个通道转换一次
if(key1==0){while(key1==0);chnumber++;if(chnumber==8)chnumber=0;}
//有键按下,当前通道地址加1
temp=ad_data[chnumber];//取出当前通道值,转换成电压值所对应的字符
temp=(temp*100)/51;
disbuffer[0]=temp/100+0x30;temp=temp%100;
disbuffer[2]=temp/10+0x30;
disbuffer[3]=temp%10+0x30;
wc51r(0x88);
wc51ddr(chnumber+0x30);
wc51r(0xc8);//显示当前通道
for(i=0;i<4;i++)wc51ddr(disbuffer[i]);
}
}
如有侵权请联系告知删除,感谢你们的配合!
如有侵权请联系告知删除,感谢你们的配合!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 路数 电压表 设计