1. adc0809转换的一些问题(与51单片机配合)
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输出,就是没有选择到需要的器件。
2. ADC0809与51单片机编程怎么实现
我自己做的最小系统板 自己写的代码 所以有得地方不会和其他电路板兼容但是ad0809是兼容的,你看一下#include <reg52.h>
#include <intrins.h>#define uchar unsigned char
#define uint unsigned intuchar table[16] = {0x81,0xB7,0xC2,0x92,0xB4,0x98,0x88,0xB3,0x80,0x90,0xA0,0x8C,0xCE,0x86,0xC8,0xE8};sbit CLK = P3^2; // 时钟输入端,最大为500KHz
sbit OE = P3^3; // 输出允许端 等于1时有效
sbit EOC = P3^4; // 转化完成标志 高电平表示转化结束.
sbit ST = P3^5; // 地址锁存信号.// 控制每位数码管显示
sbit L0 = P0^0;
sbit L1 = P0^1;
sbit L2 = P0^2;
sbit L3 = P0^3;
sbit L4 = P0^4;
sbit L5 = P0^5;
sbit K1 = P0^6;uchar a;
bit flag; // 输出方式的标志位void Delay(uint m)
{
uint i,j;
for (i=0; i<m; i++)
for (j=0; j<150; j++);
}//初始化串口,设置成工作方式0
void InitPort(void)
{
//; 不用设置,初始即为工作方式0
}// 发送一个数据
void SendByte(uchar dat)
{
SBUF = dat;
while (!TI);
TI = 0;
}void InitLed(void)
{
L0 = 0;
L1 = 0;
L2 = 0;
L3 = 0;
L4 = 0;
L5 = 0;
}void DisplayLed(void)
{
uint value; //unsigned long value;
//value = (a*500)/256; if (a < 132)
value = (a*500)/256;
else
{
value = (a*500)/256;
value = value + 256;
} if (!flag)
{
L0 = 0; L1 = 0; L2 = 1;
SendByte(table[value/100]&0x7F);
Delay(5);
L0 = 0; L1 = 1; L2 = 0;
SendByte(table[(value/10)%10]);
Delay(5);
L0 = 1; L1 = 0; L2 = 0;
SendByte(table[value%10]);
Delay(5);
}
else
{
L0 = 0; L1 = 0; L2 = 1;
SendByte(table[a/100]);
Delay(5);
L0 = 0; L1 = 1; L2 = 0;
SendByte(table[(a/10)%10]);
Delay(5);
L0 = 1; L1 = 0; L2 = 0;
SendByte(table[a%10]);
Delay(5);
}
}void ScanKey(void)
{
if (K1 == 0)
{
flag = !flag;
while (!K1);
K1 = 1;
}
}// 初始化AD0809
void InitAD0809(void)
{
ST = 0;
OE = 0;
}// 读AD0809中的数据
uchar ReadAD0809(void)
{
//EOC = 0;
OE = 0;
ST = 0;
//_nop_();
ST = 1; // 上升沿AD0809内部的寄存器清零
//_nop_();
ST = 0; // 产生一个至少100ns的脉冲,在转换期间ST为低 while (!EOC)
{
DisplayLed();
ScanKey();
}
OE = 1;
return P1;
}main()
{
//uint i;
TMOD = 0x01;
EA = 1;
TR0 = 1;
ET0 = 1;
flag = 0;
K1 = 1; InitLed();
InitPort();
InitAD0809(); /*for (i=0; i<16; i++)
{
SendByte(table[i]);
Delay(100);
}*/
while (1)
{
a = ReadAD0809();
}
}
void timer0(void) interrupt 1 using 1
{
TH0 = 0xFF;
TL0 = 0x80; CLK = !CLK;
}
3. ADC0809的工作过程
首先输入3位地址,并使ALE=1,将地址存入地址锁存器中。此地址经译码选通8路模拟输入之一到比较器。START上升沿将逐次逼近寄存器复位。下降沿启动 A/D转换,之后EOC输出信号变低,指示转换正在进行。直到A/D转换完成,EOC变为高电平,指示A/D转换结束,结果数据已存入锁存器,这个信号可用作中断申请。当OE输入高电平 时,输出三态门打开,转换结果的数字量输出到数据总线上。
转换数据的传送 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信号即有效,把转换数据送上数据总线,供单片机接受。
常见用途
ADC0809与MCS-51单片机的连接主要涉及两个问题。一是8路模拟信号通道的选择,二是A/D转换完成后转换数据的传送。转换数据的传送有定时传送方式、查询方式、中断方式这三种方式。A、B、C的值与被选择的通道之间的关系
4. 51单片机中P0口没接上拉电阻 能用作ADC0809转换的数据输入口不
你好!
51单片机中P0口没接上拉电阻,可以作ADC0809转换的数据输入口,但建议有的话,还是接上上拉电阻为好,驱动能力强,减少误差,数据更准确。
打字不易,采纳哦!
5. ADC0809与51单片机连接,请看下图
这个电路,是《三总线》形式。
P0,又要输出地址低八位,又要输入/输出数据。
P0,忙不过来,需要外接一个 74LS373,锁存住先输出的地址低八位。
这就是 74L373 在那里,所起的作用。
74LS373,输出的低八位地址,只用到了三位,送到了 ADC0809。
对 0809 写入,再启动它,需要的信号,就由单片机和几个门电路完成。
细节,说起来太麻烦。
看书吧,有时序波形。
6. 在与MCS-51单片机接口时,ADC0809的ALE引脚和START引脚该怎么接
单片机的ale引脚,通过d触发器4分频后接到ad0809的时钟端作为时钟信号,单片机的wr和某一个片选地址线经过或非门后接到ad0809的start引脚
7. 关于ADC0809芯片与51单片机的程序
我很崇拜做而论道,感谢他的回答
看得出楼主是采用11.0592M的晶振,9600的波特率,SMOD没有翻倍(由于12M晶振在9600的波特率也是FDH,为了准确建议用11.0592M的晶振),主要的错误在于
1)对于定时器T1、T2都使用的时候,建议写为或方式,你的串口通讯定义覆盖了T0的定义
TMOD|=0x20;
//下面就是传给计算机
2)通讯标志位没有开启,应该加上
ES
=
1;
//开串口中断
建议书写为
void
main()
{
chushi();
TMOD|=0x20;
//下面就是传给计算机
SCON=0x50;
TH1=TL1=0xfd;
TR1=1;
ES
=
1;
//开串口中断
while(1)
{
A_D();
SBUF=AD[0];
while(!TI);
TI=0;
SBUF=AD[1];
while(!TI);
TI=0;
delay1ms(1000);
}
}
另外补充点小技巧:串口初始化可以写在MAIN()的开始,因为只要执行一次就可以了;另外空循环可以不要大括号,写为for(j=0;j<125;j++);方便阅读
8. ADC0809与单片机接线,为什么ADC0809的地址是7FF8H
ADC0809的地址即通道0的地址。
9. 51单片机和ADC0809
1、将P0口作为ADC0809的输出口的连接口,传统51需要加上拉电阻(STC的不用)。
2、P0的数据处理功能和地址功无关,有外部存储器才复用。
多机通讯的时候不用P0口。
这里传不了文件了,你到下面这个地址下载个资料,对你有帮助。
http://wenku..com/view/2bed0b186bd97f192279e9ed.html