ADC0804实验报告
ADC0804工作原理及其在单片机中的应用(基于Proteus仿真)

7/7
2、分辨率概念:分辨率是指使输出数字量变化 1 时的输入模拟量,也就是使输出数字量
变化一个相邻数码所需输入模拟量的变化值。 分辨率与 A/D 转换器的位数有确定的关系,可以表示成 FS / 2
n
。FS 表示满量程输入
值,n 为 A/D 转换器的位数。例如,对于 5V 的满量程,采用 4 位的 ADC 时,分辨率为 5V/16=0.3125V (也就是说当输入的电压值每增加 0.3125V,输出的数字量增加 1);采用 8 位 的 ADC 时,分辨率为 5V/256=19.5mV(也就是说当输入的电压值每增加 19.5mV,则输出 的数字量增加 1) ;当采用 12 位的 ADC 时,分辨率则为 5V/4096=1.22mV(也就是说当输 入的电压值每增加 1.22mV ,则输出的数字量增加 1) 。显然,位数越多,分辨率就越高。
因此,对于本试验,转换公式为
Vout (
Dsample ) 5V 256
5、ADC0804 在单片机中的简单应用举例
如下图所示,本例 ADC0804 中的 VCC=5V, VREF/2 引脚悬空(悬空则相当于与 VCC 共接 5V 电源) ,因此 ADC 转换的参考电压为 VCC 的值,即 5V。VIN-接地,而 VIN+连接 滑动变阻器 RV1 的输出, 因此 VIN+的电压输入范围为 0V~5V, 正好处于参考电压范围内。 引脚CS接地, WR和RD分别连接单片机的 P3^6 和 P3^7 引脚,而 DB0~DB7 连接单片机
1/7
Байду номын сангаас 2012 年 8 月 6 日星期一
信号低电平有效,即WR信号由低电平变成高电平时,触发一次 ADC 转换。 RD:低电平有效,即RD=0 时,DAC0804 把转换完成的数据加载到 DB 口,可以通过 数据端口 DB0~DB7 读出本次的采样结果。 VIN(+)和 VIN(-) :模拟电压输入端,单边输入时模拟电压输入接 VIN(+)端,VIN (-)端接地。双边输入时 VIN(+) 、VIN(-)分别接模拟电压信号的正端和负端。当输入 的模拟电压信号存在“零点漂移电压”时,可在 VIN(-)接一等值的零点补偿电压,变换 时将自动从 VIN(+)中减去这一电压。 VREF/2:参考电压接入引脚,该引脚可外接电压也可悬空,若外接电压,则 ADC 的参 考电压为该外界电压的两倍,如不外接,则 VREF 与 Vcc 共用电源电压,此时 ADC 的参考 电压即为电源电压 Vcc 的值。 CLKIN 和 CLKR: 外接 RC 振荡电路产生模数转换器所需的时钟信号, 时钟频率 CLK = 1/1.1RC,一般要求频率范围 100KHz~1460KHz。 AGND 和 DGND:分别接模拟地和数字地。 INTR:转换结束输出信号,低电平有效,当一次 A/D 转换完成后,将引起INTR=0,实际 应用时,该引脚应与微处理器的外部中断输入引脚相连(如 51 单片机的INT0,INT1脚) , 当产生INTR信号有效时,还需等待RD=0 才能正确读出 A/D 转换结果,若 ADC0804 单独使 用,则可以将INTR引脚悬空。 DB0~DB7:输出 A/D 转换后的 8 位二进制结果。 补充说明:ADC0804 片内有时钟电路,只要在外部“CLKIN(引脚 4) ”和“CLKR(引脚 19) ” 两端外接一对电阻电容即可产生 A/D 转换所要求的时钟, 其振荡频率为 fCLK≈1/1.1RC。 其典型应用参数为:R=10KΩ ,C=150PF,fCLK≈640KHz,转换速度为 100μ s。若采用外 部时钟, 则外部 fCLK 可从 CLKIN 端送入, 此时不接 R、 C。 允许的时钟频率范围为 100KHz~ 1460KHz。
ADC0804的详细控制程序和仿真(595芯片和四位一体数码管)图

