我悲剧的ADS1100调试部成功,各位大虾帮帮忙看看~~

2020-01-26 13:00发布

/*ads1100端口定义*/
          sbit SDA=P2^7;
          sbit SCL=P2^6;
//          bit ack_bit;

                uchar ACK;
                uchar adc_h;     
                uchar adc_l;   
                uint adc;  
                uint adc_data;
                      uint ADS_mid;

/**************ADS1100程序段****************/

/*****************************************************/               
/*    函数原型: void ads_start (void)               */   
/*    功    能: 提供I2C总线工作时序中的起始位。      */      
/*****************************************************/           
void ads_start (void) //在SCL高的情况下,SDA由高到低的变化造成START。     
  {   
    SDA=1;   
    _nop_();  
_nop_();     
    SCL=1;   
    _nop_();   
    _nop_();   
    _nop_();
    _nop_();   
    _nop_();   
    _nop_();
    SDA=0;   
    _nop_();   
    _nop_();   
    _nop_();  
    _nop_();   
    _nop_();   
    _nop_();   
    SCL=0;   
    _nop_();   
    _nop_();   
    _nop_();   
    _nop_();   
  }   
/**********************************************************/   
/*    函数原型: void ads_stop(void)                       */   
/*    功    能: 提供I2C总线工作时序中的停止位。           */   
/**********************************************************/   
void ads_stop(void) //在SCL高的情况下,SDA由低到高的变化造成STOP。     
  {   
   
    SDA=0;   
    _nop_();  
        _nop_();   
    SCL=1;   
    _nop_();   
    _nop_();   
    _nop_();  
    _nop_();   
    _nop_();   
    _nop_();     
    SDA=1;   
    _nop_();   
    _nop_();   
    _nop_();  
    _nop_();   
    _nop_();   
    _nop_();   
    SCL=0;   
    _nop_();   
    _nop_();   
    _nop_();   
    _nop_();   
  }
/*****************************************************************************/   
/*    函数原型: uchar ack_check(void)                                        */   
/*    功    能: 提供I2C总线的时钟信号, 并返回在时钟电平为高期间SDA 信号线上状*/   
/*              态。本函数可用于数据发送, 也可用于数据接收。                  */   
/*****************************************************************************/   
uchar ack_check(void) // 检查 从机 应答信号 SDA为低电平为应答   
  {  
    //SCL=0;   
    SCL=1;   
    _nop_();
    _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 send_data) // 发送一个字节     
{   
uchar bitcount=8;         // 发送8位数据。     
do   
{
if((send_data&0x80)==0x80)SDA=1;   //写 1        
else SDA=0; //写 0     
SCL=0;         //在时钟大于4u秒期间写数据     
SCL=1;   
_nop_();   
_nop_();   
_nop_();   
_nop_();   
_nop_();
_nop_();   
_nop_();   
_nop_();   
_nop_();   
_nop_();   
SCL=0;   
send_data=send_data<<1;       //   待送数据左移一位.     
bitcount--;   
}while(bitcount);//等待数据写完
SDA=1;        //释放总线等待应答
_nop_();   
_nop_();   
_nop_();   
_nop_();   
_nop_();
    _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_();   
        _nop_();   
        _nop_();   
        _nop_();
        _nop_();   
        _nop_();   
        _nop_();   
        _nop_();   
        _nop_();
        if(SDA) in_data=in_data|0x01; //读 1     
        else in_data=in_data&0xfe; //读 0      
        SCL=0;     
        if(bitcount1-1) in_data=in_data<<1;   
                bitcount1--;   
    }while(bitcount1);  
    return(in_data);   
}  
/****************************************************************************/   
/*    函数原型: void  send_Ack(void);                                      */   
/*    功    能: 向I2C总线发送一个应答信号ACK, 用于连续数据读取时。          */   
/****************************************************************************/   
void send_ack(void) // 发送连续读信号    主机应答信号  
  {   
    SDA=0;   //低电平应答
    SCL=0;   
    SCL=1;   
    _nop_();   
    _nop_();   
    _nop_();   
    _nop_();   
    _nop_();
    _nop_();   
    _nop_();   
    _nop_();   
    _nop_();   
    _nop_();
    SCL=0;   
  }     
void send_nack(void) // 发送不连续读信号   非应答信号  
  {   
    SDA=1;   //高电平非应答
    SCL=0;   
    SCL=1;   
    _nop_();   
    _nop_();   
    _nop_();   
    _nop_();   
    _nop_();   
         _nop_();   
    _nop_();   
    _nop_();   
    _nop_();   
    _nop_();   
    SCL=0;   
  }   
/*********************************************************/   
/*    函数原型: void write_ads(uchar snd_data)           */   
/*    功    能: 写器件地址和配置字。                     */   
/*********************************************************/   
void write_ads(uchar snd_data)  //写器件地址和配置字     
  {   
    ads_start();            //开始写     
    ads_sendBYTE(0x98);     //写器件地址(写) 1001(固定) 100(器件编号) 0(写)
    do   
    {
     ;
    }while(ack_check());     //等待应答     
    ads_sendBYTE(snd_data);     //写配置字     
    do   
    {
     ;
    }while(ack_check());    //等待应答     
    ads_stop();             //结束写     
  }
/******************************************************/   
/*    函数原型: read_ads(void)                        */   
/*    功    能: 数据读取。                            */   
/******************************************************/   
uint read_ads(void)          //从ADS1100中读出数据     
  {   
  uchar adc_cfg;     
    ads_start();             //开始读     
    ads_sendBYTE(0x99);      //写器件地址(读)    1001(固定) 100(器件编号) 1(读)
    do   
    {   
     ;   
    }while(ack_check());     //等待应答
    adc_h = ads_reciveBYTE(); //读高8位     
    send_ack();                 //连续读     
    adc_l = ads_reciveBYTE();   //读低8位     
    send_ack();                 //连续读     
                  adc_cfg = ads_reciveBYTE(); //读配置字     
    send_nack(); //发送不连续读信号
    ads_stop();                 //结束读     
        adc=(adc_h<<8)+adc_l;
        return adc;
  }  
/**********************************************************************************************/

/*********主程序************/
        void main()                               
        {

        time0_init();
        lcd_init();
        key_init();
        SDA=1;
        SCL=1;
        write_ads(0x8C);//写配置字 转换速率8sps,16位  1倍增益,连续转换

while(1)
        {
        adc_data=read_ads();//读取ad转换值
        ADS_mid=adc_data*4810/32768;//下面是液晶显示的, 不知道是不是这里写错了~~
                ADS_dat[0]=ADS_mid/1000+0x30;
                ADS_dat[2]=(ADS_mid%1000)/100+0x30;
                ADS_dat[3]=(ADS_mid%100)/10+0x30;
                ADS_dat[4]=ADS_mid%10+0x30;
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。