ADC0809重点总结资料

时间:2024.4.20

一、ADC0809引脚结构功能说明图:


1~5、26~28,IN0~IN7:8路模拟量输入端。

14~15、8、17~21,D0~D7:8位数字量输出端。

23~25,ADDA、ADDB、ADDC:3位地址输入线,用于选通8路模拟输入中的一路

22,ALE:地址锁存允许信号,输入,高电平有效,对应ALE上跳沿,A、B、C地址状态送入地址锁存器中。

6,START:A/D转换启动信号,输入高电平有效,START上升沿时,复位ADC0809;START下降沿时启动芯片,开始进行A/D转换;在A/D转换期间,START应保持 低电平。本信号有时简写为ST.

7,EOC:A/D转换结束信号,输出,当A/D转换结束时,此端输出一个高电平(转换期间一直为低电平)。

9,OE:数据输出允许信号,输入,高电平有效。当A/D转换结束时,此端输入一个高电平,才能打开输出三态门,输出数字量,用于控制三态输出锁存器向单片机输出转换得到的数据。OE=0,输出数据线呈高阻;OE=1,输出转换得到的数据。

10,CLK:时钟脉冲输入端。要求时钟频率不高于640KHZ,EOC=0,正在进行转换;EOC=1,转换结束。使用中该状态信号即可作为查询的状态标志,又可作为中断请求信号使用。

12、16,REF(+)、REF(-):基准电压。

11,Vcc:电源,单一+5V。

13,GND:地。

二、ADC0809与51单片机的接口电路

1、说明: D0~D7接51单片机的P2口(P2.0~P2.7)

ADIN1和ADIN2为通道IN0和IN1的电压模拟量输入(0~5V)

 



应用程序如下:

#include"reg52.h"

#define uchar unsigned char

sbit ST=P1^0;

sbit EOC=P1^1;

sbit OE=P1^2;

sbit CLK=P1^3;

sbit ADDCS=P1^4;

uchar AD_DATA[2];//保存IN0和IN1经AD转换后的数据

/*******延时函数*******/

void delay(uchar i)
{
 uchar j;
 while(i--)
 {
  for(j=125;j>0;j--)
  ; 
 }
}

/******系统初始化*******/

void init()
{

EA = 1; //开总中断

 TMOD = 0x02; //设定定时器T0工作方式  
 TH0=216; //利用T0中断产生CLK信号
 TL0=216;
 TR0=1;  //启动定时器T0
 ET0=1;

 ST=0;
 OE=0;  
}

/******T0中断服务程序********/

void t0(void) interrupt 1 using 0
{
 CLK=~CLK;
}

/******AD转换函数*******/

void AD()

{

 ST=0;
 ADDCS=0; //选择通道IN0
 delay(10);
 ST=1;   //启动AD转换
 delay(10);
 ST=0;
 while(0==EOC);
 OE=1;
 AD_DATA[0]=P2;
 OE=0;

 ST=0;
 ADDCS=1; //选择通道IN1
 delay(10);
 ST=1;   //启动AD转换
 delay(10);
 ST=0;
 while(0==EOC);
 OE=1;
 AD_DATA[1]=P2;
 OE=0; 

}

/********主函数********/

void main()

{

 init();

 while(1)

 {

  AD();

 }

}


注: 由于ADC0809内部不带时钟电路,因此用51单片机的定时器T0来产生时钟信号。

 在通道选择时,由于B,C接地,当A(ADDCS)为低电平时选择IN0,A为高电平时选择IN1

2、利用单片机AT89S51与ADC0809设计一个数字电压表,实验任务利用单片机AT89S51与ADC0809设计一个数字电压表,能够测量0-5V之间的直流电压值,四位数码显示,但要求使用的元器件数目最少。

3. 系统板上硬件连线

(1).把“单片机系统”区域中的P1.0-P1.7与“动态数码显示”区域中的ABCDEFGH端口用8芯排线连接,数码管段码控制。

(2).把“单片机系统”区域中的P2.0-P2.3与“动态数码显示”区域中的S1S2S3S4端口用8芯排线连接,数码管位码控制。

(3).把“单片机系统”区域中的P3.0与“模数转换模块”区域中的ST端子用导线相连接,转换启动控制。

(4).把“单片机系统”区域中的P3.1与“模数转换模块”区域中的OE端子用导线相连接,数据输出控制。

(5).把“单片机系统”区域中的P3.2与“模数转换模块”区域中的EOC端子用导线相连接,转换结束标志。

