[讨论] 今天用Proteus仿真的ADC0809。。。但实际0809不工作啊。。。。

pippin   2010-9-4 16:27 楼主

 

单片机的对应ST脚的P口接上0809时就被拉低了。Proteus仿真什么问题都没有。0809要注意什么问题么?
有两个问题:1,我希望设定的是500K,用定时器方式2也是设成255。可从P口出来的就是50K 啊。
2,ST脚被拉低,但不接0809时单片机P口是正常的。
之前ST,OE,EOC,CLK都用的是P1口,然后P3口读数据,P0口接上拉电阻后接的LED。。。。
现在AD出来的没变化。P0口是FF。
下边是程序。请高手帮忙分析一下啊。
#include"reg52.h"
#define uchar unsigned char
sbit ST=P1^2;
sbit EOC=P1^1;
sbit OE=P1^0;
sbit CLK=P1^3;
sbit C3=P1^4;
sbit C2=P1^5;
sbit C1=P1^6;
uchar AD_DATA; //保存经AD转换后的数据
/**********延时函数************/
void delay(uchar i)
{
uchar j;
while(i--)
{
for(j=125;j>0;j--)
;
}
}
/*********系统初始化***********/
void init()
{
EA = 1; //开总中断
TMOD = 0x02; //设定定时器T0工作方式
TH0=255; //利用T0中断产生CLK信号
TL0=255;
TR0=1; //启动定时器T0
ET0=1;
ST=0;
OE=0;
}
/***********T0中断服务程序************/
void t0(void) interrupt 1 using 0
{
CLK=~CLK;
}
/***********AD转换函数**********/
void AD()
{
ST=0;
C3=1;
C2=1;
C1=0; //选择通道IN0
delay(10);
ST=1; //启动AD转换
delay(10);
ST=0;
while(0==EOC)
;
OE=1;
AD_DATA=P2;
OE=0;
P0=AD_DATA;
}
/*****************主函数**************/
void main()
{
init();
while(1)
{
AD();
}
}
[ 本帖最后由 pippin 于 2010-9-4 16:33 编辑 ]

回复评论 (2)

ST为转换启动信号。当ST上跳沿时,所有内部寄存器清零;下跳沿时,开始进行A/D转换;在转换期间,ST应保持低电平。EOC为转换结束信号。当EOC为高电平时,表明转换结束;否则,表明正在进行A/D转换。OE为输出允许信号,用于控制三条输出锁存器向单片机输出转换得到的数据。OE=1,输出转换得到的数据;OE=0,输出数据线呈高阻状态。D7-D0为数字量输出线

楼主看下这个时序描述,我是按照这个写的程序,还是仿真能用,  注意EOC读取时应该先赋1
给你个我的程序看看


uchar ADC_data;
EOC=1;
ST=0;
OE=0;
P3=P3&0x1f;  //通道清零
P3|=ch<<5;  //设置通道  《表示左移5位
ST=1;
ST=0;
while(EOC==0);
OE=1;
ADC_data=P1;
OE=0;
return ADC_data;
点赞  2010-9-4 18:54

回复 沙发 jialaolian 的帖子

现在单片机接上0809后ST脚就一直是低,我是怀疑0809接到的ST就是0。根本不工作。但也找不出问题在哪。。。。有些困惑。。。。。但当不接0809,甚至0809不给电的时候单片机都有ST的脉冲输出。。。。。我最近是第一次弄AD,调0809好几天了,一直也不知道哪可能出问题。。。。Proteus仿真0809用0808的信息,仿真是好使的。可是实际做出来就有问题了。
还有您的那个程序移位那里不太明白。

还有,高手能留下QQ号么,想请教一下。真的挺着急的。
点赞  2010-9-6 11:35
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复