当前位置: 代码迷 >> 单片机 >> 急PCF8591 AD转换的有关问题,DA正常,但是AD读的数据一直都是0x80
  详细解决方案

急PCF8591 AD转换的有关问题,DA正常,但是AD读的数据一直都是0x80

热度:41   发布时间:2016-04-28 15:53:36.0
急!!PCF8591 AD转换的问题,DA正常,但是AD读的数据一直都是0x80
不知道是怎么回事,请大家帮帮小妹。谢谢了!
不会是芯片的问题吧,DA是正常的。
主控芯片是AVR的单片机,我用IIC协议读取AD转换的结果。

------解决方案--------------------
单步调试 看读出来的AD结果是什么?看看是不是 IIC那的问题,如果出来的就是0X80 就要看采集那的程序了
------解决方案--------------------
探讨
我用示波器看了,前面的地址,控制字发的都是对的,就是到读TWDR的时候,四个通道出来的全是0x80

------解决方案--------------------
探讨
我用示波器看了,前面的地址,控制字发的都是对的,就是到读TWDR的时候,四个通道出来的全是0x80

------解决方案--------------------
给我例子 你参考一下
void DELAY5()
{
;
}
//******************************
void PCF8591_START() //PCF8591 起始信号
{
PCF8591_DATA=1;
PCF8591_CLK=1;
while(PCF8591_CLK==0)
{;}
DELAY5();
PCF8591_DATA=0;
DELAY5();
PCF8591_CLK=0;
}
//**********************************
void PCF8591_STOP() //pcf8591停止信号
{

PCF8591_DATA=0;
PCF8591_CLK=1;
while(SCL==0)
{;}
DELAY5();
PCF8591_DATA=1;
 DELAY5();
PCF8591_CLK=0;
 DELAY5();
}
//****************************
void cack()
{F0=0;
 PCF8591_DATA=1;
 PCF8591_CLK=1;
 DELAY5();
if(PCF8591_DATA==0)
{ PCF8591_CLK=0; DELAY5(); }
 else 
{F0=1;PCF8591_CLK=0;DELAY5();}
 
}
/*
void mack() //应答子程序
{ PCF8591_DATA=0;PCF8591_CLK=1;DELAY5();PCF8591_CLK=0;PCF8591_DATA=1; 
}
void mnack()//非应答子程序
{ PCF8591_DATA=1;PCF8591_CLK=1;DELAY5();PCF8591_CLK=0;PCF8591_DATA=0;
}
*/
void wrbyt0() //写入0这个1BIT的数据
{PCF8591_DATA=0;
PCF8591_CLK=1;
DELAY5();
PCF8591_CLK=0;
}
void wrbyt1() //写入1这个1BIT的数据
{PCF8591_DATA=1;
PCF8591_CLK=1;
DELAY5();
PCF8591_CLK=0;
PCF8591_DATA=0;
}
//***************************
void DATA_WRITE(unsigned j) //写入8BIT数据.
{unsigned i=0;
for(i=0;i<8;i++)
{if((j&0x80)>0)
wrbyt1();
else 
wrbyt0();
j<<=1;
}
}
//************************************
unsigned DATA_READ()
{unsigned j=0xff;
 unsigned i=0;
 for(i=0;i<8;i++)
{PCF8591_DATA=1;PCF8591_CLK=1;
if(PCF8591_DATA==0)
{j<<=1;j=(j&0xfe);PCF8591_CLK=0;}
else
{j<<=1;j=(j|0x01);PCF8591_CLK=0;}
}
return(j);
}

//************************************
unsigned READ_AD(void)
{unsigned j=0, k=0;

//duad1:
//do
{ PCF8591_START() ;
DATA_WRITE(0x90); //ad寻址字
cack();
}
//while (F0==1);
//{
PCF8591_START() ;
DATA_WRITE(0x91); //写器件地址和读命令
cack();

j=DATA_READ(); //读出AD转换后的数据
PCF8591_STOP(); 
return(0xa0); 
//}
}