(6).把“单片机系统”区域中的P3.3与“模数转换模块”区域中的CLK端子用导线相连接,为转换器提供脉冲。

(7).把“模数转换模块”区域中的A2A1A0端子用导线连接到“电源模块”区域中的GND端子上,始终选择IN0单通道

(8).把“模数转换模块”区域中的IN0端子用导线连接到“三路可调电压模块”区域中的VR1端子上,调节电压变化。

(9).把“单片机系统”区域中的P0.0-P0.7用8芯排线连接到“模数转换模块”区域中的D0D1D2D3D4D5D6D7端子上,数字结果输出。

4. 程序设计内容

i.由于ADC0809在进行A/D转换时需要有CLK信号,而此时的ADC0809的CLK是接在AT89S51单片机的P3.3端口上,也就是要求从P3.3输出CLK信号供ADC0809使用。因此产生CLK信号的方法就得用软件来产生了。
ii.由于ADC0809的参考电压VREF=VCC,所以转换之后的数据要经过数据处理,在数码管上显示出电压值。实际显示的电压值 (D/256*VREF)

5. C语言源程序

#include <AT89X52.H>

unsigned char code dispbitcode[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};

unsigned char dispbuf[8]={10,10,10,10,10,0,0,0};

unsigned char dispcount;

unsigned char getdata;

unsigned int temp;

unsigned char i;

sbit ST=P3^0;

sbit OE=P3^1;

sbit EOC=P3^2;

sbit CLK=P3^3;

void main(void)

{

   ST=0;

   OE=0;

   ET0=1;

   ET1=1;

   EA=1;

   TMOD=0x12;

   TH0=216;

   TL0=216;

   TH1=(65536-4000)/256;

   TL1=(65536-4000)%256;

   TR1=1;

   TR0=1;

   ST=1;

   ST=0;

   while(1)

     {

       if(EOC==1)

         {

           OE=1;

           getdata=P0;

           OE=0;

           temp=getdata*235;

           temp=temp/128;

           i=5;

           dispbuf[0]=10;

           dispbuf[1]=10;

           dispbuf[2]=10;

           dispbuf[3]=10;

           dispbuf[4]=10;

           dispbuf[5]=0;

           dispbuf[6]=0;

           dispbuf[7]=0;

           while(temp/10)

             {

               dispbuf[i]=temp%10;

               temp=temp/10;

               i++;

             }

           dispbuf[i]=temp;        

           ST=1;

           ST=0;

         }

     }

}

void t0(void) interrupt 1 using 0

{

   CLK=~CLK;

}

void t1(void) interrupt 3 using 0

{

   TH1=(65536-4000)/256;

   TL1=(65536-4000)%256;

   P1=dispcode[dispbuf[dispcount]];//显示电压值

   P2=dispbitcode[dispcount];//位码控制

   if(dispcount==7)

     {

       P1=P1 | 0x80;

     }

   dispcount++;

   if(dispcount==8)

     {

       dispcount=0;

     }

}

三、ADC0809应用说明

1、(1). ADC0809内部带有输出锁存器,可以与AT89S51单片机直接相连。

(2). 初始化时,使ST和OE信号全为低电平。

(3). 送要转换的哪一通道的地址到A,B,C端口上。

(4). 在ST端给出一个至少有100ns宽的正脉冲信号。

(5). 是否转换完毕,我们根据EOC信号来判断。

(6). 当EOC变为高电平时,这时给OE为高电平,转换的数据就输出给单片机了。

2、ST为转换启动信号。当ST上跳沿时,所有内部寄存器清零;下跳沿时,开始进行A/D转换;在转换期间,ST应保持低电平。EOC为转换结束信号。当EOC为高电平时,表明转换结束;否则,表明正在进行A/D转换。OE为输出允许信号,用于控制三条输出锁存器向单片机输出转换得到的数据。OE=1,输出转换得到的数据;OE=0,输出数据线呈高阻状态。D7-D0为数字量输出线。 CLK为时钟输入信号线。因ADC0809的内部没有时钟电路,所需时钟信号必须由外界提供,通常使用频率为500KHZ,

VREF(+),VREF(-)为参考电压输入。(1). 进行A/D转换时,采用查询EOC的标志信号来检测A/D转换是否完毕,若完毕则把数据通过P0端口读入,经过数据处理之后在数码管上显示。(2). 进行A/D转换之前,要启动转换的方法: ABC=110选择第三通道 ST=0,ST=1,ST=0产生启动转换的正脉冲信号 .

