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

📄 adc.lst

📁 LCD显示电子计价秤方案 1. 该方案使用的传感器为20KG,灵敏度约为0.5mv/v,选用新传感器线性较好的一段(100g-15Kg),直接处理,没有做非线性修正,称重可能会有偏差. 2. 软件
💻 LST
字号:
C51 COMPILER V8.05a   ADC                                                                  05/26/2008 11:05:26 PAGE 1   


C51 COMPILER V8.05a, COMPILATION OF MODULE ADC
OBJECT MODULE PLACED IN adc.OBJ
COMPILER INVOKED BY: D:\Program Files\Keil\C51\BIN\C51.EXE adc.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /*
   2          数字滤波采用限幅+递推均值滤波法
   3          */
   4          
   5          #include<def.h>
   6          #define  f                      10              //滤波器的频率,HZ
   7          #define  fadc           2457600     //ADC时钟
   8          #define  fcode          fadc/f/128  //tm7707滤波器的值
   9          
  10          ulong   databuf[6]={0,0,0,0,0,0};
  11          ulong   dataave[6]={0}; 
  12          //---------------------------------------------adc_8bit串行数据输入程序-----------------------------------
             -------------------------------------
  13          //上升沿传输数据
  14          void adc_in8bit(uchar adc_data)
  15          {
  16   1              uchar m;
  17   1              DIN=1;
  18   1              SCLK=1;
  19   1              for(m=0;m<8;m++)
  20   1              {
  21   2                      SCLK=0;
  22   2                      if((adc_data&0x80)!=0)
  23   2                      {
  24   3                              DIN=1;
  25   3                      }
  26   2                      else
  27   2                      {
  28   3                              DIN=0;  
  29   3                      }
  30   2                      SCLK=1;
  31   2                      adc_data=adc_data<<1;
  32   2              }               
  33   1      }
  34          //下降沿传输数据
  35          void adc_in8bit_neg(uchar adc_data)
  36          {
  37   1              uchar m;
  38   1              DIN=1;
  39   1              for(m=0;m<8;m++)
  40   1              {
  41   2                      SCLK=1;
  42   2                      if((adc_data&0x80)!=0)
  43   2                      {
  44   3                              DIN=1;
  45   3                      }
  46   2                      else
  47   2                      {
  48   3                              DIN=0;  
  49   3                      }
  50   2                      SCLK=0;
  51   2                      adc_data=adc_data<<1;
  52   2              }               
  53   1      }
  54          //---------------------------------------------adc_8bit串行数据输出程序-----------------------------------
