打印

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

[复制链接]
1947|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
单片机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=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;
}

无标题.jpg (122.54 KB )

无标题.jpg

相关帖子

沙发
yanyanyan168| | 2012-10-24 20:13 | 只看该作者
帮顶!

使用特权

评论回复
板凳
阿南| | 2012-10-24 23:00 | 只看该作者
楼主的get_ad()函数中,是用P1口读A/D值的(adval=P1;),但电路图确是接到P0口,所以这肯定是错的。
8051驱动0809还是建议不要用IO模拟,还是建议用最典型的接法吧,加个373

使用特权

评论回复
地板
amwrdfe| | 2012-10-25 16:39 | 只看该作者
/********ADC*************/
//#define ADC_CONTROL  P1//0-CLOCK,1-OUT_EN,2-START+ALE,3-ADDR,4-EOC
#define ADC_DATA     P3
//#define CLOCK_DAC(x) (x)&0x01? (x)&0xfe:(x)|0x01
//#define FREE_LED     P2
/************************/

sbit ADC_OUT  =P1^1;
sbit ADC_START=P1^2;
sbit ADC_ADDR =P1^3;
sbit ADC_EOC  =P1^4;
sbit ADC_CLK0 =P1^0;
/*********************/

static bit send_busy;

/******************************/
void test_clk() interrupt 3
{
        #ifdef ADC_CLK
        ADC_CLK0=~ADC_CLK0;
        #endif
}
/******************************/
/**************************/
u8 init_adc(u8 addr)
{
        static u8 adc_value;
//  u8 i=5;
       
  if(!send_busy) {
         
           ADC_ADDR =addr;
     ADC_OUT  =0;
     ADC_START=0;
     _nop_();
     ADC_START=1;
     _nop_();
     ADC_START=0;
     _nop_();
//    ADC_EOC=0;
     send_busy=1;
  }
          
        if(ADC_EOC) {
//                  FREE_LED=0x00;
//                  ADC_DATA=0x00;
                  _nop_();
                  
                  ADC_OUT=1;
                  adc_value=ADC_DATA;
                        ADC_OUT=0;
                  send_busy=0;
                }

                return adc_value;
       
}
以前自己写的,能跑,对照一下吧

使用特权

评论回复
5
lishenhere|  楼主 | 2012-12-8 10:37 | 只看该作者
查了下电路,是因为单片机的P1.1口坏了,没有输出,换个片机就好了,电路和程序是能用的,谢谢大家

使用特权

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

本版积分规则

0

主题

6

帖子

1

粉丝