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

📄 ads1100.c

📁 ADS1100的实用代码
💻 C
字号:
/***************************************************************************/              
/*    函数原型: void ads_start (void)                                      */   
/*    功    能: 提供I2C总线工作时序中的起始位。                            */     
/***************************************************************************/          
void ads_start (void) //在SCL高的情况下,SDA由高到低的变化造成START。    
  {   
    SDA=1;   
    _nop_();   
    SCL=1;   
    _nop_();   
    _nop_();   
    _nop_();   
    SDA=0;   
    _nop_();   
    _nop_();   
    _nop_();   
    SCL=0;   
    _nop_();   
    _nop_();   
  }   
/**************************************************************************/   
/*    函数原型: void ads_stop(void)                                       */   
/*    功    能: 提供I2C总线工作时序中的停止位。                           */   
/**************************************************************************/   
void ads_stop(void) //在SCL高的情况下,SDA由低到高的变化造成STOP。    
  {   
   
    SDA=0;   
    _nop_();   
    SCL=1;   
    _nop_();   
    _nop_();   
    _nop_();   
    SDA=1;   
    _nop_();   
    _nop_();   
    _nop_();   
    SCL=0;   
    _nop_();   
    _nop_();   
  }   
/*****************************************************************************/   
/*    函数原型: uchar ack_check(void)                                        */   
/*    功    能: 提供I2C总线的时钟信号, 并返回在时钟电平为高期间SDA 信号线上状*/   
/*              态。本函数可用于数据发送, 也可用于数据接收。                  */   
/*****************************************************************************/   
uchar ack_check(void) // 检查应答信号    
  {   
   
    SCL=0;   
    SCL=1;   
    _nop_();   
    if (SDA )   
    {   
     ACK = 1;   
    }   
    else   
    {   
     ACK = 0;   
    }   
    SCL=0;   
    return(ACK);  // 如果收到ACK应答则返回0, 否则返回1。          
  }   
/****************************************************************************/   
/*    函数原型: void ads_sendBYTE(uch data)                                 */   
/*    功    能: 向I2C总线发送8位数据。                                     */   
/****************************************************************************/   
void ads_sendBYTE(uchar snd_data) // 发送一个字节    
  {   
    uchar bitcount=8;         // 发送8位数据。    
    do   
    {   
       if((snd_data&0x80)==0x80)  //   从左到右选送D7,屏蔽D0~D6。    
         {   
           SDA=1;             //写 1    
         }   
       else   
         {   
           SDA=0;             //写 0    
         }   
        SCL=0;                //在时钟大于4u秒期间写数据    
        SCL=1;   
        _nop_();   
        _nop_();   
        _nop_();   
        _nop_();   
        _nop_();   
        SCL=0;   
        snd_=snd_<<1;       //   待送数据左移一位.    
        bitcount--;   
    }    
    while(bitcount);   
    SDA=1;   
    _nop_();   
    _nop_();   
    _nop_();   
    _nop_();   
    _nop_();   
  }   
/***************************************************************************/   
/*    函数原型: ads_reciveBYTE(void)                                       */   
/*    功    能: 从I2C总线上接收8位数据信号, 并将接收到8位数据作为一个字节  */   
/*              返回, 不回送应答信号ACK。主函数在调用本函数之前应保证SDA信 */   
/*              号线处于浮置状态, 即使8052的Px.x脚置1。                  */   
/***************************************************************************/   
uchar ads_reciveBYTE(void) //接受一个字节    
  {   
    uchar in_data=0;   
    uchar bitcount1=8;   
    do   
    {   SCL=0; //在时钟大于4u秒期间读数据    
        SCL=1;   
        _nop_();   
        _nop_();   
        if(SDA) //读 1    
          {   
            in_data=in_data|0x01;   
          }   
        else //读 0    
          {   
            in_data=in_data&0xfe;   
          }   
   
        SCL=0;   
   
        if(bitcount1-1)   
          {   
            in_data=in_data<<1;   
          }   
            bitcount1--;   
    }   
    while(bitcount1);   
    return(in_data);   
  }   
/****************************************************************************/   
/*    函数原型: void function send_Ack(void);                               */   
/*    功    能: 向I2C总线发送一个应答信号ACK, 一般用于连续数据读取时。       */   
/****************************************************************************/   
void send_ack(void) // 发送连续读信号    
  {   
    SDA=0;   
    SCL=0;   
    SCL=1;   
    _nop_();   
    _nop_();   
    _nop_();   
    _nop_();   
    _nop_();   
    SCL=0;   
  }   
   
void send_nack(void) // 发送不连续读信号    
  {   
    SDA=1;   
    SCL=0;   
    SCL=1;   
    _nop_();   
    _nop_();   
    _nop_();   
    _nop_();   
    _nop_();   
    SCL=0;   
  }   
/****************************************************************************/   
/*    函数原型: write_ads(uchar data)                                       */   
/*    功    能: 写器件地址和配置字。                                        */   
/****************************************************************************/   
void write_ads(uchar snd_data)  //写器件地址和配置字    
  {   
    ads_start();            //开始写    
    ads_sendBYTE(0x90);     //写器件地址(写)    
    do   
    {   
     ;   
    }while(ack_check());    //等待应答    
    ads_sendBYTE(snd_data);     //写配置字    
    do   
    {   
     ;   
    }while(ack_check());    //等待应答    
    ads_stop();             //结束写    
  }   
/****************************************************************************/   
/*    函数原型: read_ads(void)                                              */   
/*    功    能: 数据读取。                                                 */   
/****************************************************************************/   
void read_ads(void)         //从ADS1100中读出数据    
  {   
//  uchar adc_hi;    
//  uchar adc_lo;    
//  uchar adc_cfg;    
    ads_start();            //开始读    
    ads_sendBYTE(0x91);     //写器件地址(读)    
    do   
    {   
     ;   
    }while(ack_check());        //等待应答    
   
    adc_hi = ads_reciveBYTE();  // 读高8位    
    send_ack();                 //连续读    
    adc_lo = ads_reciveBYTE();  //读低8位    
    send_ack();                 //连续读    
    adc_cfg = ads_reciveBYTE(); //读配置字    
    send_nack();   
    ads_stop();                 //结束读    
  }   
   
/***************************************************************************/   

⌨️ 快捷键说明

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