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

📄 adc0834code.txt

📁 可以用于驱动AD转化芯片ADE0834的SPI串口
💻 TXT
字号:
ADC0832-2应用程序-ADC0832,C语言,KEIL C,51单片机基础知识C语言
      //==============================================================================
      //2005-03-28...2005-03-29
      //ADC0834模块的C51程序源文件
      //File Name=ADC083X.c
      //==============================================================================
      #include 
      #include "DELAY_S.h"
      #include "ADC083X.h"


      //外部全局变量的预定义
      //*******************************************************
      //序号:
      //        HD_ADC083X_S01
      //功能:    
      //        端口初始化
      //输入:    
      //        无
      //输出:    
      //        无
      //********************************************************
      void adc083x_init(void)
      {
          SET_ADC083X_CS;    //不选片
          SET_ADC083X_DO;    //默认是高  
          CLR_ADC083X_CLK;   // 时钟默认是低
      #if TYPE_VAL >=ADC0832  
          SET_ADC083X_DI;
      #endif
      #if TYPE_VAL >=ADC0834
          SET_ADC083X_SARS;
      #endif
      }
      //*******************************************************
      //序号:
      //        HD_ADC083X_S02
      //功能:    
      //        读出AD数据字节
      //输入:    
      //        chanel    通道号以及单、双端设置选择,它的值被类型值限制!
      //            即有效值是select分别取最低4、3、2位或不使用
      //            具体的值参见pdf文档!
      //输出:    
      //        AD转换的结果字节
      //********************************************************
