1、并行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 原地跳转
2、 启动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 0F000HCOM_ADD XDATA 0E003HPA_ADD XDATA 0E000HORG 0000HAJMP STARTORG 0003HAJMP EXINT0ORG 0030HSTART:MOV SP,#60HMOV DPTR,
3、#COM_ADDMOV A,#80H ;PA输出MOVX DPTR,ASETB IT0SETB EX0SETB EAMOV DPTR,#AD0809 ;启动A/D转换MOVX DPTR,AAJMP $EXINT0:MOVX A,DPTR ;读取A/D转换结果MOV B,#0AH ;R1,R2,R3 分别存低到高三位数DIV ABMOV R1,BMOV B,#0AHDIV ABMOV R2,BMOV R3,AACALL FLASH ;数码管扫描MOV DPTR,#AD0809 ;调用数码管扫描之后DPTR地址改后,必须重新赋值 MOVX DPTR,A ; 启动A/D转换RETIFLASH: MO
4、V P1,#01H ;最高位MOV A,R3MOV DPTR,#TABFLAMOVC A,A+DPTRMOV DPTR,#PA_ADDMOVX DPTR,AACALL DELAYMOV P1,#02H ;段码MOV A,R2 ;位码MOV DPTR,#TABFLAMOVC A,A+DPTRMOV DPTR,#PA_ADDMOVX DPTR,AACALL DELAY MOV P1,#04H ;低位MOV A,R1MOV DPTR,#TABFLAMOVC A,A+DPTRMOV DPTR,#PA_ADDMOVX DPTR,AACALL DELAYRETDELAY: MOV R6,#20DELAY1
5、:MOV R5,#250DJNZ R5,$DJNZ R6,DELAY1RETTABFLA:DB 0C0H,0F9H,0A4H,0B0H,99H ;04DB 92H,82H,0F8H,80H,90H,88H ;5ADB 83H,0C6H,0A1H,86H,8EH ;BFENDC语言源程序:#includexdata unsigned char ADDR_0809 _at_ 0xf000;xdata unsigned char COM_ADDR _at_ 0xe003;xdata unsigned char PA _at_ 0xe000;const unsigned char TAB=0xC0,0
6、xF9,0xA4,0xB0,0x99, 0x92,0x82,0xF8,0x80,0x90;void delay() /延时 unsigned int i; for(i=0;iDPTR 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) A5B? 是 延时 否 R0+1-R0 返回 R0-1-R0 返回 汇编源程序:/* 中断字子程序中读取A/D转换结果,采用除法分别把对应十进制百十个位赋给R3、R2、R1 引用数码管扫描程
7、序 采用减法比较,0832传递值是否达到100*/AD0809 EQU 0F003HDA0832 XDATA 0E000H ;CS2COM_ADD XDATA 0D003H ;CS3PA_ADD XDATA 0D000HORG 0000HAJMP STARTORG 0003HAJMP EXINT0ORG 0030HSTART:MOV SP,#60HMOV DPTR,#COM_ADDMOV A,#80H ;PA输出MOVX DPTR,ASETB IT0SETB EX0SETB EAMOV DPTR,#AD0809 ;启动A/D转换MOVX DPTR,AAJMP $EXINT0:ACALL DAD
8、A0832MOV DPTR,#AD0809MOVX A,DPTR ;读取A/D转换结果MOV R0,AMOV B,#0AH ;R1,R2,R3 分别存低到高三位数DIV ABMOV R1,BMOV B,#0AHDIV ABMOV R2,BMOV R3,AACALL FLASH ;数码管扫描LOOP:MOV DPTR,#AD0809 ;启动A/D转换 MOVX DPTR,AMOV A,R0SUBB A,#5BH ;与91比较,本来是该与100比较的,调试的时候数据传递过程中会自动加9或10左右JZ OUT ;相等,不调整JC INCC ;小于,增加JNC DECC ;大于,减小INCC:INC
9、R0AJMP LOOP DECC:DEC R0AJMP LOOP OUT:RETIFLASH: MOV P1,#01H ;最高位MOV A,R3MOV DPTR,#TABFLAMOVC A,A+DPTRMOV DPTR,#PA_ADDMOVX DPTR,AACALL DELAYMOV P1,#02H ;段码MOV A,R2 ;位码MOV DPTR,#TABFLAMOVC A,A+DPTRMOV DPTR,#PA_ADDMOVX DPTR,AACALL DELAY MOV P1,#04H ;低位MOV A,R1MOV DPTR,#TABFLAMOVC A,A+DPTRMOV DPTR,#PA_A
10、DDMOVX DPTR,AACALL DELAYRETDADA0832:MOV DPTR,#DA0832 ;DAC0832MOV A,R0MOVX DPTR,AACALL DELAYRETDELAY: MOV R6,#20DELAY1:MOV R5,#250DJNZ R5,$DJNZ R6,DELAY1RETTABFLA:DB 0C0H,0F9H,0A4H,0B0H,99H ;04DB 92H,82H,0F8H,80H,90H,88H ;5ADB 83H,0C6H,0A1H,86H,8EH ;BFENDC语言源程序:#includexdata unsigned char ADDR_0809 _
11、at_ 0xf003;xdata unsigned char ADDR_0832 _at_ 0xe000;xdata unsigned char COM_ADDR _at_ 0xd003;xdata unsigned char PA _at_ 0xd000;unsigned char a0;const unsigned char TAB=0xC0,0xF9,0xA4,0xB0,0x99, 0x92,0x82,0xF8,0x80,0x90;void delay() /延时 unsigned int i; for(i=0;i0x5b) a0-; else if(a0R0,0-R7 通道0-DPTR
12、 通道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 否 A0 否 数码管扫描 是 R7-1-R70832-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的输入值 注意通道的不同*/AD0
13、809 EQU 0F000H ;IN0AD30809 EQU 0F003H ;IN3DA0832 XDATA 0E000H ;CS2COM_ADD XDATA 0D003H ;CS3PA_ADD XDATA 0D000HORG 0000HAJMP STARTORG 0003HAJMP EXINT0ORG 0030HSTART:MOV SP,#60HMOV DPTR,#COM_ADDMOV A,#80H ;PA输出MOVX DPTR,ASETB IT0SETB EX0SETB EA;用R0判断通道,R7用于数码管显示,R4存IN0的精确电压值,R6存调整后0832的精确输入值MOV R0,#00
14、HMOV R7,#00HMOV DPTR,#AD0809 ;启动IN0的A/D转换MOVX DPTR,AAJMP $EXINT0:CJNE R0,#00H,RUN3MOV DPTR,#AD0809 ;读取IN0的A/D转换结果MOVX A,DPTRMOV R4,AMOV R6,AAJMP OUTRUN3:MOV DPTR,#AD30809 ;读取IN3的A/D转换结果MOVX A,DPTRMOV R7,ALOOP1:MOV A,R4SUBB A,R7 ;校正调整0832的传递值JZ OUT ;相等,不调整JC DECC ;IN0小于,减小JNC INCC ;IN0大于,增加INCC:INC R7 ;调整R7,使之与精确值相等INC R6AJMP LOOP1 DECC:DEC R7DEC R6AJMP LOOP1 OUT:MOV A,R7 ;R7存储0832的传递值MOV B,#0AH ;R1,R2,R3 分别存
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1