仿真电路图,经过测试,没问题下面是上个图的分解图模拟电路:设计模拟电路的原因主要有以下两点1.由于外界信号的复杂性,使得传感器直接输出的电信号可能会存在一些问题(如不稳定),这些不稳定信号如果直接送到A/D 芯片进行采样,则最终结果可能使得最后的显示值来回乱跳,而无法确定待测的外界信号到底是多少。
因此,可能需要设计一套模拟电路对传感器输出的不稳定电信号进行滤波等处理,去除干扰,使得进入A/D 转换芯片的电压值为一个稳定的信号。
2.每一个A/D 转换芯片都有一个参考电压,只有输入的模拟电压值在这个参考电压的范围内才能进行正确的转换,例如:本试验将ADC0804芯片的参考电压设置成0V ~5V ,因此如果输入的电压值大于5V ,则转换出的结果永远为0xFF,若输入的电压值小于0V,则转换出的结果永远为0,这样便无法正确的还原出被测信号的大小。
基于上述原因,我们可能需要设计一套模拟电路,传感器的输出电压值进行一些变换(放大,缩小),使得送到A/D转换芯片的电压值在转换芯片的参考电压范围内。
A/D转换芯片:即模拟/数字转换芯片,它将输入的模拟电压信号转换成单片机等控制处理器能够识别的数字二进制形式。
处理器芯片:处理器芯片有很多中(比如51单片机,ARM或者是PC上的奔腾处理器,AMD处理器)这些处理器虽然架构不一样,但是有个共同的特点,就是它们能够运行程序,因此它们能通过程序对A/D芯片送入的二进制形式的电压值进行处理,通过运算将其还原成待测的外界信号值,控制显示部件(如LCD,八段数码管)将这个值显示出来。
例如:假如ADC0804输出的二进制值0x80,则根据A/D转换公式可以推出ADC0804的输入电压大小为(0x80/0x100)*5V=2.5V。
假设信号经过模拟电路缩小了8倍,则可以推出传感器的输出电压为2.5V*8=20V,再根据传感器的转换公式(一般手册会给出)即可得到输入的外界信号的值。
显示:显示的作用是将计算出的待测外界信号的值展示给测量人员,显示的形式有很多种,如LCD,八段数码管,上位机软件等。
数模转换ADC0804的应用实验

数模转换ADC0804的应用实验[实验任务]从ADC0804的通道IN+输入0-5V之间的模拟量,通过ADC0804转换成数字量在数码管上以十进制形成显示出来。
[实验原理]ADC0804是8位全MOS中速A/D转换器、它是逐次逼近式A/D转换器,片内有三态数据输出锁存器,可以和单片机直接接口。
单通道输入,转换时间大约为100us。
ADC0804转换时序是:当CS=0许可进行A/D转换。
WR由低到高时,A/D开始转换,一次转换一共需要66-73个时钟周期。
CS与WR同时有效时启动A/D转换,转换结束产生INTR信号(低电平有效),可供查询或者中断信号。
在CS和RD的控制下可以读取数据结果。
[C语言源程序]/*注意:程序下载到DPY-1实验板单片机后一定要使SW DIP1的开关脱离ON档。
或者直接将下载线从实验板上拔下。
因为下载线接在I/O口P1.5,P1.6,P1.7上,下载线的电平将会影响测量结果*/#include<reg52.h>code unsigned char seg7code[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//显示段码sbit int1=P3^3;//定义管脚功能sbit cs=P3^2;sbit wr=P3^6;sbit rd=P3^7;void Delay(unsigned int tc)//显示延时程序{while(tc!=0){unsigned int i;for(i=0;i<100;i++);tc--;}}unsigned char adc0804(void)//读AD0804子程序{unsigned char addata,i;rd=1;wr=1;int1=1;//读ADC0804前准备P1=0xff;//P1全部置一准备cs=0;wr=0;wr=1;//启动ADC0804开始测电压while(int1==1);//查询等待A/D转换完毕产生的INT(低电平有效)信号rd=0;//开始读转换后数据i=i;i=i;//无意义语句,用于延时等待ADC0804读数完毕addata=P1;//读出的数据赋与addaterd=1;cs=1;//读数完毕return(addata);//返回最后读出的数据}unsigned int datpro(void)//ADC0804读出的数据处理{unsigned char x;unsigned int dianyah,dianyal;//用于存储读出数据的高字节和低字节unsigned int dianya=0;//存储最后处理完的结果注意数据类型for(x=0;x<10;x++)//将10次测得的结果存储在dianya中{dianya=adc0804()+dianya;}dianya=dianya/10;//求平均值dianyah=dianya&0xf0;//屏蔽低四位dianyah=dianyah>>4;//右移四位取出高四位dianyal=dianya&0x0f;//屏蔽高四位取出低四位dianya=dianyal*20+dianyah*320;//最后的结果是一个四位数,便于显示return(dianya);//返回最后处理结果}void Led(){unsigned int date;date=datpro();//调用数据处理最后结果P2=P2&0xef;P0=seg7code[date/1000]|0x80;//输出个位数和小数点Delay(8);P2=P2|0xf0;P2=P2&0xdf;P0=seg7code[date%1000/100];//输出小数点后第一位Delay(8);P2=P2|0xf0;P2=P2&0xbf;P0=seg7code[date%100/10];//输出小数点后第二位Delay(8);P2=P2|0xf0;P2=P2&0x7f;P0=seg7code[date%10];//输出小数点后第三位Delay(8);P2=P2|0xf0;}main(){while(1){Led();//只需调用显示函数}}。
adc0804工作原理

