shuipaopao 发表于 2012-10-6 19:33:01

上传一个ADS1230的驱动程序,请高手解释其中数据处理部分

/*******************************************************************************
// 说明: 头文件声明
*******************************************************************************/
#define ADS1230_GLOBALS
#include "INCLUDES.H"
/*******************************************************************************
// 函数名: Ads1230_Init
// 说明: ADS1230初始化程序
// 描述:
// 入口参数: 无
// 出口参数: 无
*******************************************************************************/
void Ads1230_Init ( void )
{
    INT8U delay_count;
   
    ADS1230_PDWN = 1;
    _nop_();
    _nop_();
    ADS1230_PDWN = 0;
   
    for ( delay_count = 0x80; delay_count != 0; delay_count-- )//128
    {
      _nop_();
    }
   
    ADS1230_PDWN = 1;
   
    for ( delay_count = 0x80; delay_count != 0; delay_count-- )
    {
         _nop_();
    }
}
/******************************************************************************
// 函数名: Read_AD_SampleValue_From_Ads1230
// 说明: 读A/D内码值
// 描述:
// 入口参数:
// 出口参数:
*******************************************************************************/
INT32U Read_AD_SampleValue_From_Ads1230 ( void )
{
    INT32U receive_data_buf = 0;
        INT8Ucycle, receive_data_buf2;
   
        ADS1230_CLK = 0;
        _nop_();
    _nop_();
    _nop_();
    _nop_();
        _nop_();
    _nop_();
       
    if ( !ADS1230_DATA )
        {
                for ( cycle = 0; cycle < 10; cycle++ )
            {
            _nop_();
            _nop_();
      }
               
                for ( cycle = 0; cycle < 12; cycle++ )
                {
            receive_data_buf <<= 1;
                        ADS1230_CLK = 1;
                    _nop_();
                    _nop_();
            ADS1230_CLK = 0;
            _nop_();
            _nop_();
            
                    if ( ADS1230_DATA == 1 )
                              receive_data_buf |= 0x0001;//0000 0000 0000 0001
                        else
                receive_data_buf &= 0xFFFE;//1111 1111 1111 1110
            _nop_();
            _nop_();
                }
      for ( cycle = 0; cycle < 8; cycle++ )
                {
            receive_data_buf2 <<= 1;
                        ADS1230_CLK = 1;
                    _nop_();
                    _nop_();
            ADS1230_CLK = 0;
            _nop_();
            _nop_();
            
                    if ( ADS1230_DATA == 1 )
                              receive_data_buf2 |= 0x01;//0000 0001
                        else
                receive_data_buf2 &= 0xFE;//1111 1110
            _nop_();
            _nop_();
                }
      
      ADS1230_CLK = 0;
      
            for ( cycle = 0; cycle < 5; cycle++ )
                {
                        _nop_();
                        _nop_();
                }
      
      receive_data_buf = ( receive_data_buf << 8 ) + receive_data_buf2;
      //raima_back = receive_data_buf * 256 + receive_data_buf2;
      return ( receive_data_buf );
        }
   
}

/*******************************************************************************
// 函数名: AdSampleValue_Dight
// 说明:
// 描述:
// 入口参数:
// 出口参数:
*******************************************************************************/
void AdSampleValue_Dight ( void )
{
    INT32U dight_data_buf;
   
    dight_data_buf = Read_AD_SampleValue_From_Ads1230 ();
    if ( dight_data_buf < 0x80000 )
    {
      raima_back = dight_data_buf >> 1;    }
    else
    {
      ES = 0;                                                                             // 串行中断使能无效
      raima_back = (( ~( dight_data_buf - 1 ) ) & 0x000FFFFF ) >> 1;      // 负数 ( 取19位AD值, 屏蔽5位 )
      raima_back = -raima_back;
      ES = 1;                                                                                                                    //
    }
}
这段代码是网上找的,其中红线部分为什么将转换结果右移一位????请熟悉ADS1230的高手指点一下。
页: [1]
查看完整版本: 上传一个ADS1230的驱动程序,请高手解释其中数据处理部分