ADC0804模数转换与显示

合集下载

模拟数字转换器ADC0804

模拟数字转换器ADC0804

模拟/数字转换器ADC0804所谓A/D转换器就是模拟/数字转换器(Analog to Digital Converter 简称ADC)是将输入的模拟信号转换成为数字信号。

ADC0804的规格及引脚图:/CS:芯片选择信号。

VREF:辅助参考电压。

/RD:外部读取转换结果的控制脚输出信号。

/INTR:中断请求信号输出,低电平动CLK IN,CLK R:时钟输入或接振荡元件(R,C),频率约限制在100KHz~1460KHz VCC:电源供应以及作为电路的参考电压。

/WR:用来启动转换的控制当/WR自HI变为LO时,转换器被清除;当/WR回到HI时,转换正式启动;DB0~DB7:8位数字输出。

AGND,DGND:模拟信号以及数字信号接地。

VIN(+),VIN(-):差动模拟电压输入。

输入单端正电压时,VIN(-)接地;ADC0804电压输入与数字输出关系如表所示:相关原理:程序运行照片:接线方法:1、用一个2PIN数据线插入CPU部分JP53(P3口)的P3.6,P3.7另一端插入ADC0804部分的输入端J3.2、用一根8PIN的数据排线,一端插入ADC0804部分的数据输入端JP35, 另一端插入CPU部分JP44(P1口)3、用一根8PIN的数据排线,一端插入八路指示灯部分的JP32, 另一端插入CPU部分JP51(P0口)运行照片,用一个小螺丝刀调整AD转换部分的ADJ3 可以看到P0口引出的8个LED逐次变化。

程序流程图:汇编语言参考程序:ad_cs equ P3.6ad_wr equ P2.0ad_rd equ P3.7ad_input_port equ p1 org 0000hajmp mainorg 0080hmain:lcall adc_demoajmp main;// 启动AD转换Adc_Start:clr ad_csnopclr ad_wrnopsetb ad_wrnopsetb ad_csnopretAdc_Read: ;// 读AD转换mov ad_input_port,#0ffhclr ad_csnopclr ad_rdnopnopmov a,AD_INPUT_PORTnopsetb ad_rdnopsetb ad_csret;// AD转换读取延时程序,显示读到的数值Adc_Demo:lcall Adc_Startlcall delay1mslcall adc_readclr p2.0clr p2.3mov p0,aretdelay1ms:mov r7,#10tt1:mov r6,#50djnz r6,$ ;2usdjnz r7,tt1retendc语言参考程序:#include<reg51.h> //头文件#define uchar unsigned char //宏定义,为方便编程#define uint unsigned int#define ADDATA P1 //宏定义,将P1口定义为0804输出数据位#define LED P0 //宏定义,将P0口定义为LEDsbit _WR=P2^0; //定义P2.0为数据写入位sbit CS=P3^6; //定义P3.6为ADC0804片选位sbit _RD=P3^7; //定义P3.7为数据读取位void delay_run() //AD转换间隔延迟函数{uchar ii,jj;for(ii=0;ii<200;ii++)for(jj=0;jj<200;jj++);}void delay() //片选及读写数据位保持延迟{uchar i=200;while(i--);}char code SST516[3] _at_ 0x003b; //仿真器保留main() //主函数{uchar value=0; //定义一变量,用于存放AD转换完的数据while(1){CS=0; //拉低片选位_WR=0; //拉低写数据位delay(); //延迟_WR=1; //拉高写数据位,启动AD转换CS=1; //拉高片选位CS=0; //拉低片选位_RD=0; //拉低读数据位,读取AD转换数据value=ADDATA;delay(); //延迟_RD=1; //拉高读数据位CS=1; //拉高片选LED=value; //将AD转换的数据赋给P0,驱动LEDdelay_run(); //AD转换间隔延迟}}。

数模转换ADC0804的应用实验

数模转换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();//只需调用显示函数}}。

AD转换芯片ADC0804

AD转换芯片ADC0804

AD转换芯⽚ADC0804AD0804简介ADC0804的管脚图如下所⽰它的主要电⽓特性如下:●⼯作电压:+5V,即VCC=+5V。

●模拟输⼊电压范围:0~+5V,即0≤Vin≤+5V。

●分辨率:8位,即分辨率为1/28=1/256,转换值介于0~255之间。

●转换时间:100us(f CK=640KHz时)。

●转换误差:±1LSB。

●参考电压:2.5V,即V ref=2.5V。

1.ADC0804的转换原理ADC0804是属于连续渐进式(Successive Approximation Method)的A/D转换器,这类型的A/D转换器除了转换速度快(⼏⼗⾄⼏百us)、分辨率⾼外,还有价钱便宜的优点,普遍被应⽤于微电脑的接⼝设计上。

