|
楼主 |
发表于 2010-3-3 08:24:36
|
显示全部楼层
////////////////////////////////
//起动总线
void I2C_start()
{
SDA=1;
SCL=1;
delay_5us();
SDA=0;
delay_5us();
SCL=0;
}
////////////////////////////////
//结束总线
void I2C_stop()
{
SDA=0;
SCL=0;
delay_5us();
SCL=1;
delay_5us();
SDA=1;
delay_5us();
// SCL=1;
}
////////////////////////////////
//等待应答
void Waitack()
{
uint i;
SCL=1;
delay_5us();
while((SDA==1)&&(i<5000))
i++;
SCL=0;
delay_5us();
}
/////////////////////////////////
// 写应答或非应答
void WriteACK(uchar ack)
{
SDA=ack;
delay_5us();
SCL=1;
delay_5us();
SCL=0;
}
/////////////////////////////////
//写数据字节
void Write_byte(uchar ch)
{
uchar i=8;
while(i--)
{
SCL=0;
delay_5us();
SDA=(bit)(ch&0x80);
ch<<=1;
delay_5us();
SCL=1;
delay_5us();
}
SCL=0;
Waitack();
}
///////////////////////////////
//读数据字节
Read_byte()
{
uchar i=8;
uchar ddata=0;
SDA=1;
while(i--)
{
ddata<<=1;
SCL=0;
delay_5us();
SCL=1;
delay_5us();
ddata|=SDA;
}
SCL=0;
return ddata;
}
/////////////////////////////
//ADS1110写配置寄存器
void Write_ADS1110()
{
I2C_start();
Write_byte(0x90); //ED0
Write_byte(0x8F);
I2C_stop();
}
////////////////////////////
//ADS1110读取数据
int Read_ADS1110()
{
int SW;
uchar SWH,SWL,h,i;
float a=0;
uint x;
Write_ADS1110();
// DelayNS(20); //
for(i=0;i<8;i++) //采集8次,取平均值
{
SWH=0;
SWL=0;
x=0;
do
{
I2C_start();
Write_byte(0X91);
SWH=Read_byte();
WriteACK(0); //应答0
SWL=Read_byte();
WriteACK(0); //应答0
h=Read_byte();
WriteACK(0); //应答0
I2C_stop();
}
while(h&0x80); //单次转换完成
x=SWH*256+SWL;
a=a+x;
}
SW=(int)(a/8);
return SW;
}
/////////////////////
Get_DATA()
{
int SW, SWL,SWH,WD;
uchar XS;
uchar i,j;
SW=Read_ADS1110(); //???????是否判断正负???????????????????
DATA[1]=(uchar)(SW/256);
DATA[2]=(uchar)(SW%256);
} |
|