打印

求助!!单片机ad转换,但是改变模拟信号时输出结果不变

[复制链接]
4071|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 lishenhere 于 2012-10-24 18:48 编辑

谢谢大家的回复,我更新了一下图片,之前图片跟电路不一样,还有就是想问问 片机用P0口接ADC0809要不要加上拉电阻;我试了用P2口,结果也没有用,输出结果还是没有变化,和断开0809和单片机之间数据线得到的值是一样的,这是不是代表0809输出高阻态,是不是输出锁存器没打开,我现在搞不清楚,希望大家能继续帮助我做出这个电路,谢谢大家。
我不我仿真用的图和文件传了上来,仿真是可以的。
单片机ad转换,采集电压信号,再通过串口输出,ad用的adc0809。但是改变模拟信号输出时结果不变,模拟信号用电位器产生,用串口调试助手观察,但是调节电位器,显示结果始终不变,始终为5V左右的最大值
地址线ABC三脚接地,模拟量从adc0809的IN0口输入,图没改过来,Protues中单片机ALE口没法输出时钟信号,没办法仿真,串口部分测试了,没有问题,感觉是AD部分不工作,但是找不到原因
C程序代码:
#include<reg52.h>
#include<intrins.h>
#include<stdio.h>
#define uchar unsigned char
#define uint unsigned int

sbit ST=P1^0;
sbit EOC=P1^1;
sbit OE=P1^2;
float ad_vo;
uchar tmclk,pau,flag_tm,a,flag_uart,flag_on,ad_val,A1,A2,A3;

void init()
{
ST=0;
OE=0;
TMOD=0x21;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TH1=0xfd;
TL1=0xfd;
TR1=1;
ET0=1;
SCON=0x50;
PCON=0x00;
EA=1;
ES=1;
}

uchar get_ad() ///ad采集
{
uchar adval;
ST=0;
_nop_();
ST=1;
_nop_();
ST=0;
P1=0xff;
OE=1;
adval=P0;//之前这点写的是adval=P1,是错的,我接的是P0口
OE=0;
return adval;
}

void main()
{
init();
while(1)
{
if(flag_uart==1) ///状态提示
{
flag_uart=0;
ES=0;
TI=1;
switch(flag_on)
{
case 0:puts("on\n");
TR0=1;
break;
case 1:printf("off\n");
TR0=0;
break;
case 2:puts("Error\n");
break;
}
while(!TI);
TI=0;
ES=1;
}
if(flag_tm==1) ////输出结果
{
flag_tm=0;
ad_val=get_ad();
ad_vo=(float)ad_val*5.0/256.0;
ES=0;
TI=1;
printf("%fV\n",ad_vo);
//SBUF=ad_val;
while(!TI);
TI=0;
ES=1;
}
}
}

void timer0() interrupt 1 ////定时1S
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
pau++;
if(pau==20)
{
pau=0;
flag_tm=1;
}

}
void ser() interrupt 4 //////接收上位机指令
{
RI=0;
a=SBUF;
flag_uart=1;
if(a==1)
flag_on=0;
else if(a==2)
flag_on=1;
else
flag_on=2;
}

无标题2.png (32.61 KB )

无标题2.png

ad-51-0809.zip

24.32 KB

keil-protues文件.zip

54.74 KB

相关帖子

沙发
xlhtracy| | 2012-10-24 16:41 | 只看该作者
帮顶一下  哪位高手解答

使用特权

评论回复
板凳
shell.albert| | 2012-10-24 16:58 | 只看该作者
先单步调试一下。看看结果是否变化!

使用特权

评论回复
地板
阿南| | 2012-10-24 17:09 | 只看该作者
楼主的图有问题,主要是在ALE和P0口上,如果ADC0809的ALE由单片机的ALE提供,那么89C52驱动0809需要加74HC373锁存器,此时P0口即做地址也作数据线。
如果ADC0809的ALE由单片机的普通IO口模拟,那么P0口需要作为普通IO口驱动,此时ADC0809的并行通讯及时序都是模拟的。

使用特权

评论回复
5
lishenhere|  楼主 | 2012-10-25 17:26 | 只看该作者
请高手帮忙解答一下,真的很着急用,谢谢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

6

帖子

1

粉丝