以输出8位的ADC0804动作来说明“连续渐进式A/D转换器”的转换原理,动作步骤如下表⽰(原则上先从左侧最⾼位寻找起)。

第⼀次寻找结果:10000000 (若假设值≤输⼊值,则寻找位=假设位=1)第⼆次寻找结果:11000000 (若假设值≤输⼊值,则寻找位=假设位=1)第三次寻找结果:11000000 (若假设值>输⼊值,则寻找位=该假设位=0)第四次寻找结果:11010000 (若假设值≤输⼊值,则寻找位=假设位=1)第五次寻找结果:11010000 (若假设值>输⼊值,则寻找位=该假设位=0)第六次寻找结果:11010100 (若假设值≤输⼊值,则寻找位=假设位=1)第七次寻找结果:11010110 (若假设值≤输⼊值,则寻找位=假设位=1)第⼋次寻找结果:11010110 (若假设值>输⼊值,则寻找位=该假设位=0)这样使⽤⼆分法的寻找⽅式,8位的A/D转换器只要8次寻找,12位的A/D转换器只要12次寻找,就能完成转换的动作,其中的输⼊值代表图1的模拟输⼊电压Vin。

AD0804简介续1(2007-05-30 17:35:30)转载2.分辨率与内部转换频率的计算对8位ADC0804⽽⾔,它的输出准位共有28=256种,即它的分辨率是1/256,假设输⼊信号Vin为0~5V电压范围,则它最⼩输出电压是5V/256=0.01953V,这代表ADC0804所能转换的最⼩电压值。

adc0804工作原理

adc0804工作原理

adc0804工作原理ADC0804是一款8位的模数转换器,它的工作原理是将输入的模拟信号转换为相应的数字信号。

在本文中,我们将详细介绍ADC0804的工作原理及其应用。

我们来了解一下ADC0804的基本结构。

它由一个模拟输入多路选择器、一个采样保持电路、一个模数转换电路和一个8位输出缓冲器组成。

其中,模拟输入多路选择器用于选择输入的模拟信号,采样保持电路用于将模拟信号进行采样并保持在一个恒定的电平上,模数转换电路则将采样后的模拟信号转换为相应的数字信号,最后通过输出缓冲器输出。

ADC0804的工作原理主要分为两个步骤:采样和量化。

首先,当ADC0804接收到转换开始信号时,模拟输入多路选择器将选择一个模拟输入信号,并将其输入到采样保持电路中。

在采样保持电路中,模拟信号被采样并保持在一个恒定的电平上,以便进行后续的转换操作。

然后,采样后的模拟信号将被输入到模数转换电路中进行量化。

模数转换电路使用一个内部的参考电压进行比较,将输入的模拟信号与参考电压进行比较,并产生相应的数字信号。

ADC0804使用逐次逼近法进行模数转换,即通过不断逼近输入信号与参考电压之间的差值来确定输出的数字信号。

在模数转换的过程中,ADC0804将输入的模拟信号分成若干个等级,并通过比较电路将其转换为相应的数字信号。

比较电路根据输入信号与参考电压之间的差值来判断输出的数字信号是“0”还是“1”。

通过不断逼近的过程,ADC0804可以将输入的模拟信号转换为相应的8位二进制数字信号。

转换后的数字信号将通过输出缓冲器输出。

输出缓冲器可以将转换后的数字信号放大并输出到外部设备,如微处理器或显示器等。

ADC0804由于其简单的结构和易于使用的特点,在工业控制、仪器仪表、通信等领域得到了广泛的应用。

它可以将各种模拟信号转换为数字信号,并通过输出缓冲器输出给其他设备进行处理。

总结起来,ADC0804是一款基于逐次逼近法的8位模数转换器。

它通过采样和量化的过程将输入的模拟信号转换为相应的数字信号,并通过输出缓冲器输出给其他设备。

8位模-数转换芯片ADC0804应用

8位模-数转换芯片ADC0804应用

ADC0804应用ADC0804为8位CMOS逐次比较型模数转换器。

也是初学者最常用的A/D转换器,电源电压为5V,它的转换分辨率为8位256级,即表现为输入电压分辨率为0.02V;也就是说输入电压每增加0.02V,转换输出的数据才加1.ADC0804的引脚功能如下:1、/CS(片选端)。

用来控制ADC0804是否被选取中,/CS=0时芯片被选中。

2、/RD(读控制端)。

/RD为1时,DB0-DB7处于高阻状态,/RD=0时,DB0-DB7才会输出电压数据。

3、/WR(写控制端)。

当/CS=0时,/WR由1变为0时,转换器被清除,/WR 再次回到1时,转换才重新开始。