3、ADC0809的工作过程是:首先输入3位地址,并使ALE=1,将地址存入地址锁存器中。此地址经译码选通8路模拟输入之一到比较器。START上升沿将逐次逼近寄存器复位。下降沿启动 A/D转换,之后EOC输出信号变低,指示转换正在进行。直到A/D转换完成,EOC变为高电平,指示A/D转换结束,结果数据已存入锁存器,这个信号可用作中断申请。当OE输入高电平 时,输出三态门打开,转换结果的数字量输出到数据总线上。

4、C语言源程序
#include <AT89X52.H>
unsigned char code dispbitcode[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位码数组
unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};//段码数组
unsigned char dispbuf[8]={10,10,10,10,10,0,0,0};
unsigned char dispcount;

sbit ST=P3^0;
sbit OE=P3^1;
sbit EOC=P3^2;
unsigned char channel=0xbc;//IN3
unsigned char getdata;

void main(void)
{
   TMOD=0x01;
   TH0=(65536-4000)/256;
   TL0=(65536-4000)%256;
   TR0=1;
   ET0=1;
   EA=1;

P3=channel;

while(1)
{
ST=0;
ST=1;
ST=0;
while(EOC==0);
OE=1;
getdata=P0;
OE=0;
dispbuf[2]=getdata/100;//分离百位
getdata=getdata%100;//除去百位
dispbuf[1]=getdata/10;//分离10位
dispbuf[0]=getdata%10;//分离各位
}

}

void t0(void) interrupt 1 using 0
{
TH0=(65536-4000)/256;
TL0=(65536-4000)%256;
P1=dispcode[dispbuf[dispcount]];//采样数据

  P2=dispbitcode[dispcount];//打开所要显示数据的位码
dispcount++;
if(dispcount==8)
{
dispcount=0;  }
}

四、ADC0809的内部结构

1、ADC0809的内部逻辑结构图如图9-7所示。

表9-1 通道选择¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿表

 

                                                             

2. 转换数据的传送

     A/D转换后得到的数据应及时传送给单片机进行处理。数据传送的关键问题是如何确认A/D转换的完成,因为只有确认完成后,才能进行传送。为此可采用下述三种方式。

(1)定时传送方式

     对于一种A/D转换其来说,转换时间作为一项技术指标是已知的和固定的。例如ADC0809转换时间为128μs,相当于6MHz的MCS-51单片机共64个机器周期。可据此设计一个延时子程序,A/D转换启动后即调用此子程序,延迟时间一到,转换肯定已经完成了,接着就可进行数据传送。

(2)查询方式

    A/D转换芯片由表明转换完成的状态信号,例如ADC0809的EOC端。因此可以用查询方式,测试EOC的状态,即可却只转换是否完成,并接着进行数据传送。

(3)中断方式

     把表明转换完成的状态信号(EOC)作为中断请求信号,以中断方式进行数据传送。

不管使用上述那种方式,只要一旦确定转换完成,即可通过指令进行数据传送。首先送出口地址并以信号有效时,OE信号即有效,把转换数据送上数据总线,供单片机接受。

不管使用上述那种方式,只要一旦确认转换结束,便可通过指令进行数据传送。所用的指令为MOVX 读指令,仍以图9-17所示为例,则有

MOV DPTR , #FE00H

MOVX A , @DPTR

       该指令在送出有效口地址的同时,发出有效信号,使0809的输出允许信号OE有

效,从而打开三态门输出,是转换后的数据通过数据总线送入A累加器中。

     这里需要说明的是,ADC0809的三个地址端A、B、C即可如前所述与地址线相连,也可与数据线相连,例如与D0~D2相连。这是启动A/D转换的指令与上述类似,只不过A的内容不能为任意数,而必须和所选输入通道号IN0~IN7相一致。

我为了这个ADC0809已经痛苦了好几天了,今天终于成功了。算是一个里程碑了。

为了纪念它,把东西发上来。

电路图

PCB图

实物图

程序

#include<reg51.h>
#include<intrins.h>
sbit CLOCK=P2^7;
sbit OE=P2^6;
sbit START=P2^5;
unsigned char _data;

