设计与开发

adc0804与单片机 如何来看单片机外设AD转换器ADC0804时序图

小编 2025-06-22 设计与开发 23 0

如何来看单片机外设AD转换器ADC0804时序图

如图,为单片机AD转换器的一种:

ADC0804单片集成A/D转换器。它采用CMOS工艺20引脚集成芯片,分辩率为8位,转换时间为100µs,输入电压范围为0~5V。芯片内具有三态输出数据锁存器,可直接接在数据总线上。

各引脚名称及作用如下:

VIN(+),VIN(-)——两模拟信号输入端,用以接收单极性、双极性和差模输入信号。

DB7~DB0——具有三态特性数字信号输出口。

AGND——模拟信号地。

DGND——数字信号地。

CLK——时钟信号输入端。

CLKR——内部时钟发生器的外接电阻端,与CLK端配合可由芯片自身产生时钟脉冲,其频率为1/(1.1RC)。

CS#---片选信号输入端,低电平有效,一旦CS#有效,表明A/D转换器被选中,可启动工作。

WR#---写信号输入,低电平启动A/D转换。

RD#---读信号输入,低电平输出端有效。

INTR#---A/D转换结束信号,低电平有效表示本次转换已完成。

VREF/2---参考电平输入,决定量化单位。

VCC---芯片电源5V输入。

打开ADC0804的数据手册,我们可以看到以下典型的电路接法:

我们可以用仿真软件画出来:

接下来,我们分析一下上图的工作原理:

①ADC0804的片选端CS连接U2锁存哭的Q7输出端,我们可通过控制锁存器来控制CS,这样接的原因是TX-1C实验板扩展的外围太多,没有多余的I/O口独立控制ADC0804的CS端,所以选择U2。

② VIN(+)接电位器的中间滑动端,VIN(-)接地,因为这两端可以输入差分电压,即它可测量VIN(+)与VIN(-)之间的电压,当VIN(-)接地时,VIN(+)端的电压即为ADC0804的模拟输入电压。VIN(+)与电位器之间串联一个10kΩ电阻,目的是限制流入VIN(+)端的电流,防止电流过大而烧坏A/D芯片,当用短路帽短接插针ADIN后,电位器的中间滑动端便通过电阻R12与VIN(+)连接,此时调节电位器的旋钮,其中间滑动端的电压便在0~VCC变化,进而ADC0804的数字输出端也在0x00~0xFF变化。

③ CLKR,CLR,GND之间用电阻和电容组成RC振荡电路,用来给ADC0804提供工作所需的脉冲,其脉冲的频率为1/(1.1RC),按芯片手册上说明,R取10kΩ,C取150pF,TX-1C实验板上为了减少元件种类和焊接方便,C选用的是104磁片电容。大家在设计自己的电路时,可选择150pF电容,否则会影响A/D的转换速率。

④ VREF/2端用两个1kΩ的电阻分压得到VCC/2电压,即2.5V,将该电压作为A/D芯片工作时内部的参考电压。

⑤WR#、 RD#分别接单片机的P3.6和P3.7引脚,数字输出端接单片机的P1口。

⑥ 将AGND和DGND同时连接到实验板的GND上。我们在设计产品时,若用到A/D和D/A,一般这些芯片都提供独立的模拟地(AGND)和数字地(DGND)引脚,为了达到精度高,稳定性好的目的,最好将所有器件的模拟地和数字地分别连接,最后将模拟地与数字地仅在一点连接。

⑦ INTR#引脚未连接,TX-1C实验板上读取A/D数据未用中断法,因此可不接该引脚。数字芯片在操作时首先要分析它的操作时序图,图4.4.6是ADC0804的启动转换时序图。

ADC0804转换时序图:

分析图4.4.6可知,CS先为低电平,WR#随后置低,经过至少tW(WR#)L时间后,WR#拉高,随后A/D转换器被启动,并且在经过(1~8个A/D时钟周期+内部TC)时间后,模/数完成转换,转换结果存入数据锁存器,同时INTR自动变为低电平,通知单片机本次转换已结束。关于几个时间的大小在芯片手册中都有说明。

我在写单片机程序启动A/D转换时就要遵循上面的时序,由于TX-1C实验板未用中断读取A/D数据,因此我们在启动A/D转换后,稍等一会儿时间,然后直接读取A/D的数字输出口即可。读取结束启动一次A/D转换,如此循环下去。4.4.7是ADC0804读取数据时序图。

分析上图可知,CS先为低电平,WR#随后置低,经过至少tW(WR#)L时间后,WR#拉高,随后A/D转换器被启动,并且在经过(1~8个A/D时钟周期+内部TC)时间后,模/数完成转换,转换结果存入数据锁存器,同时INTR自动变为低电平,通知单片机本次转换已结束。关于几个时间的大小在芯片手册中都有说明。

