[求助] 好心人帮我看看我的AD7705程序

moutainyang   2012-8-1 17:10 楼主
大家好,我用AD7705做模数转换,结果程序有问题,大家帮我看看吧。转换出的数据高位总是1,跪求指点!!!
这两天把我折磨死了,真是没有办法了啊
/***********AD7705.H ************/
#ifndef _AD7705_H
#define _AD7705_H
#define uchar unsigned char
#define uint  unsigned int
sbit AD_DO=P1^0;  //AD数据输出
sbit AD_DI=P1^1;  //AD数据输入
sbit AD_CLK=P1^2;  //AD数据时钟
void Write_AD(uchar);  //写数据到AD
uint Read_AD_dat(char *); //从AD读出16位的数据
uchar Read_AD_reg(void); //从AD读出8位数据
void Delay_AD(uint);  //AD延时
void Convert_AD(uchar *,uchar*); //AD转换
void Init_AD(void);  //AD初始化
void Reset_AD(void); //AD复位
#endif
/*************AD7705.C**************/
#include "AD7705.H"
#include "intrins.h"
void Write_AD(unsigned char dat)
{
  char cnt;
  AD_CLK=1;
  Delay_AD(5);
for(cnt=8;cnt>0;cnt--)
    {
      AD_CLK=0;  
   AD_DI=(bit)(dat&0x80);
   dat<<=1 ;
   Delay_AD(2);
   AD_CLK=1;
   Delay_AD(2);
    }
    AD_DI=1;
}
/*read register uchar data */
uchar Read_AD_reg(void)
{
  uchar reg=0,cnt;
  AD_CLK=1;
  Delay_AD(5);
  for(cnt=8;cnt>0;cnt--)
  { AD_CLK=0;
    reg<<=1;
    Delay_AD(1);
if(AD_DO) reg|=0x01;
else  reg|=0x00;
AD_CLK=1;
Delay_AD(3);

  }
  return reg;
}
/*read converted int value*/
uint Read_AD_dat(char *p)
{
  char cnt;
  uint temp=0;
  AD_CLK=1;
  Delay_AD(5);
for(cnt=15;cnt>=0;cnt--)
  {
AD_CLK=0;
temp<<=1;
    Delay_AD(1);
if(AD_DO){p[cnt]=0x31;temp|=0x01;}
else {p[cnt]=0x30;temp|=0x00;}
AD_CLK=1;
Delay_AD(2);
  }
return temp;
}
void Delay_AD(uint val)
{
for(val;val>0;val--) _nop_();
}
void Reset_AD(void)
{ int cnt=35;
  AD_DI=1;
  for(cnt;cnt>0;cnt--)
  {
    AD_CLK=0;
    Delay_AD(3);
AD_CLK=1;
Delay_AD(3);
  }  
}
void Convert_AD(uchar *p,uchar *a)
{ float x;
  uint temp1;
  uchar m[6];
  Reset_AD();
  Delay_AD(600);   
  do{Write_AD(0x08);
     Delay_AD(10);      
    }while (0x80&Read_AD_reg());
  Write_AD(0x38);
  Delay_AD(10);
  temp1=Read_AD_dat(p);
  x=temp1*0.38453;
  m[0] = (uchar)(x/10000);
  a[0]=m[0]+0x30;
  m[1] = (uchar)((x-m[0]*10000)/1000);
  a[1]=m[1]+0x30;
  m[2] = (uchar)((x-m[0]*10000-m[1]*1000)/100);
  a[2]=m[2]+0x30;
  m[3] = (uchar)((x-m[0]*10000-m[1]*1000-m[2]*100)/10);
  a[3]=m[3]+0x30;
  m[4] = (uchar)(x-m[0]*10000-m[1]*1000-m[2]*100-m[3]*10);
  a[4]=m[4]+0x30;
  

}
void Init_AD(void)
{
  Reset_AD();
  Delay_AD(550);
  Write_AD(0X20); //写Communication Register 下一个操作Clock Register,第一组通道
  Write_AD(0X08); //写Clock Register,DIV=1 ,CLK=0,20Hz更新速率  外部2M晶振
  Write_AD(0X10); //写Communication Register 下一个操作Setup Register
  Write_AD(0X42); //写Setup Register ,自校准,增益=1,双极输入,同步滤波=0
}

回复评论 (3)

点赞  2012-8-1 17:13
刚毕业,做个东西给卡住了,救我
点赞  2012-8-1 17:18
还没有人才看吗????
点赞  2012-8-1 17:22
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复