并行8位ADC0809电压测量.docx
《并行8位ADC0809电压测量.docx》由会员分享,可在线阅读,更多相关《并行8位ADC0809电压测量.docx(29页珍藏版)》请在冰豆网上搜索。
![并行8位ADC0809电压测量.docx](https://file1.bdocx.com/fileroot1/2023-1/23/a684b616-0204-4dc6-b385-448da18780ed/a684b616-0204-4dc6-b385-448da18780ed1.gif)
并行8位ADC0809电压测量
实验十三 并行A/D(电压测量)实验
一、实验目的:
1、了解ADC0809的转换性能及编程方法;
2、掌握ADC0809与8051单片机的接口方法;
二、实验内容:
1、为了方便观察,将实验例程中ADC0809采集到的数字量以十进制格式显示在右边三位数码管上;
原理图:
流程图:
开始 外中断0入口 数码管扫描子程序
开外中断0 (DPTR)->A R3->A、TAB->DPTR
(A+DPTR)->A
0809通道0->DPTR 个十百->R1/R2/R3 PA->DPTR,A->(DPTR)
01H->P1,延时
启动A/D转换 数码管扫描
R2->A、TAB->DPTR
原地跳转 启动A/D转换 (A+DPTR)->A
PA->DPTR,A->(DPTR)
中断返回 02H->P1,延时
R2->A、TAB->DPTR
(A+DPTR)->A
PA->DPTR,A->(DPTR)
02H->P1,延时
返回
汇编源程序:
/*
中断字子程序中读取A/D转换结果,采用除法分别把对应十进制百十个位赋给R3、R2、R1
引用数码管扫描程序
*/
AD0809 EQU 0F000H
COM_ADDXDATA0E003H
PA_ADD XDATA0E000H
ORG 0000H
AJMP START
ORG 0003H
AJMP EXINT0
ORG 0030H
START:
MOV SP,#60H
MOVDPTR,#COM_ADD
MOVA,#80H ;PA输出
MOVX@DPTR,A
SETBIT0
SETBEX0
SETBEA
MOV DPTR,#AD0809 ;启动A/D转换
MOVX@DPTR,A
AJMP$
EXINT0:
MOVXA,@DPTR ;读取A/D转换结果
MOVB,#0AH ;R1,R2,R3分别存低到高三位数
DIVAB
MOVR1,B
MOVB,#0AH
DIVAB
MOVR2,B
MOVR3,A
ACALLFLASH ;数码管扫描
MOV DPTR,#AD0809 ;调用数码管扫描之后DPTR地址改后,必须重新赋值
MOVX@DPTR,A ;启动A/D转换
RETI
FLASH:
MOV P1,#01H ;最高位
MOV A,R3
MOV DPTR,#TABFLA
MOVC A,@A+DPTR
MOV DPTR,#PA_ADD
MOVX @DPTR,A
ACALLDELAY
MOVP1,#02H ;段码
MOVA,R2 ;位码
MOVDPTR,#TABFLA
MOVCA,@A+DPTR
MOVDPTR,#PA_ADD
MOVX@DPTR,A
ACALLDELAY
MOVP1,#04H ;低位
MOVA,R1
MOVDPTR,#TABFLA
MOVCA,@A+DPTR
MOVDPTR,#PA_ADD
MOVX@DPTR,A
ACALLDELAY
RET
DELAY:
MOV R6,#20
DELAY1:
MOV R5,#250
DJNZ R5,$
DJNZ R6,DELAY1
RET
TABFLA:
DB0C0H,0F9H,0A4H,0B0H,99H ;0~4
DB92H,82H,0F8H,80H,90H,88H ;5~A
DB83H,0C6H,0A1H,86H,8EH ;B~F
END
C语言源程序:
#include
xdataunsignedcharADDR_0809_at_0xf000;
xdataunsignedcharCOM_ADDR_at_0xe003;
xdataunsignedcharPA_at_0xe000;
constunsignedcharTAB[]={0xC0,0xF9,0xA4,0xB0,0x99,
0x92,0x82,0xF8,0x80,0x90};
voiddelay()
{ //延时
unsignedinti;
for(i=0;i<3000;i++)
{;}
}
voidshow(inta,intb,intc) //数码管显示
{
P1=0x01;
PA=TAB[a];
delay();
P1=0x02;
PA=TAB[b];
delay();
P1=0x04;
PA=TAB[c];
delay();
}
voidexint0()interrupt0using1
{
unsignedintbai,shi,ge;
bai=ADDR_0809;
ge=bai%0x0a; //提取个百十位
bai=bai/0x0a;
shi=bai%0x0a;
bai=bai/0x0a;
show(bai,shi,ge);
ADDR_0809=0;
}
main()
{
COM_ADDR=0x80; //PA输出
IT0=1;
EX0=1;
EA=1;
ADDR_0809=0;
while
(1)
{;}
}
2、将实验仪上DAC0832的输出”OUT”接线柱接到ADC0809的通道3(IN3),程序运行时自动调整写入DAC0832的数字量,使得ADC0809测量到的值为100+5。
原理图:
流程图:
开始 外中断0入口
8255初始化 0832
开中断0 0809->DPTR
0809通道3地址->DPTR (DPTR)->A
A->R0
启动A/D转换 个百十->R1/R2/R3
数码管扫描
原地跳转
启动A/D转换
0832 R0->A
0832->DPTR A=5B?
是
R0->A 否
A->(DPTR) A>5B?
是
延时 否
R0+1->R0
返回 R0-1->R0
返回
汇编源程序:
/*
中断字子程序中读取A/D转换结果,采用除法分别把对应十进制百十个位赋给R3、R2、R1
引用数码管扫描程序
采用减法比较,0832传递值是否达到100
*/
AD0809 EQU 0F003H
DA0832 XDATA 0E000H ;CS2
COM_ADD XDATA 0D003H ;CS3
PA_ADD XDATA 0D000H
ORG 0000H
AJMP START
ORG 0003H
AJMP EXINT0
ORG 0030H
START:
MOV SP,#60H
MOVDPTR,#COM_ADD
MOVA,#80H ;PA输出
MOVX@DPTR,A
SETBIT0
SETBEX0
SETBEA
MOV DPTR,#AD0809 ;启动A/D转换
MOVX@DPTR,A
AJMP$
EXINT0:
ACALL DADA0832
MOV DPTR,#AD0809
MOVXA,@DPTR ;读取A/D转换结果
MOV R0,A
MOVB,#0AH ;R1,R2,R3分别存低到高三位数
DIVAB
MOVR1,B
MOVB,#0AH
DIVAB
MOVR2,B
MOVR3,A
ACALLFLASH ;数码管扫描
LOOP:
MOV DPTR,#AD0809 ;启动A/D转换
MOVX@DPTR,A
MOV A,R0
SUBB A,#5BH
;与91比较,本来是该与100比较的,调试的时候数据传递过程中会自动加9或10左右
JZ OUT ;相等,不调整
JC INCC ;小于,增加
JNC DECC ;大于,减小
INCC:
INC R0
AJMP LOOP
DECC:
DEC R0
AJMP LOOP
OUT:
RETI
FLASH:
MOV P1,#01H ;最高位
MOV A,R3
MOV DPTR,#TABFLA
MOVC A,@A+DPTR
MOV DPTR,#PA_ADD
MOVX @DPTR,A
ACALLDELAY
MOVP1,#02H ;段码
MOVA,R2 ;位码
MOVDPTR,#TABFLA
MOVCA,@A+DPTR
MOVDPTR,#PA_ADD
MOVX@DPTR,A
ACALLDELAY
MOVP1,#04H ;低位
MOVA,R1
MOVDPTR,#TABFLA
MOVCA,@A+DPTR
MOVDPTR,#PA_ADD
MOVX@DPTR,A
ACALLDELAY
RET
DADA0832:
MOV DPTR,#DA0832 ;DAC0832
MOV A,R0
MOVX @DPTR,A
ACALL DELAY
RET
DELAY:
MOV R6,#20
DELAY1:
MOV R5,#250
DJNZ R5,$
DJNZ R6,DELAY1
RET
TABFLA:
DB0C0H,0F9H,0A4H,0B0H,99H ;0~4
DB92H,82H,0F8H,80H,90H,88H ;5~A
DB83H,0C6H,0A1H,86H,8EH ;B~F
END
C语言源程序:
#include
xdataunsignedcharADDR_0809_at_0xf003;
xdataunsignedcharADDR_0832_at_0xe000;
xdataunsignedcharCOM_ADDR_at_0xd003;
xdataunsignedcharPA_at_0xd000;
unsignedchara0;
constunsignedcharTAB[]={0xC0,0xF9,0xA4,0xB0,0x99,
0x92,0x82,0xF8,0x80,0x90};
voiddelay() //延时
{
unsignedinti;
for(i=0;i<3000;i++)
{;}
}
voidshow(inta,intb,intc) //数码管显示
{
P1=0x01;
PA=TAB[a];
delay();
P1=0x02;
PA=TAB[b];
delay();
P1=0x04;
PA=TAB[c];
delay();
}
voidexint0()interrupt0using1
{
unsignedintbai,shi,ge;
ADDR_0832=a0;
delay();
bai=ADDR_0809; //提取个百十位
a0=bai;
ge=bai%0x0a;
bai=bai/0x0a;
shi=bai%0x0a;
bai=bai/0x0a;
show(bai,shi,ge);
//;与91比较,本来是该与100比较的,调试的时候数据传递过程中会自动加9或10左右
while(a0!
=0x5B)
{
if(a0>0x5b) a0--;
elseif(a0<0x5b) a0++;
}
ADDR_0809=0;
}
main()
{
COM_ADDR=0x80;
IT0=1;
EX0=1;
EA=1;
a0=0x64;
ADDR_0809=0;
while
(1)
{;}
}
3、将试验仪上电位器输出“0-5V”接ADC0809的通道0(IN0),DAC0832的输出“OUT”接ADC0809的通道3(IN3),先调整电位器输出2.5V的电压,程序运行时根据通道0读入的数值对DAC0832的输出进行校准,自动调整写入DAC0832的数字量,使DAC0832输出地电压随电位器输出电压变化。
原理图:
流程图:
开始 外中断入口
开外中断0 R0=0?
否
是
00->R0,0->R7 通道0->DPTR 通道3->DPTR
(DPTR)->A (DPTR)->A
通道0->DPTR A->R4、A->R6
启动A/D转换 R4->A
R7->A A-R7->A
原地跳转 是 A=0?
个百十->R1/R2/R3 否
A>0 否
数码管扫描 是
R7-1->R7
0832->DPTR R6-1->R6
R6->A
A->(DPTR) R7+1->R7
R6+1->R6
R0=0?
否
是
启动通道3
01->R0
启动通道0
返回 0->R0
汇编源程序:
/*
中断字子程序中读取A/D转换结果,采用除法分别把对应十进制百十个位赋给R3、R2、R1
引用数码管扫描程序
采用反馈值与校准值比较,调整0832的输入值
注意通道的不同
*/
AD0809 EQU 0F000H ;IN0
AD30809 EQU0F003H ;IN3
DA0832 XDATA 0E000H ;CS2
COM_ADD XDATA 0D003H ;CS3
PA_ADD XDATA 0D000H
ORG 0000H
AJMP START
ORG 0003H
AJMP EXINT0
ORG 0030H
START:
MOV SP,#60H
MOVDPTR,#COM_ADD
MOVA,#80H ;PA输出
MOVX@DPTR,A
SETBIT0
SETBEX0
SETBEA
;用R0判断通道,R7用于数码管显示,R4存IN0的精确电压值,R6存调整后0832的精确输入值
MOVR0,#00H
MOVR7,#00H
MOV DPTR,#AD0809 ;启动IN0的A/D转换
MOVX@DPTR,A
AJMP$
EXINT0:
CJNER0,#00H,RUN3
MOVDPTR,#AD0809 ;读取IN0的A/D转换结果
MOVXA,@DPTR
MOVR4,A
MOVR6,A
AJMPOUT
RUN3:
MOVDPTR,#AD30809 ;读取IN3的A/D转换结果
MOVXA,@DPTR
MOVR7,A
LOOP1:
MOVA,R4
SUBB A,R7
;校正调整0832的传递值
JZ OUT ;相等,不调整
JC DECC ;IN0小于,减小
JNC INCC ;IN0大于,增加
INCC:
INC R7 ;调整R7,使之与精确值相等
INC R6
AJMP LOOP1
DECC:
DEC R7
DEC R6
AJMP LOOP1
OUT:
MOVA,R7 ;R7存储0832的传递值
MOVB,#0AH ;R1,R2,R3分别存