大家好,我用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
}