打印

用STC89C52控制ad7705,读数一直为65535

[复制链接]
8969|28
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
沙发
zhaohualiang|  楼主 | 2010-11-24 12:25 | 只看该作者
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char

uchar temp0, temp1,temp2,temp3,temp4,temp5;
uint i;

uchar code table1[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};//0 1 2 3 4 5 6 7 8 9 -
uchar code table2[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0xbf};//0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -

uint out;

sbit AD7705_DIN=P3^0;
sbit AD7705_DOUT=P3^0;
sbit AD7705_SCLK=P3^1;
sbit AD7705_DRDY=P3^2;


void delay(uint z)
        {
         uint x,y;
         for(x=z;x>0;x--)
                for(y=125;y>0;y--);
        }


void AD7705_Reset(void)
{
uchar i;
AD7705_SCLK =1;
for(i=0;i<40;i++)
  {
    AD7705_SCLK =0;
    AD7705_DIN =1;    // DIN端口连续写40个周期的高电平,保证复位
    AD7705_SCLK =1;
  }
  delay(1);             // 复位之后等待1MS         
}

//****************************************************************************
//功能:往AD7705写1个字节数据
//参数:要写入AD7705的数据
//返回:无
//备注:无
//****************************************************************************
void AD7705_WriteByte(uchar d)
        {
        uchar i;
        AD7705_SCLK =1;
       
        for(i=0;i<8;i++)
                {
                AD7705_SCLK =0;
                if(d & 0x80)
                        AD7705_DIN =1;
                else      
                        AD7705_DIN =0;
                AD7705_SCLK =1;
                d<<= 1;
                }
        AD7705_SCLK =1;
        AD7705_DIN =1;
        }

//****************************************************************************
//功能:从AD7705读一个字节的数据
//参数:无
//返回:读到的一字节数据
//备注:无
//****************************************************************************
uchar AD7705_ReadByte()
        {
        uchar i, d=0;
       
        while(AD7705_DRDY);// 写数据的时候不需要判断忙,只有读数据的时候才需?
        AD7705_WriteByte(0x38);
        AD7705_SCLK =1;

        for(i=0;i<8;i++) // 读数据,高位在前
                {
                d<<= 1;
                AD7705_SCLK =0;
                if(AD7705_DOUT)
                        d++;
                AD7705_SCLK =1;
                }
        AD7705_SCLK =1;
        AD7705_DIN =1;
        AD7705_DRDY=1;
        return d;
        }



void AD7705_Init()
        {
        AD7705_Reset();  // 复位,防止接口迷失  
        AD7705_WriteByte(0x20);    // 写ch0 clock register   
        AD7705_WriteByte(0x04);    // 2.4576MHz时钟,20Hz数据更新速率  
        AD7705_WriteByte(0x10);
        AD7705_WriteByte(0x46);
        delay(50);
        }




float AD7705_ReadVol()
        {
        uchar adc_h=0, adc_l=0;
        uint  ADValue=0;
       

          
        adc_h=AD7705_ReadByte();
        adc_l=AD7705_ReadByte();
        ADValue |=  adc_h;
        ADValue<<= 8;
        ADValue |=  adc_l;
       
        return ADValue;
        }


void main()
{
AD7705_Init();
       

while(1)
        {
         out=AD7705_ReadVol();
         temp1=out/10000;
         temp2=out%10000/1000;
         temp3=out%10000%1000/100;
         temp4=out%10000%1000%100/10;
         temp5=out%10000%1000%100%10;




        P0=table1[temp1];
        P1=P1&0xf8;       
        delay(1);

        P0=table1[temp2];
        P1++;
        delay(1);
       
        P0=table1[temp3];
        P1++;
        delay(1);

        P0=table1[temp4];
        P1++;
        delay(1);

        P0=table1[temp5];
        P1++;
        delay(1);
        }
}

使用特权