void init()
{
SM0=0;    //SM01组合代表8位uart方式,波特率可变
SM1=1;
REN=1;    //允许串行接受
TH1=0xF3;   //波特率2400,误差0.12%
TL1=0XF3;
TMOD=0X20;      //定时器1工作于8位自动重载模式, 用于产生波特率
EA=1;    //总开关中断方式
ET1=0;    //定时器1 不允许中断
ES=1;     //允许串口中断
TR1=1;    //计时器启动控制位
START=0;
OE=0;
}
void wait(unsigned char time) //产生时钟
{
unsigned char i,j;
for(i=0;i<time;i++)
   for(j=0;j<125;j++)
   {CLOCK=0;_nop_();_nop_();_nop_();_nop_();_nop_();
   CLOCK=1;_nop_();_nop_();_nop_();_nop_();_nop_();}
}
void get()//获取数据
{
START=1;wait(10);
START=0;wait(10);
wait(10);
OE=1;
_data=P0;
OE=0;
START=0;
}
void show()//发送到串口与led灯
{
P1=_data;
TI=0;
SBUF=_data;  
while(!TI);  
TI=0;
}
void main()
{
unsigned char i;
int j=0;
init();//初始化
while(1)
{
   P2=0;
   j=0;
   for(i=0;i<10;i++)//测10次后显示
    {get();//获得数据
      j+=_data;
      }
   _data=j/10;   
   show();//发送数据

更多相关推荐:
10月份区政府重点工作总结

一、综合工作(一)召开了区政府四季度工作调度会,总结了前三季度政府工作,部署了第四季度的工作任务。(二)做好市级权限下放的各项衔接工作,并向市政府反馈了相关意见。研究制定了我区《关于进一步增强街道职能完善城市管…

乡镇计生协会重点工作总结

###乡计生协会重点工作总结20xx年我乡充分发挥计划生育协会的作用,真抓实干,造福于民。在乡党委、政府的正确领导下,在县计划生育协会的指导下,上下同心,齐抓共管,使得我乡计生协会工作取得了一些成绩,现将本年我…

9月份重点工作总结

九月份重点工作总结为增强六号高炉工段全体员工的质量意识,提升工作质量、提高铁水质量,六号高炉工段积极响应公司开展的质量推进月活动。组织了培训学习、综合整改等措施,具体如下:1、认真组织了全体员工学习了我公司有关…

上半年重点工作总结

一、民政工作:1、在局领导的具体指导下参加了春节慰问的计划制定、向管委报告申请和慰问工作。慰问低保、五保、大病救助、建国前老党员745户、1433人。使他们能够过上一个祥和、快乐的春节。2、积极参加了对流浪乞讨…

11月份重点工作总结

外宣科11月份重点工作总结及12月份重点工作计划11月份,外宣科按照月初制定的重点工作计划,以“走基层〃转作风〃改文风”活动为契机,精心策划了一批重点选题,邀请中央和自治区主要媒体开展集中宣传报道,取得了很好的…

20xx年重点工作总结

桐柏县科技局20xx年重点工作情况总结今年以来,桐柏县紧紧围绕建设生态富强和谐新桐柏目标,结合党的群众路线教育实践活动开展,做到了学习工作两不误,进一步转变了工作作风,加工大了工作力度,扎实有效地推进工作。科技…

机电动力部20xx年上半年机电重点工作总结和下半年工作计划

机电动力部20xx年上半年工作总结暨下半年重点工作计划20xx年初,公司隆重召开“工作会、安全会”,明确了煤炭购销和矿井建设两大工作任务,理清了公司全年工作总体思路,也为全年机电工作的顺利开展指明了方向。继公司…

安全环保20xx年工作总结及20xx年重点工作计划1

20xx年安全环保工作总结及20xx年重点工作计划20xx年质量安全环保工作在公司领导的正确指导下全面落实集团公司XXXX公司公司安全环保工作会议精神严格贯彻新安全生产法和环境保护法始终坚持HSE体系建设推进的...

20xx年重点工作考核表

海航云商部门20xx年重点工作考核表

重点工作督查情况汇报

重点工作督查情况汇报各位领导同志们大家好根据白办发20xx1号要求及9月4号罗书记会上安排我组于9月5日9月7日对县住建局等重点项目承办单位进行检查我们采取现场查看听取汇报和会议座谈等形式现将检查结果向各位领导...

乡镇重点整治年度工作总结

XX乡20xx年社会治安重点整治工作年度总结今年初因赌博问题比较突出我乡被市综治委确定为20xx年社会治安重点整治单位对此乡党委政府高度重视坚决贯彻落实市县综治委的决策部署变压力为动力在全乡上下开展了广泛深入的...

20xx年工作总结及20xx工作重点(物业管理)

HXD上传与您共享服务中心20xx年度工作总结与20xx年工作重点HXD上传20xx年物业服务中心在公司的领导下全体员工齐心协力围绕公司特色服务执行方案和服务中心具体计划措施开展亲情服务工作现对全年主要工作汇报...

重点工作总结(70篇)