ADC0809与51单片机连接,请看下图

ADC0809与51单片机连接,请看下图,第1张

这个电路,是《三总线》形式。

P0,又要输出地址低八位,又要输入/输出数据。

P0,忙不过来,需要外接一个 74LS373,锁存住先输出的地址低八位。

这就是 74L373 在那里,所起的作用。

74LS373,输出的低八位地址,只用到了三位,送到了 ADC0809。

对 0809 写入,再启动它,需要的信号,就由单片机和几个门电路完成。

细节,说起来太麻烦。

看书吧,有时序波形。

P0口实数据地址输出端,不能接AD的控制端A、B、C,单片机送数据的时候P0口的数值时变化的 相应的你AD的通路选择口A、B、C也是变化的 结果也就不正常了。把A、B、C接P1口或P2口就行 。

接地就表示你AD只用了通道0,只要你模拟数据的输入只用通道0就可以。 图看完了,主要看你需要的测量的是几组模拟量,如果只有一组就全接地,如果是多组就需要接P1口或者P2口

这个就不怎么清楚了 你贴在上面的程序看了下 没什么问题你在从头好好理下思路看什么地方出错了

proteus中的ADC0809是不能仿真的,只有用ADC0808。其实,ADC0808和ADC0809引脚和功能是完全相同的,程序也完全一样,根本就不需要改什么。

仿真图中放置一个ADC0808,再把型号改成ADC0809就行了。程序也不用改的。

你把程序格式弄的规范一些,很好看出来的。。。我只画了一个流程图给你,另外一个也很简单的嘛,自己动手弄弄吧。。;延时子程序_1

DELAY1:

PUSH

05H

MOV

R5,#10H

DELAY2:

LCALL

DISP1

;调用子程序DISP1

DJNZ

R5,DELAY2

POP

05H

;延时子程序_2

DELAY12:

PUSH

06H

PUSH

05H

MOV

R6,#4

DELAY21:

MOV

R5,#225

DELAY31:

DJNZ

R5,DELAY31

DJNZ

R6,DELAY21

POP

05H

POP

06H

RET

END

89C52采集0809八位AD并显示出来的。现在估计没有人用了

#include<reg52h>

#include<absacch>

#define uchar unsigned char

#define uint unsigned int

#define LCDCOM XBYTE[0x8ffc] //LCD写命令寄存器地址

#define LCDDATA XBYTE[0x8ffd] //LCD写数据寄存器地址

#define LCDSTATUS XBYTE[0x8ffe] //LCD读状态寄存器地址

#define IN2 XBYTE[0x7ffa] //IN2通道地址

sbit ad_busy=P3^2;

sbit bflag=ACC^7;

//函数的声明部分

void delay1(uint x);

void lcd_busy();

void lcd_cmd(uchar lcd_cmd);

void lcd_data(uchar lcd_data);

void lcd_moveto(uchar position);

void init(void);

void ad0809(void);

uchar string[10]={"dianya is:"};

uchar temp[6]={0x00,0,0x00,0x00,0x00,0x0b};

uchar code dis_buf[13]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x2e,0x56,0x20};//为0到9的ASCLL码

void delay1(uint x) //延时1ms程序

{

uchar j;

while(x--)

{

for(j=0;j<125;j++)

{;}

}

}

void lcd_busy() //检测lcd忙程序

{

do

{

ACC=LCDSTATUS;

}

while(bflag==1); //当他忙的时候就不停的检测,直到空闲为止

}

void lcd_cmd(uchar lcd_cmd) //写命令函数

{

LCDCOM=lcd_cmd;

lcd_busy();

}

void lcd_data(uchar lcd_data) //写数据函数

{

LCDDATA=lcd_data;

lcd_busy();

}

void lcd_moveto(uchar position) //确定显示位置

{

uchar temp; //为显示位置对应的地址

if (position<16)

temp=(position+0x80-1); //为在第一行

else

temp=((position-16)+0xc0); //为第二行

lcd_cmd(temp);

}

void init(void) //lcd初始化

