⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ads1110.c

📁 AVR MEGA系列单片机使用ADS1110代码
💻 C
字号:
#define ADS1110_GLOBAL

//-----------------------------------------------
//#define  uchar unsigned char 
//-----------------------------------------------
#include "includes.h"//<mega128.h>
//#include <delay.h>
//-----------------------------------------------

/*******************************************************************************
名称:    ads1110Start(void)
功能:     ADS1110 I2C Start
******************/
void ads1110Start(void)
{
    ADS1110_SDA=1;
    _nop_();
    _nop_();
    ADS1110_CLK=1;
    _nop_();
    _nop_();
    ADS1110_SDA=0;
    _nop_();
    _nop_();
    ADS1110_CLK=0;
    _nop_();
    _nop_();
}
/*******************************************************************************
名称:    ads1110Stop(void)
功能: ADS1110 I2C Stop
******************/
void ads1110Stop(void)
{
    ADS1110_SDA=0;
    _nop_();
    _nop_();
    ADS1110_CLK=1;
    _nop_();
    _nop_();
    ADS1110_SDA=1;
    _nop_();
    _nop_();
    ADS1110_CLK=0;                // -----------结束I2C总线,即发送I2C结束条件.
    _nop_();
    _nop_();
} 
/*******************************************************************************
名称:    waitAck(void)
功能:     ADS1110 I2C 等待ack
******************/
uchar waitAck(void)
{
    uchar errtime;

    errtime=40;
    DDRB &= ~0x04;
    while(ADS1110_SDAIN)                //-----------等待ADS1100应答
    {
        errtime--;
        if(!errtime)
        {
            ads1110Stop();
            return 0x00;
        }
    }
    DDRB |= 0x04;
    ADS1110_CLK=1;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    ADS1110_CLK=0;

    return 0xff;
}
/*******************************************************************************
名称:    void sendAck(void)
功能:     向ADS1110 I2C 发送 ack
******************/
void sendAck(void)
{
    ADS1110_SDA=0;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    ADS1110_CLK=1;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    ADS1110_CLK=0;
}
/*******************************************************************************
名称:    void sendNotAck(void)
功能:     向ADS1110 I2C 不发送 ack
******************/
void sendNotAck(void)
{
    ADS1110_SDA=1;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    ADS1110_CLK=1;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    ADS1110_CLK=0;
}
/*******************************************************************************
*******************
名称:    void ads1110SendByte(BYTE sendData)
功能:     向ADS1110 I2C 发送1个字节
********************************************************************************
******************/
void ads1110SendByte(uchar sendData)
{
    uchar i;

    ADS1110_CLK=0;
    for( i=0; i<8;i++ )
    {
        if(sendData & 0x80) ADS1110_SDA=1;
        else ADS1110_SDA=0;
        _nop_();
        _nop_();
        sendData <<= 1;
        ADS1110_CLK = 1;             //置时钟线为高,通知被控器开始接收数据位
        _nop_();
        _nop_();
        ADS1110_CLK = 0;
    }
}
/*******************************************************************************
*******************
名称:    uchar ads1110ReceiveByte(void)
功能:     ADS1110 I2C 接收1个字节
********************************************************************************
******************/
uchar ads1110ReceiveByte(void)
{
    uchar i,receiveData;

    receiveData=0;
    ADS1110_CLK=0;
    DDRB &= ~0x04;
    for(i=0;i<8;i++    )
    {
        ADS1110_CLK=1;                 //置时钟线为高使数据线上数据有效
        _nop_();
        _nop_();
        receiveData<<=1;

        if(ADS1110_SDAIN)
            receiveData |= 1;        //读数据位,接收的数据位放入ucRet中

        ADS1110_CLK=0;
        _nop_();
        _nop_();
    }
    DDRB |= 0x04;
    return(receiveData);
}
/*******************************************************************************
*******************
名称:    void ads1110Config(void)
功能:     对ADS1110进行配置
********************************************************************************
******************/
void ads1110Config(void)
{
  #asm("cli")
    ads1110Start();
    ads1110SendByte(ADS1110_WR_ADDRESS);
    waitAck();
    ads1110SendByte(ADS1110_CONFIG_REG);
    waitAck();
    ads1110Stop();
     #asm("sei"); 
}
/*******************************************************************************
*******************
名称:    读取ADS1100数据子程序
功能:
********************************************************************************
******************/
unsigned char  RD_ADS(void )
{
    uchar  temp00,ss,*p;//,adstrs[7];
  #asm("cli")
    ads1110Start();                            //-----------启动I2C总线,即发送I2C起始条件.
    ads1110SendByte(ADS1110_RD_ADDRESS);        //-----------寻址ADS1110(ED0)
    temp00=waitAck();
    ss=temp00;       
    if(temp00)                                 //如果应答正确
    {
        adc[0] = ads1110ReceiveByte();     //-----------读数据 高字节
        sendAck();                     //主机应答
        adc[1] = ads1110ReceiveByte();        //-----------读数据 低字节
        sendAck();                     //主机应答
        adc[2] = ads1110ReceiveByte();         //读配置字
        sendAck();
//        sendNotAck();                //主机不应答
        ads1110Stop();   
//      WriteStrComm02(3,adc );   
     #asm("sei"); 
      
      if(adc[2]==0x0c)
      {
       p=(unsigned char *)&ADS1110ad;
       *(p+0)=adc[1];
       *(p+1)=adc[0];     
/*          adstrs[0]='(';
   adstrs[1]=ADS1110ad/10000+0x30;
   adstrs[2]=(ADS1110ad%10000)/1000+0x30;
   adstrs[3]=(ADS1110ad%1000)/100+0x30;
   adstrs[4]=(ADS1110ad%100)/10+0x30;
   adstrs[5]=ADS1110ad%10+0x30;
   adstrs[6]=')';
  WriteStrComm02(7,adstrs );*/
       return(0);
      }
      else
       return(1);
    }
  #asm("sei");
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -