89C51使用ADC0808模数转换

1、基本要求简介:

1.1、采用中断方式,利用ADC0808实现8路模拟输入信号依次进行A/D转换。

  要求:采用线选法规定其端口地址,用单片机的P2.7引脚作为片选信号,因此端口地址为7FFFH。片选信号和WR信号一起经或非门产生ADC0808的启动信号START和地址锁存信号ALE;片选信号和RD一起经或非门产生ADC0808输出允许信号OE。EOC信号经反相后接到8051的INT1引脚,用于产生中断请求信号。ADC0808芯片的3位模拟量输入通道地址码输入端A、B、C分别接到8051的P0.0、P0.1、P0.2。8路输入信号的转换结果存储在内部数据存储器首地址为30H开始的单元内,并将第0路转换结果送到P1口显示。

1.2 、采用查询方式,利用ADC0808实现8路模拟输入信号依次进行A/D转换。

  要求:8051单片机P2.7引脚作为片选信号,ADC0808芯片3位模拟量输入通道地址码输入端A、B、C分别接8051最低3位地址线,8个通道地址为7F00H~7F07H。需要分别对这8个地址进行写操作来启动A/D转换。ADC0808 EOC信号接8051的P3.3引脚,通过查询P3.3引脚电平状态来判断A/D转换是否完成。

2、ADC0808简介

  ADC0808 是含8 位A/D 转换器、8 路多路开关,以及与微型计算机兼容的控制逻辑的CMOS组件,其转换方法为逐次逼近型。ADC0808的精度为 1/2LSB。在AD 转换器内部有一个高阻抗斩波稳定比较器,一个带模拟开关树组的256 电阻分压器,以及一个逐次通近型寄存器。8 路的模拟开关的通断由地址锁存器和译码器控制,可以在8 个通道中任意访问一个单边的模拟信号。
ADC0808芯片有28条引脚,采用双列直插式封装,各引脚功能如下:

   152628(IN0~IN7):8路模拟量输入端。
  8141517218位数字量输出端。
  22(ALE):地址锁存允许信号,输入,高电平有效。
  6(START): A/D转换启动脉冲输入端,输入一个正脉冲(至少100ns宽)使其启动(脉冲上升沿使0809复位,下降沿启动A/D转换)。
  7(EOC): A/D转换结束信号,输出,当A/D转换结束时,此端输出一个高电平(转换期间一直为低电平)。
  9(OE):数据输出允许信号,输入,高电平有效。当A/D转换结束时,此端输入一个高电平,才能打开输出三态门,输出数字量。
  10(CLK):时钟脉冲输入端。要求时钟频率不高于640KHZ。
  12(VREF(+))和16(VREF(-)):参考电压输入端
  11(Vcc):主电源输入端。
  13(GND):地。
  2325(ADDA、ADDB、ADDC):3位地址输入线,用于选通8路模拟输入中的一路

在这里插入图片描述
来源百度百科。

3、中断/查询方式

3.1 、采用中断方式

3.1.2、电路原理图

在这里插入图片描述

3.1.3、代码

#include <reg52.h>
#include <absacc.h>
#define uchar unsigned char
#define ADC 0x7fff      //定义ADC0808端口地址

uchar data ADCDat[8] _at_ 0x30;
uchar i = 0;
//主函数
main()
{
    
    
	EX1 = 1;IT1 = 1;EA = 1;
	XBYTE[ADC] = i;  //启动ADC第0通道
	while(1)
	{
    
    
		P1 = ADCDat[0];//0通道转换结果送P1显示	
	}
	
}
//中断服务
int1() interrupt 2 using 1
{
    
    
	ADCDat[i] = XBYTE[ADC]; //读取ADC转换结果
	i++;
	XBYTE[ADC] = i;
	if(i==8)
	{
    
    
		i = 0;
		XBYTE[ADC] = i; //重新启动ADC第0通道
	}
}

3.1.4 、效果图

LED灯显示转换的数据。
在这里插入图片描述

3.2、 采用查询方式

3.2.1、电路原理图

查询方式多了一个译码器。
在这里插入图片描述

3.2.2、代码

#include <reg52.h>
#include <absacc.h>
#define uchar unsigned char
#define uint unsigned int

uchar data ADCDat[8] _at_ 0x30;
uchar i = 0;
uint  ADC = 0x7f00;      //定义ADC0808端口地址
sbit EOC = P3^3;
//读取ADC结果
void ADC_Read()
{
    
    
	ADCDat[i] = XBYTE[ADC] ;//读取ADC0808转换结果
	ADC++;
	i++;
	XBYTE[ADC] = i;
	if(i==8)
	{
    
    
		i = 0;
		ADC = 0x7f00;
		XBYTE[ADC] = i;  //重启ADC0808 第0通道
	}
}
//主函数
main()
{
    
    
	XBYTE[ADC] = 0x00;  //启动ADC第0通道
	while(1)
	{
    
    
		if(EOC==1)  //根据EOC查询状态 读取ADC
		{
    
     
			ADC_Read();  
		}
		P1 = ADCDat[0]; //0通道数据显示
	}
}

3.2.3 、效果图

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_45488643/article/details/107093201