{

lcd_cmd(0x30); //置功能:1行,57字符

lcd_busy();

lcd_cmd(0x30); //置功能:1行,57字符

lcd_busy();

lcd_cmd(0x30); //置功能:1行,57字符

lcd_busy();

lcd_cmd(0x38); //置功能:2行,57字符

lcd_busy();

lcd_cmd(0x06); //置输入模式:地址增量,显示屏不移动

lcd_busy();

lcd_cmd(0x0c); //置显示开,不显示光标,光标不闪烁

lcd_busy();

lcd_cmd(0x01); //清显示

lcd_busy();

}

void ad0809(void)

{

uchar i;

uint a=0;

IN2=0;

i=i;

i=i;

while(ad_busy==0);

a=IN2;

a=a200/255;

a=a25;

temp[0]=a/1000;

temp[2]=a%1000/100;

temp[3]=a%100/10;

temp[4]=a%10;

}

void main(void)

{

uchar i,j;

P2=0xff;

P1=0xff;

P0=0xff;

delay1(20);

init();

while(1)

{

ad0809();

lcd_moveto(1);

for(j=0;j<10;j++)

{

lcd_data(string[j]);

}

lcd_moveto(16);

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

{

lcd_data(dis_buf[temp[i]]);

}

}

}

1 、地址是人为定义的,在51单片机中P0口是低位地址8位与数据口8位分时复用,所有连接在地址总线上的器件,都必须有一个地址区间(地址块),例如,RAM 62256需要32Kbyte,0000H--7FFFH,就是一个片选信号。

ad转换器需要一个,经过地址译码器,译码后的“区间”,即储存器的片选信号,译码器可以分成1,2,4,8块----,1就是单一地址,必须译码器;看自己需要选定,选定一块,如果需要,这一块还可以用译码器再次译码,原则上可以到单个地址,ADC0809需要8个地址,用低位地址线A0,A1,A2三根,和上面所述的片选信号线,完成对该器件8路ad转换器的选择,低位地址线可以共用,片选线不能与其它器件共用。

2、外部数据输入到P0口是需要有相应的器件被选择,需要读写信号线控制的,这里用 /RD 读信号,它不是单一发出,它与地址线共同完成对器件的读写 *** 作。

这个例子中,需要选择这个ADC器件(片选),还需要选择由哪一路转换器输出(A0,A1,A2)。

data=P0这条指令和data=P1一样,没有地址输出,没有/RD输出,就是没有选择到需要的器件。

你把adc的CLK接单片机的ALE 试试。

定时器 就 不用了。

我之前遇到的问题是这样的(可能和你有点不一样):

用proteus 仿真 是好的(也用的是定时器控制CLK)

但是,实际线路中,开机第一次转换是好的,接下来改变电位器就没反应了。

改变电位器后,再重启就又有一次好的(此时电位器的值)。

下面是我之前的提问:呵呵,希望对你有帮助!

>

在你的模板目录下新建一个模板文件rss_phphtm

内容为

<xml version="10" encoding="utf-8">

<rss version="20">

<channel>

<title><![CDATA[{dede:globalcfg_webname/}]]></title>

<link>{dede:globalcfg_basehost/}</link>

<description>{dede:globalcfg_description/}</description>

<language>zh-cn</language>

<generator><![CDATA[{dede:globalcfg_webname/}]]></generator>

<webmaster>binxl@126com</webmaster>

{dede:arclist row='1000' titlelen='100' orderby='pubdate'}

<item>

<title><![CDATA[[field:title/]]]></title>

<link>[field:arcurl/]</link>

<description><![CDATA[[field:description function='html2text(@me)'/]]]></description> <pubDate>[field:pubdate function='strftime("%a, %d %b %Y %H:%M:%S +0800",@me)'/]</pubDate>

<category><![CDATA[[field:typename/]]]></category>

<author><![CDATA[[field:writer/]]]></author>

</item>

{/dede:arclist}</channel>

</rss>

以上就是关于ADC0809与51单片机连接,请看下图全部的内容,包括:ADC0809与51单片机连接,请看下图、求助~adc0809和51单片机放一起工作不正常,程序错了还是硬件接错了、在做51单片机数字电压表时,用proteus仿真时用ADC0808代替0809时程序需要改等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10047434.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-04
下一篇2023-05-04

发表评论

登录后才能评论

评论列表(0条)

    保存