C51 COMPILER V8.05a   ADC                                                                  05/26/2008 11:05:26 PAGE 2   

             -------------------------------------
  55          //上升沿传输数据
  56          uchar adc_out()
  57          {
  58   1              uchar m,k;
  59   1              DOUT=1;         //端口设置输入口
  60   1              SCLK=1;
  61   1              for(m=0;m<8;m++)
  62   1              {
  63   2                      SCLK=0;
  64   2                      k=k<<1;
  65   2                      if(DOUT==0)
  66   2                      {
  67   3                              k=k&0xfe;
  68   3                      }
  69   2                      else
  70   2                      {
  71   3                              k=(k|0x01&0xff);
  72   3                      }               
  73   2              SCLK=1;         
  74   2              }
  75   1              return(k);
  76   1      }
  77          //下降沿传输数据
  78          uchar adc_out_neg()
  79          {
  80   1              uchar m,k;
  81   1              DOUT=1;         //端口设置输入口
  82   1              for(m=0;m<8;m++)
  83   1              {
  84   2                      SCLK=1;
  85   2                      k=k<<1;
  86   2                      if(DOUT==0)
  87   2                      {
  88   3                              k=k&0xfe;
  89   3                      }
  90   2                      else
  91   2                      {
  92   3                              k=(k|0x01&0xff);
  93   3                      }               
  94   2              SCLK=0;         
  95   2              }
  96   1              return(k);
  97   1      }
  98          //---------------------------------------------ADC转换控制程序--------------------------------------------
             --------------------------------------
  99          uint adc7705_con()
 100          {
 101   1              uchar datal;
 102   1              uint  adcdata=0;
 103   1              do
 104   1              {       
 105   2                      adc_in8bit(0x08);       //写通讯寄存器,选择下一步读通讯寄存器
 106   2                      datal=adc_out();        //读通讯寄存器,等待最高位为0
 107   2              }
 108   1              while((datal&0x80)==0x80);
 109   1              adc_in8bit(0x38);               //写通讯寄存器,选择下一步读数据寄存器
 110   1              //读数据寄存器
 111   1              adcdata=adc_out();
 112   1              adcdata<<=8;
 113   1              adcdata|=adc_out();
 114   1              return (adcdata);       
C51 COMPILER V8.05a   ADC                                                                  05/26/2008 11:05:26 PAGE 3   

 115   1      }
 116          uint adc7715_con()
 117          {
 118   1              uchar datal;
 119   1              uint adcdata=0;
 120   1              do
 121   1              {
 122   2                      adc_in8bit(0x0b);       //写通讯寄存器,选择下一步读通讯寄存器           
 123   2                      datal=adc_out();        //读通讯寄存器
 124   2              }
 125   1              while((datal&0x80)==0x80);
 126   1              adc_in8bit(0x3b);               //写通讯寄存器,选择下一步读数据寄存器
 127   1              //读数据寄存器  
 128   1              adcdata=adc_out();
 129   1              adcdata<<=8;
 130   1              adcdata|=adc_out();
 131   1              return (adcdata);       
 132   1      }
 133          ulong adc7707_con()
 134          {
 135   1              uchar datal;
 136   1              ulong adcdata=0;
 137   1              do
 138   1              {
 139   2                      adc_in8bit_neg(0x0c);           //写通讯寄存器,选择下一步读通讯寄存器
 140   2                      datal=adc_out_neg();            //读通讯寄存器
 141   2              }
 142   1              while((datal&0x80)==0x80);      //等待最高位为0
 143   1              adc_in8bit_neg(0x5c);           //写通讯寄存器,选择下一步读数据寄存器
 144   1              //读数据寄存器  
 145   1              adcdata=adc_out_neg();
 146   1              adcdata<<=8;
 147   1              adcdata|=adc_out_neg();
 148   1              adcdata<<=8;
 149   1              adcdata|=adc_out_neg();
 150   1              return (adcdata);       
 151   1      }
 152          //-----------------------------------------------adc初始化程序--------------------------------------------
             -----------------
 153          void adcinit()
 154          {
 155   1              uchar p;
 156   1              //发送连续40个时钟
 157   1              DIN=1;
 158   1              for(p=0;p<40;p++)
 159   1              {
 160   2                      SCLK=0;
 161   2                      _nop_();
 162   2                      _nop_();
 163   2                      SCLK=1;
 164   2                      _nop_();
 165   2                      _nop_();
 166   2              }
 167   1              if(adcbit1==0)
 168   1              {
 169   2                      if(adcbit0==0)
 170   2                      {
 171   3                              //tm7705初始化
 172   3                              adc_in8bit(0x20);               //写通讯寄存器,选择下一步写时钟寄存器,CH1通道
 173   3                              adc_in8bit(0x84);               //写时钟寄存器,使用2.4576M晶体,输出更新速率20HZ
 174   3                              adc_in8bit(0x10);               //写通讯寄存器,选择下一步写设置寄存器
 175   3                              adc_in8bit(0x7c);               //写设置寄存器,G=128,单极性,无缓冲
C51 COMPILER V8.05a   ADC                                                                  05/26/2008 11:05:26 PAGE 4   

 176   3                      }
 177   2                      else
 178   2                      {
 179   3                              //tm7715初始化
 180   3                              adc_in8bit(0x13);               //写通讯寄存器,选择下一步写设置寄存器,G=128
 181   3                              adc_in8bit(0x60);               //写设置寄存器
 182   3                      }
 183   2              }
 184   1              else
 185   1              {
 186   2                      //tm7707初始化
 187   2                      adc_in8bit_neg(0x24);           //写通讯寄存器,选择下一步写滤波器高8位
 188   2                      adc_in8bit_neg(0xe0|(fcode/256));       //写滤波器高8位
 189   2                      adc_in8bit_neg(0x34);           //写通讯寄存器,选择下一步写滤波器低8位
 190   2                      adc_in8bit_neg(fcode%256);      //写设置寄存器
 191   2                  adc_in8bit_neg(0x14);               //写通讯寄存器,选择下一步写设置寄存器
 192   2                      adc_in8bit_neg(0x3c);           //写设置寄存器,设置增益为16,自校准,并启动AD转换                 
 193   2              }
 194   1      }
 195          //--------------------------------------------------ADC数据处理-------------------------------------------
             --------------------
 196          ulong adccon()
 197          {
 198   1              uchar   i,j;
 199   1              ulong   idata   temp,adcresult;
 200   1              ulong   idata   adcdata_new,adcdata_now,adcdata_old;
 201   1      
 202   1              //采集数据
 203   1              if(adcbit1==0)
 204   1              {
 205   2                      if(adcbit0==0)
 206   2                      {
 207   3                              adcdata_new=adc7705_con();
 208   3                      }
 209   2                      else
 210   2                      {
 211   3                              adcdata_new=adc7715_con();
 212   3                      }
 213   2              }
 214   1              else
 215   1              {
 216   2                      adcdata_new=adc7707_con();
 217   2              }
 218   1      
 219   1              //数据处理
 220   1              if(adcdata_new>=adcresult)
 221   1              {
 222   2                      temp=adcdata_new-adcresult;
 223   2              }       
 224   1              else
 225   1              {
 226   2                      temp=adcresult-adcdata_new;
 227   2              }                       //得到新的数据与滤波器值的差值
 228   1              if(temp>data_th)
 229   1              {
 230   2                      //比较上一次ADC的数据与本次滤波器的差值是否大于阀值
 231   2                      if(adcdata_old>=adcresult)
 232   2                      {
 233   3                              temp=adcdata_old-adcresult;
 234   3                      }       
 235   2                      else
 236   2                      {
C51 COMPILER V8.05a   ADC                                                                  05/26/2008 11:05:26 PAGE 5   

 237   3                              temp=adcresult-adcdata_old;
 238   3                      }                                                       //得到上次ADC的数据与滤波器值的差值                     
 239   2                      if(temp>data_th)
 240   2                      {
 241   3                              //称重发生变化 
 242   3                              dataave[0]=dataave[1]=dataave[2]=dataave[3]=dataave[4]=dataave[5]=adcdata_new;  //用新的ADC的数据代替滤

⌨️ 快捷键说明

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