
这个电路,是《三总线》形式。
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时程序需要改等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)