adc0804工作原理ADC0804是一款8位的模数转换器,它的工作原理是将输入的模拟信号转换为相应的数字信号。
在本文中,我们将详细介绍ADC0804的工作原理及其应用。
我们来了解一下ADC0804的基本结构。
它由一个模拟输入多路选择器、一个采样保持电路、一个模数转换电路和一个8位输出缓冲器组成。
其中,模拟输入多路选择器用于选择输入的模拟信号,采样保持电路用于将模拟信号进行采样并保持在一个恒定的电平上,模数转换电路则将采样后的模拟信号转换为相应的数字信号,最后通过输出缓冲器输出。
ADC0804的工作原理主要分为两个步骤:采样和量化。
首先,当ADC0804接收到转换开始信号时,模拟输入多路选择器将选择一个模拟输入信号,并将其输入到采样保持电路中。
在采样保持电路中,模拟信号被采样并保持在一个恒定的电平上,以便进行后续的转换操作。
然后,采样后的模拟信号将被输入到模数转换电路中进行量化。
模数转换电路使用一个内部的参考电压进行比较,将输入的模拟信号与参考电压进行比较,并产生相应的数字信号。
ADC0804使用逐次逼近法进行模数转换,即通过不断逼近输入信号与参考电压之间的差值来确定输出的数字信号。
在模数转换的过程中,ADC0804将输入的模拟信号分成若干个等级,并通过比较电路将其转换为相应的数字信号。
比较电路根据输入信号与参考电压之间的差值来判断输出的数字信号是“0”还是“1”。
通过不断逼近的过程,ADC0804可以将输入的模拟信号转换为相应的8位二进制数字信号。
转换后的数字信号将通过输出缓冲器输出。
输出缓冲器可以将转换后的数字信号放大并输出到外部设备,如微处理器或显示器等。
ADC0804由于其简单的结构和易于使用的特点,在工业控制、仪器仪表、通信等领域得到了广泛的应用。
它可以将各种模拟信号转换为数字信号,并通过输出缓冲器输出给其他设备进行处理。
总结起来,ADC0804是一款基于逐次逼近法的8位模数转换器。
它通过采样和量化的过程将输入的模拟信号转换为相应的数字信号,并通过输出缓冲器输出给其他设备。
单片机ADC实验报告