评论回复
板凳
liang7143| | 2010-11-24 16:12 | 只看该作者
:L通讯问题?

使用特权

评论回复
地板
zhaohualiang|  楼主 | 2010-11-24 17:23 | 只看该作者
今天我在ad7705前加了个AD623仪表放大器,硬件没问题,我用其他板子测试过了,我感觉是程序的问题

使用特权

评论回复
5
arao| | 2010-11-24 18:43 | 只看该作者
楼主你这电路是干嘛的,俺新人

使用特权

评论回复
6
arao| | 2010-11-24 18:45 | 只看该作者
可否介绍一下

使用特权

评论回复
7
wangyy608| | 2010-11-24 19:17 | 只看该作者
adc_h=AD7705_ReadByte();
        adc_l=AD7705_ReadByte();
这个有问题

使用特权

评论回复
8
zhaohualiang|  楼主 | 2010-11-25 08:21 | 只看该作者
这是个检测力的电路,将力值显示在数码管上。现在是把读数直接显示出来。

使用特权

评论回复
9
zhaohualiang|  楼主 | 2010-11-25 08:24 | 只看该作者
adc_h=AD7705_ReadByte();
        adc_l=AD7705_ReadByte();
这两句是什么问题啊?能说一下嘛我是新手

使用特权

评论回复
10
wangyy608| | 2010-11-25 08:37 | 只看该作者
应该是连续的16个CLK
uint d
        for(i=0;i<16;i++) // 读数据,高位在前
                {
                d<<= 1;
                AD7705_SCLK =0;
                if(AD7705_DOUT)
                        d++;
                AD7705_SCLK =1;
                }

使用特权

评论回复
11
shell.albert| | 2010-11-25 08:58 | 只看该作者
AD芯片的RESET端为什么接高电平,这样会不会使AD IC一直处于复位状态,再一个就是AD参考基准,输入不能高于这个基准,要不肯定Full-Scale。

使用特权

评论回复
12
wangyy608| | 2010-11-25 11:07 | 只看该作者
电路没有问题

使用特权

评论回复
13
pa2792| | 2010-11-25 11:14 | 只看该作者
那就没有读到数据还是FFFF.

使用特权

评论回复
14
zhaohualiang|  楼主 | 2010-11-25 11:39 | 只看该作者
感谢大家的指点,按照10楼的做法修改后可以读到数据了,:D但是数据很不稳定一直子啊跳动。研究中。。。。。

使用特权

评论回复
15
coody| | 2010-11-25 11:51 | 只看该作者
LZ,7705是Sigma-Delta ADC,注意Vref的稳定性,电源的噪声要低,你可以在Vref并个47~100uF的钽电容试试

使用特权

评论回复
16
kyzb001| | 2010-11-25 13:34 | 只看该作者
LZ   你先调试一下, 在几个关键的点 放个输出函数, 看看结果吧, 调试很辛苦。 你要知道你没一条代码会产生什么样子的结果。

使用特权

评论回复
17
GDYJ| | 2010-11-25 16:08 | 只看该作者
16位哦,不跳动都很难,除非你参考电压精准,外围温飘小,输入测量值稳定,采样间隔时间长

使用特权

评论回复
18
zhaohualiang|  楼主 | 2010-11-25 16:29 | 只看该作者
哦也是啊,现在我把几次的读数求平均值然后显示,这样跳动小了,只有最后一位在两个数之间跳动

使用特权

评论回复
19
arao| | 2010-11-25 16:47 | 只看该作者
顶LZ,俺正在学这个,希望更多高手进来讨论

使用特权

评论回复
20
coody| | 2010-11-25 19:58 | 只看该作者
我用TL431做基准,没有用软件滤波,一般只跳一个字,并且不频繁。。。
对于高分辨率的ADC,PCB布板很重要。。。
7705是Sigma-Delta ADC,其抗干扰能力类似于双积分。

使用特权

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

本版积分规则

52

主题

218

帖子

1

粉丝