4、CLK-IN(时钟输入端)。

5、INTR(中断输出端),低电平有效,接单片机外部中断。

6、Vin+(模拟电压同相输入端),输入电压在DC0-5.12V。

7、Vin-(模拟电压反相输入端),使用时一般接模拟地。

8、A-GND(模拟地)。

9、Vref/2(参考电压端),输入电压最高为5.12V时,应调整至2.56V;即此脚电压为输入最高电压的1/2。

10、DGND(数字地)。

11-18、(数据输出D7-D0)。

19、CLK-R(时钟外接电阻端)。

20、VCC(电源)。

ADC0804的使用分为直接控制和间接控制两种方式,直接控制就是把其当作单片机的一个外部存储器来使用,但其RD和WR端必须接单片机的RD和WR,这在硬件设计和PCB布线时有时会感到不方便;间接控制就是可用任何其它I/O 器来模拟它的控制时序,使其完成电压转换。

ADC0804直接控制方式的转换程序在其它不少资料上都有介绍,这里就不再重复,下面主要介绍间接控制方式的电压转换。

ADC0804间接控制方式转换程序:其中数据端接P0口,转换后的电压数据存入R1。

VOLT: MOV P0,#0FFHSETB INTCLR CSCLR WRSETB RDNOPNOPSETB WRCLR RDJB INT,$MOV R1,P0SETB CSRET转换后的电压数据十进制调整:DAVOL:MOV A,R1MOV B,#100DIV ABRL AMOV 3AH,A ;整数存入3AHMOV A,BMOV B,#10DIV ABRL ACLR CMOV 3BH,ASUBB A,#10JC DAV1INC 3AHMOV 3BH,A ;小数第一位存入3BHDAV1: MOV A,BRL ACLR CMOV 3CH,ASUBB A,#10JC DAV2INC 3BHMOV 3CH,A ;小数第二位存入3CHDAV2: RET电压转换完成及数据处理后,只要将3AH、3BH、3CH中的数据依次显示出来就可以了,注意显示完3AH后要接着显示小数点。

我的51单片机之模数转换ADC0804的C语言和汇编编程

我的51单片机之模数转换ADC0804的C语言和汇编编程
//返回数据处理,LED 显示,Frequency 为转换频率 unsigned int DoWitchData(unsigned int Frequency) {
unsigned char AD[2];//存高低字节 unsigned int InputV;//最后处理结果 unsigned char i; InputV=ReadAD(); AD[1]=InputV&0xF0; AD[1]=AD[1]>>4; AD[0]=InputV&0x0F; InputV=ADH[AD[1]]+ADL[AD[0]]; for(i=0;i<Frequency;i++) {
//延时 void delay(unsigned char n) {
unsigned char i; for(i=0;i<n;i++) {
; } }
//AD 转换,P 口取数 unsigned char ReadAD() {
unsigned char ADData; RDA=1; WRA=1; InputPort=0xFF; WRA=0; _nop_(); WRA=1; delay(100); RDA=0; _nop_();_nop_();_nop_();_nop_();_nop_(); ADData=InputPort; _nop_();_nop_();_nop_();_nop_();_nop_(); RDA=1; _nop_(); return (ADData); }
//
{ 0 , 1, 2 , 3 , 4 , 5, 6, 7, 8,
//
9, A , b , C , d, e, f, 点, 息灯, }
sbit RDA=P3^7; sbit WRA=P3^6; sbit INTR=P3^3;

ADC0804模数转换

ADC0804模数转换
3
{ if(IN == 0)//判断转换是否完成,如完成转换则读取数据,注意时序 { P1 = 0xff; RD1 = 1; _nop_(); _nop_(); _nop; counter = P1;//读取 RD1 = 1; set_show(counter);//更新显示函数
//***********再次启动 ADC0804 转换**************// WR1 = 1;//写信号先拉高 _nop_(); _nop_(); _nop_(); WR1 = 0;//再拉低 _nop_(); _nop_(); _nop_(); WR1 = 1;
} } } void T0_time() interrupt 1 //中断函数 { TH0 = (65536-2000)/256; TL0 = (65536-2000)%256; display();//扫描显示 }
CS = 0;//使能端拉低 _nop_(); _nop_(); _nop_(); WR1 = 1;//写信号先拉高 _nop_(); _nop_(); _nop_(); WR1 = 0;//再拉低 _nop_(); _nop_(); _nop_(); WR1 = 1;//拉高 while(1)
2
学习成果,你我共享
学习成果,你我共享
基于 51 单片机+proteus 软件仿真 ADC0804 模数转换硬件电路连接及显示:
C 程序如下: //******************ADC0804 模数转换,0804 时序网上自行查找******************// //*****************数码管为共阳数码管,实际应加驱动器件,这里略去***************// #include<reg51.h> #include<intrins.h> #define uchar unsigned char #define uint unsigned int sbit CS = P3^0;//片选端 sbit RD1 = P3^1;//读信号端 sbit WR1 = P3^2;//写信号端 sbit IN = P3^3;//转换完成标志 uchar i = 0,x = 20;//分辨率取 20 uchar uram[3] = {0}; uchar code table[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//不带小数点显示 数码管段码表 uchar code tabledp[] = {0x40,0x79,0x24,0x30,0x19,0x12};//带小数点显示数码管段码表 void set_show(uchar num)//可更新显示函数 {