亲爱的:CHANEL(通过CHANEL的值的2.1.0三位组合选择模拟通道1/2/3/4)数值代表选择转换的通道哦
      uchar adc083x_do_one_change(uchar chanel)
      {
      uchar data ad_val;
      uchar data i;
          //转换前的初始化
          SET_ADC083X_CS;
          CLR_ADC083X_CLK;
          SET_ADC083X_DO;          
          CLR_ADC083X_CS;
      //SARS引脚非必要时可以不使用,以节省引脚资源!
      #if (TYPE_VAL==ADC0838)
          //chanel_.3.2.1.0=0000 通道0+_通道1-,=001 通道2+_通道3-,(双端方式)
亲爱的(TYPE_VAL==ADC0838)表示片子是ADC0838的,8个通道(chanel的后四位选择通道 包括单端方式,就是输入电压一个接地一个接CHANEL模拟输入通道哦)差分方式就是两端分别接通道如CH1和CH2通过输入端的电压差来作为输入电压信号,等待芯片的转换。
          // SGL(单端)/DIF差分  ODD/SIGN  SELECT    SELECT    =0010 通道4+_通道5-,=011 通道6+_通道7-,(双端方式)
          // =0100 通道0-_通道1+, =0101 通道2-_通道3+,(双端方式)
          // =0110 通道4-_通道5+,=0111 通道6-_通道7+,(双端方式)
          //                    =1000 通道0+,    =1001 通道2+,(单端方式)
          //                    =1010 通道4+,    =1011 通道6+,(单端方式)
          //                    =1100 通道1+,    =1101 通道3+,(单端方式)
          //                    =1110 通道5+,    =1111 通道7+,(单端方式)
          //引脚/SE可以接地,不使用其控制反响字节的输出延时功能!


          chanel |=0x10;        //附加起始位
          for(i=0; i<5; i++)
          {
              if( (chanel &0x10)!=0)
              {
                  SET_ADC083X_DI;
              }
              else
              {
                  CLR_ADC083X_DI;
              }
              SET_ADC083X_CLK;
              CLR_ADC083X_CLK;
              chanel <<=1;
          }

 #elif 
(TYPE_VAL==ADC0834)//chanel_.2 .1.0 =000 通道0+_通道1-,=001 通道3-,(双端方式)
 // SGL/DIF ODD/SIGN SELECT=010 通道0-_通道1+, =011 通道2-_通道3+,(双端方式)
 //                 =100 通道0+,        =101 通道2+,(单端方式)
  //                =110 通道1+,        =111 通道3+,(单端方式)
 亲爱的(TYPE_VAL==ADC0838)表示片子是ADC0838的,8个通道(chanel的后四位选择通道 包括单端方式,就是输入电压一个接地一个接CHANEL模拟输入通道哦)差分方式就是两端分别接通道如CH1和CH2通过输入端的电压差来作为输入电压信号,等待芯片的转换。         
选择通道:
chanel=4//通道0+(单端方式)
chanel=5//通道1+(单端方式)
chanel=6//通道2+(单端方式)
chanel=7//通道3+(单端方式)
         chanel |=0x08;        //附加起始位
         for(i=0; i<4; i++)
          {
              if( (chanel &0x08)!=0)  //如果第四位是1
              {
                  SET_ADC083X_DI;     //DI=1就是如果第四位为1就传1如果是0就传0。然后左移位,把要发的数据都移位到第四位上发出。
              }
              else
              {
                  CLR_ADC083X_DI;
              }
              SET_ADC083X_CLK;       //时钟=1 数据传到DI 线上 
              CLR_ADC083X_CLK;       //时钟=0 ADC0834保存DI得到的数据
              chanel <<=1;           //发完一位,左移一位发下面的位
          }
      
//以下是ADC0832的通道命令传输,与我们,没有关系哦

#elif (TYPE_VAL==ADC0832)
//chanel_.1.0=00 通道0+_通道1-, =01 通道0-_通道1+,(双端方式)
//    SGL/DIF ODD/SIGN    =10 通道0+,       =11 通道1+,    (单端方式)

          chanel |=0x04;        //附加起始位
          for(i=0; i<3; i++)
          {
              if( (chanel &0x04)!=0)
              {
                  SET_ADC083X_DI;
              }
              else
              {
                  CLR_ADC083X_DI;
              }
              SET_ADC083X_CLK;
              CLR_ADC083X_CLK;
              chanel <<=1;
          }
      #else    //缺省时为ADC0831          
          SET_ADC083X_CLK;
          CLR_ADC083X_CLK;       
      #endif
          
SPI总线是通过两个单向线DI和DO线和AD0834等芯片进行通信哦,DI是单片机向AD0834输出控制信号(单片机先要告诉AD0834现在要转换的是哪个通道,是单端还是差分输入,DI传输必须以一个“1“作为起始位,必须使CHANEL第四位为1,所以chanel |=0x08;//附加起始位其余三位2,1,0位代表SGL/DIF ,ODD/SIGN ,SELECT = 010)然后就把这4位以先传第四位然后第三位,这样4次传完。选择通道和方式(单端方式/差分方式),ADC0832就知道了需要把你想要转换的通道数据转换并开始从DO口一位一位的数据传输,因为是8位的数据输出,(ADC0838是12位的,所以需要指出是先传8位还是先传4位/SE来决定先传12位还是先传4位)而ADC0834不用这一位控制。所以时序就是单片机传CHANEL命令给ADC0834,然后单片机就可以通过时钟和DO来进行8次移位操作来接收数据,然后保存在ad_val中,供单片机调用,要查询两个通道可以通过分别输入输入不同的CHANEL命令来进行操作)

//亲爱的念儿,命令传完了,转换就开始了,并且开始从DO口输出数据了,ADC0834在CLK高电瓶的时候,把数据传到DO线上,然后SCLK低电平时单片机保存存在缓冲区的数据哦,并且允许DO线上的数据变化;下面的程序单片机通过SPI总线在从这儿开始要接收数据了哦,

     SET_ADC083X_CLK;    //数据接收前的转换位
          CLR_ADC083X_CLK;     //CLK总在开始为低
          for(ad_val=0, i=0; i<8; i++)
          {
              ad_val <<=1; //
              SET_ADC083X_CLK;     
              ad_val +=(JUDGE_ADC083X_DO ==1? 1:0);//如果数据收到的数据为1,那么返回值ad_val加1然后右移一位,如果为0加0右伊,不断在低位加1,首先接收到的是最高位MSB哦最后得到的是最低位LSB哦

              CLR_ADC083X_CLK;  //低电平用许数据变化
          }    
          //对非ADC0831的型号而言,后续波形没有使用!
          SET_ADC083X_CS;
          return(ad_val);
      }
      //=============================================================================
      //End Of File

⌨️ 快捷键说明

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