请教各位大侠AD7705的DRDY一直为高电平的问题

2019-07-16 06:59发布

请教各位大侠AD7705的DRDY一直为高电平的问题,以下是关于AD7705的程序,是在网上找的,号称完美版,看了datersheet也找不出什么问题,不知为什么呢?

/*---------------------------------------------------------
                  7705接口定义
----------------------------------------------------------*/  
sbit sclk = P2^4;
sbit drdy = P2^5;
sbit din  = P2^6;
sbit dout = P2^7;
省去其他的部分
/***********************************************************
延时子程序,延时时间以12M晶振为准,延时时间为10us×time
***********************************************************/
void delay(unsigned char  time)
  {
  unsigned char  n;
     for(n=0;n<time;n++) ;
  }

/* AD7705通信端口复位 */  
void Reset7705(void)  
{
    unsigned char i;
sclk=1;
    for(i=0;i<40;i++) //*多于连续32个 din=1 使串口复位
    {   
        sclk=0;  
        din =1;  
        sclk=1;  
    }
delay(100);
}

//写入寄存器8位数据
void Write(unsigned char dat)
{

unsigned char i;
for(i=0;i<8;i++)
{
din=(bit)(dat&0x80);
sclk=1;
sclk=0;
sclk=1;
dat<<=1;//保证t13延时
}
din=1; //为保证不乱写程序,此语句非常重要,否则试验表明很不稳定
}

//从数据寄存器中读出16位数据
unsigned int Read(void)
//低电平拉下t5后出数据
{
unsigned  rtval=0;
unsigned char i;
for(i=0;i<16;i++)
{
sclk=0;
rtval<<=1;//i=0时,此操作不妨碍
rtval+=(0x0001&(unsigned int)dout);
sclk=1; //程序执行完后sclk仍为高电平
}
din=1; //为保证不乱写程序,此语句非常重要,否则试验表明很不稳定
return rtval;
}

/*****************************************************
此函数测试用,用于读8位的寄存器
通过修改Write();中的参数值可选择不同的寄存器
*****************************************************/
unsigned Read8bit(void) //从寄存器中读出8位数据
//低电平拉下t5后出数据
{
unsigned char rtval=0;
unsigned char i;

while(drdy==1);
Write(0x28); //修改此处值可从不同寄存器中读数
sclk=1;
for(i=0;i<8;i++)
{
sclk=0;
rtval<<=1;
//if(dout)rtval|=0x01;
rtval+=(0x01&(unsigned)dout);//保证t5
sclk=1; //程序执行完后sclk仍为高电平
}
sclk=1;
din=1;
return rtval;
}   
//////////////////////////////////////////////////////

void Adc7705Init(unsigned char range)
{
range<<=3;
// Reset7705();  //复位

//写时钟寄存器
Write(0x20); //0x20:00100000 下一个时钟寄存器;写;正常工作模式;通道AN1
Write(0x02); //0x07:00000010 主时钟打开;晶振2.4576M;不分频;100Hz;  
//Write(0x07); //0x07:00000111 主时钟打开;晶振2M;不分频;500Hz;
  
//写设置寄存器
Write(0x10); //0x10:00010000 下一个设置寄存器;写;正常工作模式;通道AN1
Write(0x46|range); //0x46:01000110 自校准;单极性;接缓冲,允许处理高阻电源;非复位;增益为1
}


//返回一次采样值
unsigned int Adc7705(void) `
{
   
while(drdy==1);//程序一直在这里循环
Write(0x38); //0x38:00111000 下一个16位数据寄存器;读;正常工作模式;通道AN1
//   while(drdy==1);
return Read();

}
Reset7705();
Adc7705Init(0);
temp =Adc7705();  


但是调试发现一直出不来,可不可以分享一些宝贵的经验,不吝赐教。感激万分!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。