请教电子称CS1180AD芯片程序问题,数据不正常,有时正常,但重量一加上,就乱跳。关机一会再

2020-02-05 09:24发布

不知到底是转换速率不对,还是时钟不对,还是别的什么问题。都改过N次了还不行。只能改的更差。顺便贴上程序。使用的是STC 1T的单片机


void delay()
{                unsigned char i;
                for (i=0; i<10; i++)
                ;

}







//延时子程序
void delay_ms(unsigned int t)
{  unsigned int i,j;
   for(i=0;i<t;i++)
      for(j=0;j<200;j++)
         {        _nop_();        _nop_();
}
}





/*********************************************************************************************************
**         function name        :         
**         description                :
**         Arguments                :
**         Returns                        :
**        global varible        :
**        call   module        :
**       
**         Author                        :
**         Date                        :
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
        void  delay_50us(void)
                {
                unsigned char i;
                for (i=0; i<120; i++)
                ;
                } //
               
                void SPI_clock(void)
                {
                SCLK = LOW;
                delay();
                SCLK = HIGH;
                delay();
                }
/***************************************************************************************
函数原型: void SPI_send(unsigned char SPI_data) *功能 : 向spi总线上发送8位数据信号
*************************************************************************************/
                void SPI_send(unsigned char SPI_data)
                {
                unsigned char bitCount;
                for (bitCount=0; bitCount<8; bitCount++)
                {
                SDI = (bit)(SPI_data & 0x80);
                SPI_data <<= 1;
                SPI_clock();
                }
                }
/***************************************************************************************
函数原型: unsigned char SPI_receive(void) *功能 : 从spi总线上接受8位数据信号,并将接收到的数据作为一个字节返回
**************************************************************************************/
                unsigned char SPI_receive(void)
                {
                unsigned char bitCount;
                unsigned char SPI_data=0;
                SDO = 1;
                for (bitCount=0; bitCount<8; bitCount++)
                { SPI_data <<= 1;
                SCLK = HIGH;
                delay();
                SCLK = LOW;
                delay();
                if (SDO) { SPI_data++; }
                }
                return (SPI_data);
                }

/***************************************************************************************
函数原型: unsigned long ReadAdData(void) *功能 : 从CS1180中读取AD转换结果,并将结果以长整型数据返回
**************************************************************************************/
                unsigned int ReadAdData(void)
                { unsigned char i; union LongData a;
unsigned int k;
                CS = LOW; delay();
                a.byte[0] = 0;
                while (DRDY) ; //当DRDY为高时,不读取数据


                SPI_send(COMM_RDATA);
                delay_50us();
                for (i=1;i<4;i++)
                {
                a.byte = SPI_receive();
         shuju=a.byte;
                }

        k=a.word>>8;
                CS = HIGH;
                return k; //在发送读指令后,延时100us才能接收数据
                }
/*******************************************************
函数原型: void IniCS1180(void) *功能 : 初始化cs1180
**************************************************************************************/
                void IniCS1180(void)
                {
                unsigned char m; SCLK = HIGH;
                SDI = HIGH ;
                SDO = HIGH ;
                delay();
                CS = LOW;
                delay();
                SPI_send(COMM_RESET); //rst 1180
                delay();
                CS = HIGH;
                delay_50us();
                CS = LOW;
                delay();
                SPI_send(0x50); //写寄存器命令
                SPI_send(0x02);  //写寄存器命令
                SPI_send(0x00); //写入00H 内容,-SETUP寄存器
                SPI_send(0x01);//写入01H内容,MUX寄存器
                SPI_send(0x40); //写入02H内容,ACR寄存器


                CS = HIGH;
                delay_50us();

                CS = LOW;
        delay_ms(2);
                SPI_send(COMM_CALSELF); //用片内信号校准失调误差和增益误差
                delay();
                CS = HIGH;
                while (DRDY) ;
                while (!DRDY) ;  //发送3个指令 //0x00 pga = 7 //0x01 此处必须为01 //0x02 输出频率 15hz,参考电压5V
                delay_ms(10);
                while (DRDY) ;
                CS = LOW;
                delay();
                SPI_send(0x10);       
                delay();
                SPI_send(15);
                delay_50us();
                for (m=0; m <16; m++) { buf[m] = SPI_receive(); }
                }
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。