sbit SDA=P1^4; //数据端
sbit SCL=P1^3; //时钟端
uchar zf[10]="0123456789";
uchar temp;
uchar TMR;
uint j;
uchar ADCH=0; //ADC转换结果的高8位
uchar ADCL=0; //ADC转换结果的低8位
uint ADC=0; //ADC结果
uint ADS_ADS;
void delaymm(void) //延时函数
{
_nop_(); _nop_();
_nop_(); _nop_();
_nop_(); _nop_();
_nop_(); _nop_();
_nop_(); _nop_();
_nop_(); _nop_();
}
/*****************************************************************
//函数:void start(void)
//功能:开始
//说明:时钟线为高,数据线由主到低跳变
/*****************************************************************/
void start(void)
{
SDA=0;
delaymm();delaymm();
SDA=1;
delaymm();delaymm();
SCL=1;
delaymm(); delaymm();delaymm();
SDA=0;
delaymm();delaymm();delaymm();
SCL=0;
delaymm(); delaymm();
}
/*****************************************************************
//函数:void stop(void)
//功能:结束
//说明:时钟线为高,数据线由低到高跳变
/*****************************************************************/
void stop(void)
{
SDA=0;
delaymm();delaymm();
SCL=1;
delaymm();delaymm();delaymm();
SDA=1;
delaymm();delaymm();delaymm();
SCL=0;
delaymm(); delaymm();delaymm();
}
/*****************************************************************
//函数:void check(void)
//功能:检查应答信号
//说明:时钟线为低,数据据为高,当数据线为低时表示有应答,返回0否则返回1
/*****************************************************************/
uchar check(void)
{
uchar ACK=0;
delaymm(); delaymm();delaymm();
SCL=0;delaymm();delaymm();
SCL=1;delaymm();delaymm();
if(SDA)
{
ACK=1;
}
else
{
ACK=0;
}
SCL=0;
delaymm(); delaymm();delaymm();
return(ACK);
}
/*****************************************************************
//函数:void sendBYTE(uchar data)
//功能:发送一个字节
//
/*****************************************************************/
void sendBYTE(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
if((dat&0x80)>0)
{
SDA=1;
}
else
{
SDA=0;
}
delaymm();delaymm();
SCL=1; delaymm(); delaymm();delaymm();delaymm();
SCL=0;delaymm();delaymm();
dat=dat<<1;
}
SDA=1;delaymm();
}
/*****************************************************************
//函数:uchar reciveBYTE(void)
//功能:接收一个字节
//
/*****************************************************************/
uchar reciveBYTE(void)
{
uchar temp1=0;
uchar j;
for(j=0;j<8;j++)
{
SCL=0;delaymm();
SCL=1;delaymm();delaymm();delaymm();
if(SDA) //读1
{
temp1=temp1|0x01;
}
else //读0
{
temp1=temp1&0xfe;
}
delaymm();delaymm();
SCL=0;delaymm(); delaymm();
temp1=temp1<<1;
}
return(temp1);
}
/*****************************************************************
//函数:void adk(void)
//功能:发送连续读信号
//
/*****************************************************************/
void ack(void)
{
SDA=0; delaymm();
SCL=0; delaymm();
SCL=1; delaymm();delaymm();delaymm();delaymm();delaymm();delaymm();
SCL=0; delaymm();
SDA=1; delaymm();
}
/*****************************************************************
//函数:void nack(void)
//功能:发送不连续读信号
//
/*****************************************************************/
void nack(void)
{
SDA=1; delaymm();
SCL=0; delaymm();
SCL=1; delaymm();delaymm();delaymm();delaymm();delaymm();
SCL=0; delaymm();
}
/*****************************************************************
//函数:void wrtoIIC(uchar dat)
//功能:写器件地址和配置字
//
/*****************************************************************/
void wrtoIIC(uchar dat)
{
start(); //开始写
sendBYTE(0x90); //写器件地址
while(check()); //
sendBYTE(dat);
while(check());
stop(); //结束写
}
/*****************************************************************
//函数:void rdfromIIC(void)
//功能:从ADS1110中读出数据
//
/*****************************************************************/
void rdfromIIC(void)
{
start();
sendBYTE(0x91);
while(check());
delaymm();
ADCH=reciveBYTE();
ack();
delaymm();
ADCL=reciveBYTE();
ack();
delaymm();
TMR=reciveBYTE();
nack();
stop();
ADS_ADS=(int)ADCH*256+(int)ADCL;
}
void main()
{
wrtoIIC(0x8c);
rdfromIIC();
} |