ADC实验报告1.实验任务利用单片机STC89C52与ADC0809设计一个数字电压表,能够测量0-5V之间的直流电压值,四位数码显示。
2.现有元件模数转换器ADC0804,STC89C52单片机,两个共阳极数码管。
3.硬件设计3.1模数转换器ADC0809与单片机STC89C52的连接(1)ADC0809规格及引脚分配图如下图3-1所示:(2)STC89C52各个引脚分布如下图3-2所示:图3-1 ADC0809引脚图图3-2 STC89C52引脚图(3) 硬件连线(a) 把“单片机系统”区域中的P3.0与”模数转换模块ADC0809“区域中的ST端子用导线相连接。
(b) 把“单片机系统”区域中的P3.1与”模数转换模块ADC0809“区域中的ALE端子用导线相连接。
(c) 把“单片机系统”区域中的P3.2与”模数转换模块ADC0809“区域中的OE端子用导线相连接。
(d) 把“单片机系统”区域中的P3.6与”模数转换模块ADC0809“区域中的EOC端子用导线相连接。
(e) 把“单片机系统”区域中的P3.7与”模数转换模块ADC0809“区域中的CLK端子用导线相连接。
(f) 把“模数转换模块ADC0809”区域中的ADDA、ADDB、ADDC端子用导线连接到单片机的VCC端子上。
把“模数转换模块ADC0809”区域中IN7与外接输入电压相连。
(g) 把“单片机系统”区域中的P2.0-P2.7连接到“模数转换模块ADC0809”区域中D0D1D2D3D4D5D6D7端子上。
(h) 把“单片机系统”区域中的P1.0-P1.7连接到“数码管”区域中ABCDEFG端子上。
把“单片机系统”区域中的P0.0-P0.1连接到“数码管”区域中12端口。
4. 电路原理图图4 电路原理图 5、程序设计流程图Y N开始 启动前准备初始化INTO=1?开始转换 延时 取转换后的数值 将数值送显示结束6. C语言源程序#include<reg52.h>sbit ALE = P3^1;sbit ST = P3^0;sbit EOC = P3^2;sbit OE = P3^6;sbit CLK = P3^7;sbit wexuan1=P0^0;sbit wexuan2=P0^1;//sbit IN1 = P0^5;//sbit IN2 = P0^6;//sbit IN3 = P0^7;unsigned int code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //段码表unsigned int n=0,flag1=1;flag=1,ad_data,num1=0,num2=0;void delay(xms){unsigned int x,y;for(x=xms;x>0;x--)for(y=110;y>0;y--);}void display()//2位数码管显示{float a;a=(float)ad_data/256*5*1000;num1=(int)a/1000;num2=(int)a/100-num1*10;P1=table[num1];wexuan1=0;delay(1);wexuan1=1;P1=0x00;P1=0x80; //小数点wexuan1=0;delay(1);wexuan1=1;P1=0x00;P1=table[num2];wexuan2=0;delay(1);wexuan2=1;P1=0x00;}void init(){ST = 0;ALE = 0;OE = 0;CLK = 0;// _EOC= 1;TMOD=0x12;IP=0x09;TH0=(65536-22)/256;TL0=(65536-22)%256;TH1=(65536-45872)/256;TL1=(65536-45872)%256;EA=1;ET0=1;ET1=1;TR0=1;TR1=1;EX0=1;//打开外部中断IT0=1;//从高到低的负跳变有效P0=0x00;}void start() //int a,int b,int c) //选择通道{// IN1 = a;IN2 = b;IN3 = c;ALE = 0;ALE = 1;ST = 0;ST = 1;ALE = 0;ST = 0;display();delay(10);}int read()unsigned int dat;P2 = 0xff;OE = 1;display();dat = P2;OE = 0;return (dat);}void main(){init();while(1){ ST = 0;ST = 1;ST = 0;if(n==20){flag=1;// display();// start();// while(EOC==0);//转换结束(EOC=1)读出数据后显示// _EOC=0;ad_data=read();flag=0;display();//n = 0;// display();// _EOC = 1;}display();//显示的是if中的电压值}}void INTR_0() interrupt 0while(1){ad_data = read();flag = 0;display();}}void timer0() interrupt 1 // 输出500kHz 方波{CLK=~CLK;}void timer1() interrupt 3{TH1=(65536-45872)/256;TL1=(65536-45872)%256;n++;flag1=0;}7、实验成果接线图。
试验五AD、DA转换实验

试验五. A/D、D/A转换实验一、实验目的1. 学习理解模/数信号转换和数/模转换的基本原理。
2. 掌握模/数转换芯片ADC0804和数/模转换芯片DAC0832的使用方法。
二、实验设备TD-PITE实验装置(带面包板)一套,实验用转换芯片两片,±12V稳压电源一台、运放两片、温度传感器、电位器(5.1KΩ)一个、电阻若干,面包板用导线若干,排线若干,万用表一个。
三、实验内容(1)设计A/D转换电路,采集可调电阻的输出电压。
连+5V电源,调节后的输出电压作为ADC0804的模拟输入量,然后进行A/D转换,转换结果由发光二极管上显示。
请填写实验数据表格:(2)将LM35 精密摄氏度温度传感器连+5V电源,输出电压直接作为ADC0804 的模拟输入量,然后进行A/D转换,转换结果经过计算得到摄氏度值放在内存变量上。
(多数温度传感器是针对绝对温度的,且线形较差。
LM35的输出电压与摄氏温度值成正比例关系,每10 mV 为 1 摄氏度。
)(3)设计D/A 转换,要求产生锯齿波、三角波、脉冲波,并用示波器观察电压波形。
四、实验原理1. 模数转换器ADC0804 简介ADC0804是用CMOS集成工艺制成的逐次比较型模数转换芯片。
分辨率为8位,转换时间为100μs,输入参考电压范围为0~5V。
芯片内有输出数据锁存器,与计算机连接时,转换电路的输出可以直接连接在CPU数据总线上。
图5.1 ADC0804引脚图启动信号:当CS#有效时,WR#可作为A/D转换的启动信号。
WR#高电平变为低电平时,转换器被清除;当WR#回到高时,转换正式启动。
转换结束:INTR#跳转为低电平表示本次转换已经完成,可作为微处理器的中断或查询信号。
RD#用来读A/D转换的结果。
有效时输出数据锁存器三态门DB0~DB7各端上出现8位并行二进制数码。
转换时钟:见下图,震荡频率为f CLK ≈ 1 / 1.1RC。
其典型应用参数为:R = 10KΩ,C = 150pF,f CLK≈ 640KHz,8位逐次比较需8×8 = 64个时钟周期,转换速度为100μs。
adc0804文档

