你当前位置: 首页 >> 产品应用
产品应用

PIC16F946与ADS1112的接口程序

2013/2/25 |  2262次阅读 

ADS1112是TI公司AD产品系列中性价比较高的一颗&Delta-&Sigma 16位ADC,双通道差分输入或三通道单端输入,内部2.048V参考电压,最大8倍PGA,MSOP10封装,功耗极低,特别适用于对功耗要求比较高的高精度便携式仪表产品,而且操作非常简单.
ADS1112框架图:
PIC16F946脚位图
以下为访问程序,供应用中参考:
 
设置ADS1112函数,利用MCU本身I2C接口电路:
void setADS1112(void)
{
 start_i2c()     //启动
 if(put_byte(0x90))    //写地址
 {
  ERROR_CODE=0X21   //AD发送地址字节失败
 }
 else if(put_byte(LCDDATA0))   //发送配置码
 {
  ERROR_CODE=0X22   //AD发送配置码失败
 }
 else      //操作成功
 {
  AD_STA=1    //设置AD标志,下次中断
 }
 stop_i2c()     //停止
}
读取ADS1112函数:
void readADS1112(void)

 start_i2c()     //启动
 if(put_byte(0x91))    //发送器件地址
 {
  ERROR_CODE=0X11   //中断内AD发送地址失败
 }
 else
 {
  tmp.byte[1]=get_byte(0)  //接收高字节
  tmp.byte[0]=get_byte(1)  //接收低字节
  BT_FILTER_P=tmp.word   //保存数据
 }
 stop_i2c()
}
下面是IO模拟I2C的程序
//===================产生启动条件==========================
void start_i2c(void)
{
 DATA_LAT=0    //拉低DATA
 DATA_TRIS=0
 Delay10TCYx()   //延时10us
 SCLK_LAT=0
 SCLK_TRIS=0   //拉低SCL
 Delay10TCYx()   //延时40us
 Delay10TCYx()
 Delay10TCYx()
 Delay10TCYx()
}
//===================产生停止条件==========================
void stop_i2c(void)
{
 DATA_LAT=0    //拉低DATA
 DATA_TRIS=0
 Delay10TCYx()   //延时10us
 SCLK_TRIS=1   //释放时钟线
 Delay10TCYx()   //延时10us
 DATA_TRIS=1   //释放数据线
 Delay10TCYx()   //延时10us
}
//==================产生重启动条件=========================
void rstart_i2c(void)
{
 DATA_TRIS=1   //释放数据线
 Delay10TCYx()   //延时10us
 SCLK_TRIS=1   //释放时钟线
 Delay10TCYx()   //延时10us
 DATA_LAT=0
 DATA_TRIS=0   //拉低数据线
 Delay10TCYx()   //延时10us
 SCLK_LAT=0
 SCLK_TRIS=0   //拉低时钟
 Delay10TCYx()   //延时40us
 Delay10TCYx()
 Delay10TCYx()
 Delay10TCYx()
}
//=====================发送1字节===========================
//参数: data:要发送的数据
//返回: 应答状态;1:NACK0:ACK
//=========================================================
unsigned put_byte(unsigned data)
{
 unsigned bit_=0x80
 unsigned data2=0
 do
 {
  if(data&bit_) //目标位为1?
  {
   DATA_TRIS=1 //拉高数据线
  }
  else
  {
   DATA_TRIS=0 //拉低数据线
   DATA_LAT=0 
  }
  Delay10TCYx()  //延时10us
  SCLK_TRIS=1  //时钟线输出高
  Delay10TCYx()  //延时10us
  SCLK_LAT=0
  SCLK_TRIS=0  //拉低时钟线
  bit_>>=1
 }while(bit_)  //所有8位发送完毕?
 
 DATA_TRIS=1   //设置数据线为输入,以接收应答位
 Delay10TCYx()   //延时10us
 SCLK_TRIS=1   //释放时钟线
 Delay10TCYx()   //延时10us
 if(DATA_PORT)   //采集应答状态
 {
  data2=1
 }
 SCLK_LAT=0
 SCLK_TRIS=0   //拉低时钟线
 return(data2)   //返回应答位
}
//=====================接收1字节===========================
//参数: ack:接收完毕后的应答状态,
//返回: 收到的数据
//=========================================================
unsigned get_byte(unsigned ack)
{
 unsigned buf=0
 unsigned bit_=8
 DATA_TRIS=1   //设置数据线为输入,以接收
 do
 {
  buf<<=1
  Delay10TCYx()   //延时10us
  SCLK_TRIS=1   //释放时钟线
  Delay10TCYx()   //延时10us
  if(DATA_PORT)   //采集应答状态
  {
   buf|=0x01
  }
  SCLK_LAT=0
  SCLK_TRIS=0   //拉低时钟线
 }while(bit_)  //循环发送各位
 if(ack==0)     //发送应答位
 {
  DATA_TRIS=0   //拉低数据线
  DATA_LAT=0 
 }
 Delay10TCYx()    //延时10us
 SCLK_TRIS=1    //时钟线输出高
 Delay10TCYx()    //延时10us
 SCLK_LAT=0
 SCLK_TRIS=0    //拉低时钟线
 return(buf)    //返回收到的数据
}

返回 | 顶部