我在写单片机程序启动A/D转换时就要遵循上面的时序,由于TX-1C实验板未用中断读取A/D数据,因此我们在启动A/D转换后,稍等一会儿时间,然后直接读取A/D的数字输出口即可。读取结束启动一次A/D转换,如此循环下去。下图是ADC0804读取数据时序图。

分析上图可知,当INTR#变为低电平后,将CS#先置低,在RD#置低至少经过tACC时间后,数字输出口上的数据达到稳定状态,此时直接读取数字输出端口数据便可得的数字信号,读走数据后,马上将RD#拉高,然后再将CS#拉高,INTR#是自动变化的,当RD#置低tR1时间后,INTR#自动拉高,我们不必人为去干涉。

图4.4.6和图4.4.7是ADC0804启动转换和读取数据的时序图,这是启动一次和读取一次数据的时序图,当我们要连续转换并且连续读取数据时,有没有必要每次都把CS#置低再位高,因为CS#是片选信号,置低表示该芯片可被操作或处于能够正常工作状态,所以在写程序时,只要一开始将CS#置低,以后当要启动转换和读取数据时只需操作WR#和RD#即可。

行业标准建设,推动行业健康、快速地向前发展。

51单片机学习29-ADC0804

ADC0804芯片 把模拟转换成数字量

芯片操作步骤:

// 1 步骤S0:CS=0、WR=0、RD=1(由CPLD发出信号要求ADC0804开始进 行模拟/数字信号的转换)。

// 2 步骤S1:CS=1、WR=1、RD=1(ADC0804进行转换动作,转换完毕后INTR 将高电位降至低电位,而转换时间>100us)。

// 3 步骤S2:CS=0、WR=1、RD=0(由CPLD发出信号以读取ADC0804的转 换资料)。

// 4 步骤S3:CS=1、WR=1、RD=1(由CPLD读取DB0~DB7上的数字转换资 料)。

仿真图:用的是我自己做的一个51单片机开发板 图纸比较大,截图可能看不清,需要的话可以私信联系我。

程序:

源代码:

#include<reg52.h>

#define uchar unsigned char

#define uint unsigned int

sbit adcs=P3^5;

sbit adrd=P2^7;

sbit adwr=P3^3;

sbit P23=P2^3;

sbit dsrst=P3^6;

unsigned char code smg_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,

0x7c,0x39,0x5e,0x79,0x71,0x00};

unsigned char code smg_we[]={0x08,0x18,0x28,0x38,0x48,0x58,0x68,0x78};

uchar table1[3];

uchar advalue;

//************************************************

//延时函数,在12MHz 的晶振频率下

//大约50us 的延时

//************************************************

void delay_50us(uint t)

{ uchar j; for(;t>0;t--) for(j=19;j>0;j--); }

//************************************************

//延时函数,在12MHz 的晶振频率下//大约50ms 的延时

//************************************************

void delay_50ms(uint t)

{

uint j;

for(;t>0;t--)

for(j=6245;j>0;j--);

}

void main()

{

uchar j,k;

uchar i,l;

P23=1;

P1=0x00;

P23=1;

adcs=0;

while(1)

{

dsrst=0; //禁止实时时钟

P23=0; //禁止数码管

adcs=0; adwr=0; delay_50us(20); adwr=1; delay_50us(20); adrd=0; delay_50us(20); P1=0xff; // 释放P1

advalue=P1; //从P1 中读取数据

delay_50us(20); adrd=1; //禁止ADC 数据传输,防止影响数码管显示

adcs=1;

j=advalue/100; // 处理ADC 的数据,准备显示

k=advalue%100;

table1[2]=j;

j=k/10;

table1[1]=j;

j=k%10;

table1[0]=j;

P1=0; // 将P1 拉低准备显示

delay_50us(10);

P23=1;

for(l=0;l<20;l++) //在数码管上显示读取到的数据

{

for(i=0;i<3;i++)

{

P1=smg_du[table1[i]];

P2=smg_we[i];

delay_50us(100);

P1=0; //这句不加PROTUES显示不正常!!

}

P23=0;

}

}

}

仿真结果: 通过调节ADC0804外部接的滑动变阻器,不同的电压,数码显示不同的数值。

相关问答

adc0804与单片机 连接方法?

答:1.ADC0804的片选CS连接U2锁存器的Q7输出端,可以通过控制锁存器来控制CS,这样接是因为开发板扩展的外围太多,没有多余的IO口来独立控制ADC0804的CS,所以选...

猜你喜欢