CS1237是一款高精度、低功耗模数转换芯片,一路差分输入通道,内置温度传感器和高精度振荡器。
      /*----------------------------------------------------------------------------
      CODE NAME: AD_Communication.C
      - description
      - MCU与ADC通讯相关子程序
      -----------------------------------------------------------------------------*/
      //整个通讯时序的时间必须小于1个数据转换周期
      //推荐每个CLK的时间长度:2uS ~ 15uS
      /*-----------------------------------------------------------------------------
      Name : F_AD_Clock
      Function: ADC时序时钟
      -----------------------------------------------------------------------------*/
      void F_AD_Clock(void)
      {
      IO_CLK_AD = 1;
      F_Delay();
      IO_CLK_AD = 0;
      F_Delay();
      }
      /*-----------------------------------------------------------------------------
      Name : F_Read_AD_Byte
      Function: 读3字节AD值
      -----------------------------------------------------------------------------*/
      void F_Read_AD(void)
      {
      _UCHAR i;
      R_AD0.word = 0;
      EIC20_EIE0 = 0; //关闭MCU_DAT管脚的外部中断(防止读写时误触发)
      // while(IO_Data_AD);
      for(i = 0; i 《 24; i++) //发送24个CLK,接收数据
      {
      R_AD0.word 《《= 1;
      F_AD_Clock();
      if(IO_Data_AD)
      {
      R_AD0.word ++;
      }
      }
      F_AD_Clock();
      F_AD_Clock();
      F_AD_Clock();
      //CLK27,拉高DRDY
      //如果一个数据转换周期内对ADC进行两次或以上的读写操作,则需要发送46个CLK,而不是27个CLK
      //(即:发送24个CLK读取数据,然后再发送22个CLK)
      EIC20_EIE0 = 1;
      //
      重新开启
      MCU_DAT
      管脚的外部中断
      }
      /*-----------------------------------------------------------------------------
      Name : F_Rd_AdReg
      Function: 读取ADC寄存器
      -----------------------------------------------------------------------------*/
      _UCHAR
      F_Rd_AdReg(void)
      {
      _UCHAR i;
      union _UCHAR_BIT R_Temp;
      //----------------------------------
      EIC20_EIE0 = 0;
      //关闭MCU_DAT管脚的外部中断(防止读写时误触发)
      //----------------------------------
      //1 ~ 3:clk1-clk27
      //----------------------------------
      for(i = 0; i 《 27; i++)
      {
      F_AD_Clock();
      }
      //----------------------------------
      //4:clk28-clk29
      //----------------------------------
      IO_Data_AD_Dir = 1;
      //把MCU_Data管脚设为输出
      F_AD_Clock();
      F_AD_Clock();
      //----------------------------------
      //5:clk30-clk36(发送读命令)
      //----------------------------------
      R_Temp.byte = 0xAC;
      //读命令(0x56)左移1位
      for(i = 0; i 《 7; i ++)
      {
      if(R_Temp.bit.b07)
      //MSB
      {
      IO_Data_AD = 1;
      }
      else
      {
      IO_Data_AD = 0;
      }
      R_Temp.byte = R_Temp.byte 《《 1;
      F_AD_Clock();
      }
      //----------------------------------
      //6:clk37
      //----------------------------------
      IO_Data_AD_Dir = 0;
      //把MCU_Data管脚设为输入
      F_AD_Clock();
      //----------------------------------
      //7:clk38-clk45(读取寄存器)
      //----------------------------------
      R_Temp.byte = 0;
      for(i = 0; i 《 8; i++)
      {
      R_Temp.byte 《《= 1;
      F_AD_Clock();
      if(IO_Data_AD)
      {
      R_Temp.byte ++;
      }
      }
      //----------------------------------
      //8:clk46
      //----------------------------------
      F_AD_Clock();
      //----------------------------------
      EIC20_EIE0 = 1;
      //重新开启MCU_DAT管脚的外部中断
      return R_Temp.byte;
      }
      /*-----------------------------------------------------------------------------
      Name : F_Wr_AdReg
      Function: 写入ADC寄存器
      -----------------------------------------------------------------------------*/
      void F_Wr_AdReg(_UCHAR R_AdReg)
      {
      _UCHAR i;
      union _UCHAR_BIT R_Temp;
      //----------------------------------
      EIC20_EIE0 = 0;
      //关闭MCU_DAT管脚的外部中断(防止读写时误触发)
      //----------------------------------
      //1 ~ 3:clk1-clk27
      //----------------------------------
      for(i = 0; i 《 27; i++)
      {
      F_AD_Clock();
      }
      //----------------------------------
      //4:clk28-clk29
      //----------------------------------
      IO_Data_AD_Dir = 1;
      //把MCU_Data管脚设为输出
      F_AD_Clock();
      F_AD_Clock();
      //----------------------------------
      //5:clk30-clk36(发送写命令)
      //----------------------------------
      R_Temp.byte = 0xCA;
      //写命令(0x65)左移1位
      for(i = 0; i 《 7; i ++)
      {
      if(R_Temp.bit.b07) //MSB
      {
      IO_Data_AD = 1;
      }
      else
      {
      IO_Data_AD = 0;
      }
      R_Temp.byte = R_Temp.byte 《《 1;
      F_AD_Clock();
      }
      //----------------------------------
      //6:clk37
      //----------------------------------
      F_AD_Clock();
      //----------------------------------
      //7:clk38-clk45(写入寄存器)
      //----------------------------------
      R_Temp.byte = R_AdReg;
      for(i = 0; i 《 8; i ++)
      {
      if(R_Temp.bit.b07) //MSB
      {
      IO_Data_AD = 1;
      }
      else
      {
      IO_Data_AD = 0;
      }
      R_Temp.byte = R_Temp.byte 《《 1;
      F_AD_Clock();
      }
      //----------------------------------
      //8:clk46
      //----------------------------------
      IO_Data_AD_Dir = 0;
      //把MCU_Data管脚设为输入
      F_AD_Clock();
      //----------------------------------
      EIC20_EIE0 = 1; //重新开启MCU_DAT管脚的外部中断
      }
          资源源自网络,侵删