试验 模拟/数字转换芯片ADC0804的使用1、实验目的1.了解并测试模/数芯片ADC0804性能。
2.学习A/D 芯片ADC0804的接线和转换的基本原理。
2、试验内容2.1 模拟/数字转换的一些背景知识介绍模拟/数字转换就是我们通常所说的A/D 转换,它将输入的模拟信号(如电压)转换成控制芯片(如单片机,ARM)所能识别的二进制形式,然后经过运算,既可以还原出输入模拟信号的值。
A/D 转换是一种非常重要的技术手段,是单片机等控制芯片与外界信号的接口部分,图1给出了一种常用的嵌入式设计模式。
图1:一种常用的基于A/D 芯片的嵌入式设计模式由图1可见,这种设计模式包含以下几个环节。
外界信号:外界信号的范围十分广泛,自然界的一切信号,比如声音,温度甚至是血糖浓度等都可以规类为外界信号。
传感器:因为大多数外界信号都不是电信号,因此需要通过各种传感器将这些外界信号转换成电信号,例如:通过热电耦可以将温度转换成一个电压值。
模拟电路:设计模拟电路的原因主要有以下两点1.由于外界信号的复杂性,使得传感器直接输出的电信号可能会存在一些问题(如不稳定),这些不稳定信号如果直接送到A/D 芯片进行采样,则最终结果可能使得最后的显示值来回乱跳,而无法确定待测的外界信号到底是多少。
因此,可能需要设计一套模拟电路对传感器输出的不稳定电信号进行滤波等处理,去除干扰,使得进入A/D 转换芯片的电压值为一个稳定的信号。
2.每一个A/D 转换芯片都有一个参考电压,只有输入的模拟电压值在这个参考电压的范围内才能进行正确的转换,例如:本试验将ADC0804芯片的参考电压设置成0V ~5V ,因此如果输入的电压值大于5V ,则转换出的结果永远为0xFF,若输入的电压值小于0V,则转换出的结果永远为0,这样便无法正确的还原出被测信号的大小。
基于上述原因,我们可能需要设计一套模拟电路,传感器的输出电压值进行一些变换(放大,缩小),使得送到A/D转换芯片的电压值在转换芯片的参考电压范围内。
ADC0804

