并行8位ADC0809电压测量.docx

上传人:b****6 文档编号:7392496 上传时间:2023-01-23 格式:DOCX 页数:29 大小:122.41KB
下载 相关 举报
并行8位ADC0809电压测量.docx_第1页
第1页 / 共29页
并行8位ADC0809电压测量.docx_第2页
第2页 / 共29页
并行8位ADC0809电压测量.docx_第3页
第3页 / 共29页
并行8位ADC0809电压测量.docx_第4页
第4页 / 共29页
并行8位ADC0809电压测量.docx_第5页
第5页 / 共29页
点击查看更多>>
下载资源
资源描述

并行8位ADC0809电压测量.docx

《并行8位ADC0809电压测量.docx》由会员分享,可在线阅读,更多相关《并行8位ADC0809电压测量.docx(29页珍藏版)》请在冰豆网上搜索。

并行8位ADC0809电压测量.docx

并行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分别存

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 财务管理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1