ADC0809模数转换与显示原理详解

ADC0809模数转换与显示

目录

ADC0809介绍

一、硬件原理图(proteus仿真)

​编辑

二、代码及详细注释

代码如下(示例):

总结



ADC0809介绍

ADC0809是CMOS工艺8通道,8位逐次逼近式A/D模数转换器。其内部有一个8通道多路开关,它可以根据地址码锁存译码后的信号,只选通8路模拟输入信号中的一个进行A/D转换。该芯片为经典的模数转换芯片,适合初学者学习,认真学习此芯片可以为以后使用其他模数转换芯片打下坚实基础。

其内部结构如图所示

 ADC0809内部由8路模拟量开关、通道地址锁存器、8位A/D转换器和三态数据输出锁存器组成。其中IN0~IN7为8路模拟量输入端,可以分别连接8路单端模拟电压信号。ADDA,ADDB,ADDC为通道选择端,ALE为选通控制信号。当ALE有效时,三个选通信号的不同点平组合可选择不同组合。其中ADDC为最高位,ADDA为最低位,例如,当ADDA=0,ADDB=1,ADDC=1时,IN6选通。

ADC0809的时序图如图所示

 由时序图可得ADC0809的设计步骤如下

1.设置模拟通道输入端
引脚——ADDA,ADDB,ADDC选择(模拟通道选择地址信号).
2、设置START——启动A/D转换(要求不严格时,我们可以让ALE和START共用一个时钟信号)a.置0——提供上升沿

b.置1——上升沿清空ADC0809内部寄存器

c.置0——下降沿启动A/D转换

3.判断EOC——判断A/D转换是否结束
A/D转换启动后,EOC自动从高电平转化为低电平。A/D转换期间,EOC始终保持低电平。转换结束后,EOC自动从低变成高。

因此我们可以通过判断EOC的值来判断A/D 转换是否结束。
4.OE(输入允许信号)
OE=1时,输出转换得到的数据.
5.D0~D7(A/D转换后的数据输出端)

这样我们就完成了一次A/D转换。 

转换数据的传送 A/D转换后得到的数据应及时传送给单片机进行处理。数据传送的关键问题是如何确认A/D转换的完成,因为只有确认完成后,才能进行传送。有两种不错的方法供大家参考。

查询方式
A/D转换芯片有表明转换完成的状态信号,例如ADC0809的EOC端。因此可以用查询方式,测试EOC的状态,即可确认转换是否完成,并接着进行数据传送。
中断方式
把表明转换完成的状态信号(EOC)作为中断请求信号,以中断方式进行数据传送。
 


一、硬件原理图(proteus仿真)

由于proteus中没有ADC0809,因此我们在此用与其功能完全相同的ADC0808所代替。

由仿真图可得,ADC0808的控制端与P2^0——P2^6相连接,通过软件来控制ADC0808。ADC0808的输出端与单片机的P0口相连接,因此,我们可以通过读取模数转换后P0的值,来获得模数转换所得到的数据。在此需要注意的是,ADC0808的OUT1为数据的最高位,OUT8为数据的最低位!!!

本实例中,我们选通IN3作为模拟信号的输入端,通过一个可变电阻来模拟模拟信号的输入。

仿真结果如图所示

模拟信号输入为0时

模拟信号输入最大时

 ADC0809为8位的模数转换芯片,因此,计数的最大量为2^8=256。

二、代码及详细注释

代码如下(示例):

#include <REGX52.H>
sbit ADDA=P2^0;
sbit ADDB=P2^1;
sbit ADDC=P2^2;
sbit START=P2^5;
sbit EOC=P2^4;
sbit OE=P2^3;
sbit CLOCK=P2^6;

unsigned char led_mod[]={0x3f,0x06,0x5b,0x4f,0x66,
	                       0x6d,0x7d,0x07,0x7f,0x6f};//共阴极数码管段码表
void Delay10ms()		//@12.000MHz延时10ms
{
	unsigned char i, j;

	i = 20;
	j = 113;
	do
	{
		while (--j);
	} while (--i);
}
timer0() interrupt 1      //  500KHz
{
	CLOCK=!CLOCK;
}
void ADC0809convert()
{
 
	ADDA=1;ADDB=1;ADDC=0;//选通IN3
	START=0;
	START=1;//上升沿清空ADC0809内部寄存器
	Delay10ms();
	START=0;//下降沿开始A/D转换
	while(EOC==0);//等待转换结束
	OE=1;//提供使能信号,锁存转换数据
	
}
void led_display(unsigned char x)
{
	P3=0xf7;//选中个位数码管
	P1=led_mod[x%10];//显示个位
	Delay10ms();
	P3=0xfb;//选中十位数码管
	P1=led_mod[(x%100)/10];//显示十位
	Delay10ms();
	P3=0xfd;//选中百位
	P1=led_mod[x/100];//显示百位
	Delay10ms();
}
void main()
{
	TMOD=0x02;//设置T1定时器为模式二
	TL0=0xE8;//设置定时初始值
	TH0=0xE8;//设置定时重载值
	ET0=1;//允许定时器中断
	EA=1;//开总中断
	TR0=1;//定时器0开始计时
	while(1)
	{
		ADC0809convert();//模数转换
		led_display(P0);//显示转换数据
		OE=0;//锁存信号使能端置零,为下次锁存做准备
	}
}


总结

在本次实例中,我们学习了ADC0809这款经典的模数转换芯片以及基本使用方法。以此类推,以后,对于某种特殊的模数转换芯片,我们首先要了解该芯片的管脚功能,然后通过分析时序图确定芯片的工作时序,通过工作时序进行硬件连接并且进行软件编程,通过这种思路,我们可以做到触类旁通,以后再遇到类似的芯片,我们都可以正常的使用。

物联沃分享整理
物联沃-IOTWORD物联网 » ADC0809模数转换与显示原理详解

发表评论