单片机ad转换,采集电压信号,再通过串口输出,ad用的adc0809。但是改变模拟信号输出时结果不变

模拟信号用电位器产生,用串口调试助手观察,但是调节电位器,显示结果始终不变,始终为5V左右的最大值
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=P1;
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;
}
地址线ABC三脚接地,模拟量从adc0809的IN0口输入,图没改过来,Protues中单片机ALE口没法输出时钟信号,没办法仿真,串口部分测试了,没有问题,感觉是AD部分不工作,但是找不到原因

电路 电圧模拟量 是 3 通道 通过 P1 与 P2 口控制 从 P0 口读取,
软件 没有看出来 电圧模拟量是如何读取采集的,
检查一下软件吧。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-10-23
没选通采集通道吧。。没有对p2.0 2.1 2.2 的操作追问

地址线ABC三脚接地,模拟量从adc0809的IN0口输入,图没改过来

第2个回答  2012-10-25
ad
相似回答