adc0804文档

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转换芯片的电压值在转换芯片的参考电压范围内。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

ADC数模转换与现实
(扩展用1602带电阻值显示)
实验目的:
1.掌握ADC的使用控制方法。

2.实验内容:基本要求:设计一程序采集ADC0809第3通道的电
压值,将其转换为数字量,并在数码管上显示;5V显示为255, 0V 显示为000。

3.扩展要求:将转换结果以用1602表现出当前电阻值。

C程序:
#include<reg52.h> //52系列单片机头文件
#include<intrins.h> //包含_nop_函数所在的头文件
#define uint unsigned int //宏定义
#define uchar unsigned char
sbit CS=P2^1; //ADC0804 CS 端
sbitwr=P2^4; //ADC0804 WR 端
sbitrd=P2^5; //ADC0804 RD 端
sbit lcd1=P2^3; //lcd锁存器
sbitlcden=P2^2; //lcd1602 EN 端
sbitlcdrs=P2^0; //lcd1602 RS 端
sbitdula=P2^7; //段选端
sbitwela=P2^6; //位选端
// float r;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delay(uintxms) //延时函数
{
uinti,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void display(ucharbai,ucharshi,ucharge) //数码管显示函数{
dula=1; //打开段选
P0=table[bai]; //送入百位
dula=0; //关闭段选
P0=0xff; //消隐
wela=1; //打开位选
P0=0x7e; //选择第一位
wela=0; //关闭位选P0=0; //消隐delay(5); //延时
dula=1;
P0=table[shi];
dula=0;
P0=0xff;
wela=1;
P0=0x7d;
wela=0;
P0=0;
delay(5);
dula=1;
P0=table[ge];
dula=0;
P0=0xff;
wela=1;
P0=0x7b;
wela=0;
P0=0;
delay(5);
}
void write_com(uchar com) //1602写指令{
lcdrs=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_data(uchar data1) //1602写数据{lcdrs=1;
P0=data1;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init() //1602初始化
{
dula=0; //关闭段选
wela=0; //关闭位选
lcden=0; //lcden置于低电平
write_com(0x38); //设置16*2显示,5*7点阵,8位数据接口
write_com(0x0c); //设置开显示,不显示光标
write_com(0x06); //写一个字符后地址加1
write_com(0x01); //显示清0,数据指针清0
}
void lcd_display(uint ge,F1,F2,F3,F4) //lcd_显示(F1小数点后一位F2小数点后两位F3 F4)
{
wela=0;
dula=0;
lcden=1;
lcd1=1; //打开lcd锁存器
// write_com(0x01);
write_com(0x80); //选择在1602第一行显示write_data(48+ge); //ascii码48 写入个位delay(5); //延时
write_data('.');
delay(5);
write_data(48+F1);
delay(5);
write_data(48+F2);
delay(5);
write_data(48+F3);
delay(5);
write_data(48+F4);
delay(5);
write_data('K');
delay(5);
lcd1=0; //关闭锁存器
}
void main() //主程序
{
uchar a,A1,A2,A3,shu;
uint ge,F1,F2,F3,F4;
float r;
init();
CS=0;
while(1)
{
r=(255-shu)/256; //转换公式
wr=1;
_nop_();
wr=0; //启动A/D转换
_nop_();
wr=1;
for(a=10;a>0;a--)
{
display(A1,A2,A3);
}
P1=0xff; //读取P1口之前先给其写全1
rd=1; //选通AD0804 CS 端
_nop_();
rd=0; //A/D读使能
_nop_();
shu=P1; //A/D数据读取赋给P1口
rd=1;
A1=shu/100; //数码管分出百十个
A2=shu%100/10;
A3=shu%10;
ge=(int)r%10; //(int)字符型强制转换成整形1602分出个位跟小数点后四位
F1=(int)(r*10)%10;
F2=(int)(r*100)%10;
F3=(int)(r*1000)%10;
F4=(int)(r*10000)%10;
lcd_display(ge,F1,F2,F3,F4);
}
}
仿真图:。

相关文档
最新文档