所谓A/D转换器就是模拟/数字转换器(Analog to Digital Converter简称ADC)是将输入的模拟信号转换成为数字信号。
B
1011
11/16
11/256
3.520
0.220
A
1010
10/16
10/256
3.200
0.200
9
1001
9/16
9/256
2.880
0.180
8
1000
8/16
8/256
2.560
0.160
7
0111
7/16
7/256
2.240
0.140
6
0110
6/16
6/256
1.920
0.120
5
01015/165/ Nhomakorabea561.600
0.100
4
0100
4/16
4/256
1.280
0.080
3
0011
3/16
3/256
0.960
VCC:电源供应以及作为电路的参考电压。
ADC0804电压输入与数字输出关系如表所示
0.060
2
0010
2/16
2/256
0.640
0.040
1
0001
1/16
1/256
0.320
0.020
0
0000
0
0
试验原理图:
ADC0804的规格及引脚图
/CS:芯片选择信号。
VREF:辅助参考电压。
/WR:用来启动转换的控制当/WR自HI变为LO时,转换器被清除;当/WR回到HI时,转换正式启动;
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验报告信息与通信工程学院ADC0804控制显示1实验目的了解ADC0804的工作原理,并进行简单的设计。
理解状态机的工作原理和设计方法。
2实验要求从ADC0804的通道IN+输入0~5V之间的模拟量,通过ADC0804转换成数字量,并用FPGA控制数码管上以十进制形成显示出来。
3实验原理所谓A/D 转换器就是模拟/数字转换器(Analog to Digital Converter 简称ADC)是将输入的模拟信号转换成为数字信号。
ADC0804是属于连续渐进式(Successive Approximation Method)的A/D转换器,这类型的A/D转换器除了转换速度快(几十至几百us)、分辨率高外,还有价钱便宜的优点,普遍被应用于微电脑的接口设计上。
ADC0804主要技术指标如下:(1) 高阻抗状态输出(2) 分辨率:8 位(0~255)(3) 存取时间:135 ms(4) 转换时间:100 ms(5) 总误差:-1~+1LSB(6) 工作温度:ADC0804C为0度~70度;ADC0804L为-40 度~85 度(7) 模拟输入电压范围:0V~5V(8) 参考电压:2.5V(9) 工作电压:5V(10) 输出为三态结构ADC0804引脚功能接脚说明见下图1:ADC0804 为一只具有20引脚8位CMOS 连续近似的A/D 转换器,图1 ADC0804引脚图引脚功能说明:1. PIN1 (CS ):Chip Select,与RD、WR 接脚的输入电压高低一起判断读取或写入与否,当其为低位准(low) 时会active。
2. PIN2 ( RD ):Read。
当CS 、RD 皆为低位准(low) 时,ADC0804 会将转换后的数字讯号经由DB7 ~ DB0 输出至其它处理单元。
3. PIN3 (WR ):启动转换的控制讯号。
当CS 、WR 皆为低位准(low) 时ADC0804 做清除的动作,系统重置。
当WR 由0→1且CS =0 时,ADC0804会开始转换信号,此时INTR 设定为高位准(high)。
4. PIN4、PIN19 (CLK IN、CLKR):频率输入/输出。
频率输入可连接处理单元的讯号频率范围为100 kHz 至800 kHz。
而频率输出频率最大值无法大于640KHz,一般可选用外部或内部来提供频率。
若在CLK R 及CLK IN 加上电阻及电容,则可产生ADC 工作所需的时序,其频率约为:5. PIN5 ( INTR ):中断请求。
转换期间为高位准(high),等到转换完毕时INTR 会变为低位准(low)告知其它的处理单元已转换完成,可读取数字数据。
6. PIN6、PIN7 (VIN(+)、VIN(-)):差动模拟讯号的输入端。
输入电压VIN=VIN(+) -VIN(-),通常使用单端输入,而将VIN(-)接地。
7. PIN8 (A GND):模拟电压的接地端。
8. PIN9 (VREF)ADC0804引脚图如下:引脚功能及应用特性如下:CS 、RD 、WR (引脚1、2、3):是数字控制输入端,满足标准TTL 逻辑电平。
其中CS 和WR 用来控制A/D 转换的启动信号。
CS 、RD 用来读A/D 转换的结果,当它们同时为低电平时,输出数据锁存器DB0~DB7 各端上出现8 位并行二进制数码。
CLKI(引脚4)和CLKR(引脚19):ADC0801~0805 片内有时钟电路,只要在外部“CLKI”和“CLKR”两端外接一对电阻电容即可产生A/D 转换所要求的时钟,其振荡频率为fCLK≈1/1.1RC。
其典型应用参数为:R=10KΩ,C=150PF,fCLK≈640KHZ,转换速度为100μs。
若采用外部时钟,则外部fCLK 可从CLKI 端送入,此时不接R、C。
允许的时钟频率范围为100KHZ~1460KHZ。
INTR (引脚5): INTR 是转换结束信号输出端,输出跳转为低电平表示本次转换已经完成,可作为微处理器的中断或查询信号。
如果将CS 和WR 端与INTR 端相连,则ADC0804 就处于自动循环转换状态。
CS =0 时,允许进行A/D 转换。
WR 由低跳高时A/D 转换开始,8 位逐次比较需8×8=64 个时钟周期,再加上控制逻辑操作,一次转换需要66~73 个时钟周期。
在典型应用fCLK=640KHZ 时,转换时间约为103μs~114μs。
当fCLK 超过640KHZ,转换精度下降,超过极限值1460KHZ 时便不能正常工作。
VIN(+)(引脚)和VIN(-)(引脚7):被转换的电压信号从VIN(+)和VIN(-)输入,允许此信号是差动的或不共地的电压信号。
如果输入电压VIN的变化范围从0V到Vmax,则芯片的VIN(-)端接地,输入电压加到VIN(+)引脚。
由于该芯片允许差动输入,在共模输入电压允许的情况下,输入电压范围可以从非零伏开始,即Vmin 至Vmas。
此时芯片的VIN(-)端应该接入等于Vmin 的恒值电码坟上,而输入电压VIN仍然加到VIN(+)引脚上。
AGND(引脚8)和DGND(引脚10):A/D 转换器一般都有这两个引脚。
模拟地AGND 和数字地DGND 分别设置引入端,使数字电路的地电流不影响模拟信号回路,以防止寄生耦合造成的干扰。
模拟电压ADC 0804VREF/2(引脚9):参考电压VREF/2 可以由外部电路供给,从“VREF/2”端直接送入,VREF/2 端电压值应是输入电压范围的二分之一。
所以输入电压的范围可以通过调整VREF/2 引脚处的电压加以改变,转换器的零点无需调整。
ADC0804 转换器的工作时序如图4-8 所示。
AD转换器的设计接口电路图:图中,ADC0804 数据输出线与AT89C51 的数据总线直接相连,AT89C51 的RD 、WR 和INT1直接连到ADC0804,由于用P1.0 线来产生片选信号,故无需外加地址译码器。
当AT89C51 向ADC0804 发WR (启动转换)、RD (读取结果)信号时,只要虚拟一个系统不占用的数据存储器地址即可。
实验框图输入转换程控FPGA 数码管显示FPGA管脚分配实验结果本次实验实现了ADC0804的简单设计,在数码管上显示出转换的模拟电压数值(以0-255数字量形式和0-5V形式显示)。
实验心得通过这次实验,我了解了ADC0804的基本工作原理,学习了用Verilog HDL语言编写程序。
但是对于语言的了解还是很模糊,希望今后可以进行进一步学习。
附录:程序module ADC0804_doc(clkin,data,seg_com,seg_data,//bell,adcs,rd,wr);input clkin; //时钟输入50MHZinput [7:0] data;reg clkout;output reg[7:0] seg_com; //位选output reg[7:0] seg_data; //段选output reg rd,wr;output wire adcs;//output bell;parameter CLK_FREQ = 'D50_000_000; //系统时钟50MHZparameter CLK_out_FREQ = 'D5000; //输出时钟 'D500_000;parameter CLK_out_FREQ2 = 'D50_000; //输出时钟$$$ gaiyaparameter state_pre = 0;parameter state_pre2 = 1;parameter state_start = 2;parameter state_conv = 3;parameter state_wait = 4;reg [7:0] data_led; //LED显示数据reg [31:0] DCLK_DIV;reg [31:0] DCLK_DIV2;reg clkout2; //提供显示数据时钟reg [3:0] state = state_pre;reg [7:0] jishu;reg[3:0] shuju;reg[31:0] vo;//reg bell;/*****************************频 **************************************/ always @(posedge clkin) //50MHzbeginif(DCLK_DIV < (CLK_FREQ / CLK_out_FREQ)) // dclk_div<50M/5000=10_000 DCLK_DIV <= DCLK_DIV+1'b1;elsebeginDCLK_DIV <= 0; ///freq of dclk_div is 5000clkout <= ~clkout; //freq of clkout is 2500 hzendendalways @(posedge clkin)beginif(DCLK_DIV2 < (CLK_FREQ / CLK_out_FREQ2))DCLK_DIV2 <= DCLK_DIV2+1'b1; //elsebeginif(clkout2==1)//25 000beginif(jishu<7) jishu=jishu+1;else jishu=0;endDCLK_DIV2 <= 0; //50 000clkout2 <= ~clkout2; //25 000endend/******************************ADC0804时序 **********************/ assign adcs=0; //cs=0assign data2=data_led;//assign bell=0;always @ (negedge clkout) //clkout=2500hz<10khzbegincase (state)state_pre : //0,clearbeginwr<=0;rd<=1;state <=state_pre2;endstate_pre2 : //1,beginbeginwr<=1;rd<=1;state <=state_start;endstate_start ://2 ,convert okbeginwr<=1;rd<=0;state <=state_conv; // 100us,as 10khzendstate_conv : //3begindata_led = data; //开始读数据///data from 0804 to fpga'date_led///////////state <=state_wait;endstate_wait : //4beginwr<=1;rd<=1;state <= state_pre; //重新回到状态0 进行下一次AD转换endendcaseend/******************************数码管显示**********************/always @(posedge clkout2)beginvo=data_led*13'd5_000/9'd256; //DAC:vo=(Vref/2^8)*Dn = 19.53125,39.0625 to 4980.46875case(jishu) //jishu from 000 to 1113'b000:shuju=(vo)/1000; // V3'b001:shuju=((vo)%1000)/100;3'b010:shuju=(((vo)%1000)%100)/10;3'b011:shuju=(((vo)%1000)%100)%10;default:shuju=4'b0000;endcasecase(jishu)3'b000: seg_com=8'b00000001;3'b001: seg_com=8'b00000010;3'b010: seg_com=8'b00000100;3'b011: seg_com=8'b00001000;3'b100: seg_com=8'b00010000;3'b101: seg_com=8'b00100000;3'b110: seg_com=8'b01000000;3'b111: seg_com=8'b10000000;//default: out=6'b00000;endcaseif(jishu==3)begincase(shuju)4'bxxxx:seg_data=8'b0xxxxxxx;default: seg_data=8'b11111111;endcaseendelsebegincase(shuju)4'b0000:seg_data=8'b11000000;//04'b0001:seg_data=8'b11111001;//14'b0010:seg_data=8'b10100100;//24'b0011:seg_data=8'b10110000;//34'b0100:seg_data=8'b10011001;//44'b0101:seg_data=8'b10010010;//54'b0110:seg_data=8'b10000010;//64'b0111:seg_data=8'b11111000;//74'b1000:seg_data=8'b10000000;//84'b1001:seg_data=8'b10010000;//9 default: seg_data=8'b11111111;endcaseendendendmodule(八位数字量显示)module ADC0804B(clkin,data,seg_com,seg_data,//bell,adcs,rd,wr);input clkin; //时钟输入50MHZinput [7:0] data;reg clkout;output reg[7:0] seg_com; //位选output reg[7:0] seg_data; //段选output reg rd,wr;output wire adcs;//output bell;parameter CLK_FREQ = 'D50_000_000; //系统时钟50MHZ parameter CLK_out_FREQ = 'D5000; //输出时钟 'D500_000; parameter CLK_out_FREQ2 = 'D50_000; //输出时钟$$$ gaiyaparameter state_pre = 0;parameter state_pre2 = 1;parameter state_start = 2;parameter state_conv = 3;parameter state_wait = 4;reg [7:0] data_led; //LED显示数据reg [31:0] DCLK_DIV;reg [31:0] DCLK_DIV2;reg clkout2; //提供显示数据时钟reg [3:0] state = state_pre;reg [7:0] jishu;reg[3:0] shuju;reg[31:0] vo;//reg bell;/*****************************分频**************************************/always @(posedge clkin) //50MHzbeginif(DCLK_DIV < (CLK_FREQ / CLK_out_FREQ)) // dclk_div<50M/5000=10_000DCLK_DIV <= DCLK_DIV+1'b1;elsebeginDCLK_DIV <= 0; ///freq of dclk_div is 5000clkout <= ~clkout; //freq of clkout is 2500 hzendendalways @(posedge clkin)beginif(DCLK_DIV2 < (CLK_FREQ / CLK_out_FREQ2))DCLK_DIV2 <= DCLK_DIV2+1'b1; //elsebeginif(clkout2==1)//25 000beginif(jishu<7) jishu=jishu+1;else jishu=0;endDCLK_DIV2 <= 0; //50 000clkout2 <= ~clkout2; //25 000endend/******************************ADC0804时序 **********************/ assign adcs=0; //cs=0assign data2=data_led;//assign bell=0;always @ (negedge clkout) //clkout=2500hz<10khzbegincase (state)state_pre : //0,clearbeginwr<=0;rd<=1;state <=state_pre2;endstate_pre2 : //1,beginbeginwr<=1;rd<=1;state <=state_start;endstate_start ://2 ,convert okbeginwr<=1;rd<=0;state <=state_conv; // 100us,as 10khzendstate_conv : //3begindata_led = data; //开始读数据///data from 0804 to fpga'date_led///////////state <=state_wait;endstate_wait : //4beginwr<=1;rd<=1;state <= state_pre; //重新回到状态0 进行下一次AD转换endendcaseend/******************************数码管显示**********************/always @(posedge clkout2)beginvo=data_led; //DAC:vo=Dncase(jishu) //jishu from 000 to 1113'b000:shuju=((vo)&8'b10000000)?1:0;3'b001:shuju=((vo)&8'b01000000)?1:0;3'b010:shuju=((vo)&8'b00100000)?1:0;3'b011:shuju=((vo)&8'b00010000)?1:0;3'b100:shuju=((vo)&8'b00001000)?1:0;3'b101:shuju=((vo)&8'b00000100)?1:0;3'b110:shuju=((vo)&8'b00000010)?1:0;3'b111:shuju=((vo)&8'b00000001)?1:0;default:shuju=8'b00000000;endcasecase(jishu)3'b000: seg_com=8'b00000001;3'b001: seg_com=8'b00000010;3'b010: seg_com=8'b00000100;3'b011: seg_com=8'b00001000;3'b100: seg_com=8'b00010000;3'b101: seg_com=8'b00100000;3'b110: seg_com=8'b01000000;3'b111: seg_com=8'b10000000;//default: out=6'b00000;endcasecase(shuju)4'b0000:seg_data=8'b11000000;//04'b0001:seg_data=8'b11111001;//1 default: seg_data=8'b11111111;endcaseendendmodule。