如图一所示是一个八路模拟量输入的巡回监测系统,采样数据依次存放在RAM30H~37H单
元中,按图所示的接口电路,P0.0~P0.2通过74LS373与ADC0809的ABC的八路模拟开关的
地址线相连,请说明图中各路信号的作用,8路模拟量通道地址,编写八路数据采集程序
A0 A7
P0
74LS373A0A1A2
ALE
2
89S51 | INT 1 | ≥1 | | 1 | A | +5V | ||
CLK | B | |||||||
D0 | (+) | GND | ||||||
D7 | (-) | IN0 | ||||||
EOC | ADC0809 | |||||||
WR | ||||||||
START | ||||||||
P2.0 | ≥1 | | ALE | IN7 | ||||
OE | ||||||||
RD |
一个八路模拟量输入的巡回监测系统IN0~IN7:8路模拟量输入端。
D0~D7:8位数字量输出端。
A、B、C:3位地址输入线,用于选择8路模拟通道中的一路。
ALE:地址锁存允许信号,输入,高电平有效。
START:A/D转换启动信号,输入,高电平有效。
EOC:A/D转换结束信号,输出。
0:正在进行转换;
1:一次转换完成。
OE:数据输出允许信号,输入,高电平有效。当转换结束后,如果从该引脚输入高电平,则打开输出三态门,输出锁存器的数据从D0~D7送出。
CLK:时钟脉冲输入端。其内部无时钟电路。要求时钟频率不高于640KHZ.
VR+、VR-:基准电压输入端。决定输入模拟量的范围。典型值分别为+5V和0V。8路模拟通道的地址:0000H~0007H。
汇编语言编程:中断方法
ORG 0000H
LJMP MAIN
ORG 0003H
LJMP INT0
ORG 0100H ;主程序
MAIN: MOV R0,#30H MOV R2,#08H
;设立数据存储区指针
;设置8路采样计数值
SETB IT0 ;设置外部中断0 为边沿触发方式
SETB EA ;CPU 开放中断
SETB EX0 ;允许外部中断0 中断
MOV DPTR,#0000H ;送入口地址并指向IN0
LOOP: MOVX @DPTR,A ;启动A/D 转换,A 的值无意义
HERE: SJMP HERE ;等待中断
ORG 0200H ;中断服务程序
INT0: MOVX A,@DPTR ;读取转换后的数字量
MOV @R0,A ;存入片内RAM 单元
INC DPTR ;指向下一模拟通道
INC R0 ;指向下一个数据存储单元
DJNZ R2,NEXT ;8 路未转换完,则继续
CLR EA ;已转换完,则关中断
CLR EX0 ;禁止外部中断0 中断
RETI ;中断返回
NEXT: MOVX @DPTR,A ;再次启动A/D 转换
RETI ;中断返回
C 语言编程:
#include <reg51.h>
#include <absacc.h> //定义绝对地址访问
#define uchar unsigned char
#define IN0 XBYTE[0x0000] static uchar data x[8];
uchar xdata *ad_adr;
uchar i=0;
void main(void)
{
//定义IN0为通道0的地址
//定义8个单元的数组,存放结果 //定义指向通道的指针
IT0=1; //初始化
EX0=1;
EA=1;
i=0;
ad_adr=&IN0; //指针指向通道0
*ad_adr=i; //启动通道0 转换
for (;;) {;} //等待中断
}
void int_adc(void) interrupt 0 //中断函数
{
x[i]=*ad_adr; //接收当前通道转换结果
i++;
ad_adr++; //指向下一个通道
if(i<8)
{
*ad_adr=i; //8个通道未转换完,启动下一个通道返回}
else
{
EA=0;EX0=0; //8个通道转换完,关中断返回
}
}