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

📄 admain.lst

📁 绝对好东西!aduc812AD转换代码,望对大家学习有所帮助!
💻 LST
📖 第 1 页 / 共 5 页
字号:
C51 COMPILER V7.10   ADMAIN                                                                06/05/2006 09:59:57 PAGE 1   


C51 COMPILER V7.10, COMPILATION OF MODULE ADMAIN
OBJECT MODULE PLACED IN admain.OBJ
COMPILER INVOKED BY: D:\Keil\C51\BIN\C51.EXE admain.c BROWSE DEBUG OBJECTEXTEND CODE SYMBOLS PREPRINT

line level    source

   1           /***********************************************************************
   2          
   3          ***********************************************************************/
   4          #include <ADUC812.H>
   5          #include <math.h>
   6          
   7          sbit Run_Id=P2^5;  //工作指示灯
   8          sbit Ctrl1 =P2^6;
   9          sbit Ctrl0 =P2^7;
  10          sbit Adv0  =P1^2;
  11          sbit Adv1  =P1^3;
  12          
  13          #define    RUN         0
  14          #define    STOP        1
  15          #define    V_ref       5       //5伏参考电压
  16          #define    V_12        4095        //12位A/D转换系数 1024=8位
  17          #define    ADIN_V0         0x02    //ad输入通道号2
  18          #define    ADIN_V1     0x03        //ad输入通道号3
  19          
  20          unsigned int      Ad_o[2];
  21          unsigned int      Da_i[2];
  22          
  23          struct segment{
  24           unsigned char V_start;  //电压启示值*10  相当于0.1V为单位
  25           unsigned char V_end;    //电压结束值*10
  26           unsigned char mul_col;  //成绩系数*10
  27           unsigned char add_col;  //加法系数*10
  28          };       //00,12,02,30  含义0v到1.2v 范围内y=0.2x+3 单位V
  29          
  30          struct segment Seg;
  31          
  32          unsigned char DATA_U[64];
  33          unsigned char Rptr,Wptr;
  34          unsigned char DATA_W[16];
  35          unsigned char Uptr,Ulen; 
  36          unsigned char flag,flag1,flag_s;
  37          unsigned char time_p,time_r;
  38          idata unsigned int  temp_s[20];
  39          //---ad-转换返回int型整数----------------------------------------------
  40          //ADC function and choose ADC0---ADC7 by Channel
  41          unsigned int GetADC(unsigned char Channel)       //ADIN_V0,V1
  42            { 
  43   1         unsigned char *p;
  44   1         unsigned char  variable;
  45   1         unsigned int  ADC_value;             //用指针将2个char类型数合并成一个int型数
  46   1         
  47   1         p=(unsigned char *)&ADC_value;
  48   1         ADCCON2=Channel;
  49   1         SCONV=1;
  50   1         while (SCONV)
  51   1               {       }
  52   1         SCONV=1;
  53   1         while (SCONV)
  54   1               {       }
  55   1         variable=0x0F&ADCDATAH;              //屏蔽ADC输入的通道标识符号
C51 COMPILER V7.10   ADMAIN                                                                06/05/2006 09:59:57 PAGE 2   

  56   1         *p=variable;
  57   1          p++;
  58   1         *p=ADCDATAL;
  59   1              //Write_Serial(ADC_value);
  60   1          return(ADC_value);
  61   1        }
  62          //----Da转换----0-1--------------------
  63          void SetDac(unsigned char num,unsigned int Da_data)
  64          {
  65   1         if(num==0)
  66   1         { 
  67   2         DACCON=0x1F;
  68   2         DAC0H=(unsigned char)((Da_data>>8) & 0x000f);
  69   2         DAC0L=(unsigned char)(Da_data & 0x00ff);
  70   2         }
  71   1         else if(num==1)
  72   1         {
  73   2          DACCON=0x1F;
  74   2          DAC1H=(unsigned char)((Da_data>>8) & 0x000f);
  75   2          DAC1L=(unsigned char)(Da_data & 0x00ff);
  76   2         }
  77   1      }
  78           //--------------------------------
  79          void Delay(unsigned char  D_time)  
  80             {
  81   1         unsigned char i,j,k;
  82   1          for(i=0;i<D_time;i++)
  83   1                 {  
  84   2                 for(j=0;j<0xff;j++);
  85   2                      {
  86   3                         k=j;
  87   3                         k=i;
  88   3                         i=i;
  89   3                      }
  90   2           }
  91   1         }
  92          //-----------------eeprom中的数据为10倍数--------------------
  93          unsigned char  Select_V(unsigned int Y)           //查表找运算参数
  94          {
  95   1       unsigned long M;
  96   1       unsigned char i,Vsel;
  97   1       M=(unsigned long)Y*10*V_ref*2; //2-运放的倍数
  98   1       M=M / V_12;
  99   1       Vsel=(unsigned char)(M & 0x000000ff);
 100   1       if(Vsel>100) Vsel=100;
 101   1       for(i=0;i<20;i++)
 102   1       {
 103   2        EADRL=i;
 104   2        ECON=0x01;
 105   2        if((Vsel>=EDATA1)&&(Vsel<EDATA2))   
 106   2         {
 107   3         Seg.V_start= EDATA1;
 108   3         Seg.V_end  = EDATA2;
 109   3         Seg.mul_col= EDATA3;
 110   3         Seg.add_col= EDATA4;
 111   3         return 1;
 112   3         }
 113   2       }
 114   1       return 0;
 115   1      }
 116          //------------------------------------------------------
 117          unsigned char Write_f(unsigned char type,unsigned char Addr)
C51 COMPILER V7.10   ADMAIN                                                                06/05/2006 09:59:57 PAGE 3   

 118          {
 119   1        switch(type)
 120   1        {
 121   2         case 0:         //全部擦除
 122   2                       ECON=0x06;      
 123   2               Delay(20);              //20ms
 124   2               ECON=0x03; 
 125   2                 break;
 126   2         case 1:        //通过结构进行4字节写操作
 127   2               EADRL=Addr;
 128   2               ECON=0x01;  
 129   2                       EDATA1=Seg.V_start;
 130   2               EDATA2=Seg.V_end  ;
 131   2               EDATA3=Seg.mul_col;
 132   2               EDATA4=Seg.add_col;
 133   2                   ECON=0x05;  
 134   2               ECON=0x02;
 135   2                   ECON=0x03; //读
 136   2                 break;
 137   2         case 2:        //只进行写操作
 138   2                  EADRL=Addr;
 139   2                  ECON=0x02; //写
 140   2                  ECON=0x03; //读
 141   2             break;
 142   2        }
 143   1       
 144   1       return 1;
 145   1      }
 146          
 147          //------Ad-Da转化函数-------y=ax+b----------------------
 148           void Calcu(unsigned char num)
 149           {      
 150   1         unsigned long G;
 151   1         unsigned int Y;
 152   1         if(num==0) 
 153   1           {Y=GetADC(ADIN_V0);}
 154   1         else if(num==1) 
 155   1           {Y=GetADC(ADIN_V1); }   //读取ad 转换值
 156   1         
 157   1         Ad_o[num]=Y;
 158   1         if(Select_V(Y)==1);            //查表找运算参数
 159   1         {
 160   2          G=Seg.add_col *V_12;
 161   2              G=G/V_ref/2;              //电压〉点数 2--运放调整
 162   2              Y=(unsigned int)((Seg.mul_col*Y+G)/10);
 163   2              if(Y>=0x0FFF)
 164   2            {
 165   3                   Y=0x0FFF;
 166   3                }
 167   2          if(Y<=0x0000)
 168   2            {
 169   3                  Y=0x0000;
 170   3                }
 171   2         }
 172   1         Da_i[num]=Y;
 173   1         SetDac(num,Y);
 174   1       }
 175          
 176          void SystemInit()               //系统初始化函数
 177            {
 178   1       
 179   1         TL2=0xDC;
C51 COMPILER V7.10   ADMAIN                                                                06/05/2006 09:59:57 PAGE 4   

 180   1         TH2=0xFF;
 181   1         RCAP2L=0xDC;
 182   1         RCAP2H=0xFF;
 183   1         T2CON=0x30;       //set rate and start  9600
 184   1         TR2=1;
 185   1         SCON=0x50;        //set serial port mode
 186   1         ES=1;                         //允许串口中断 
 187   1        
 188   1         TMOD=0x01;            //定时器0工作在方式1 10ms
 189   1         TL0=0xFF;
 190   1         TH0=0xDB;         //设定定时器初值
 191   1         TR0=1;
 192   1         ET0=1;            //允许定时器0中断
 193   1      
 194   1      // EX1=1;
 195   1      // EX0=1;                        //允许外部中断  
 196   1      // IT0=1;
 197   1      // IT1=1;                       //设置外部中断为下降沿触发方式
 198   1      // PX1=1;
 199   1      // PX0=1;            //设定外部中断优先位
 200   1         ADCCON1=0x7c;
 201   1         EA=1;                         
 202   1         }
 203          //--------------------------------------------
 204           void Write_Serial(unsigned int T_Data)    //串口发送函数 在发送的过程中没有禁止中断
 205            {
 206   1        unsigned char *p;
 207   1        p=(unsigned char *)&T_Data;
 208   1        DATA_W[0]=*p;
 209   1        DATA_W[1]=*(p+1);
 210   1        Uptr=0;
 211   1        Ulen=2;
 212   1        TI=1;
 213   1        flag=1;
 214   1        }
 215          
 216           //---------------------------------------------
 217           void W_Uart(unsigned char *p, unsigned char len)          //串口发送函数 在发送的过程中没有禁止中断
 218            {
 219   1         unsigned char i;
 220   1         for(i=0;i<len;)
 221   1         {
 222   2          DATA_W[i]=*p;
 223   2          i++;
 224   2              p++;
 225   2         }
 226   1         Uptr=0;
 227   1         Ulen=len;
 228   1         TI=1;
 229   1         flag=1;
 230   1        }
 231          
 232           //###########################################
 233          void main(void)
 234          {
 235   1       unsigned char  i,k;
 236   1       unsigned char  len_r,count; 
 237   1       unsigned char  Addr_P;
 238   1       unsigned char  temp_t;
 239   1       unsigned char  j;
 240   1       SystemInit();
 241   1       // P1^2=1; P1^3=1;
C51 COMPILER V7.10   ADMAIN                                                                06/05/2006 09:59:57 PAGE 5   

 242   1       Rptr=Wptr=Uptr=0x00;
 243   1       flag=flag1=0x00;
 244   1       flag_s=0x00;
 245   1       temp_t=0;
 246   1       W_Uart("Aduc812 start",13);
 247   1        //ptr =(unsigned char*)&Seg_r;
 248   1       for(i=0;i<20;i++) { temp_s[i]=0x00;}
 249   1       //--------初始化flash-----------
 250   1        EADRL=0;
 251   1        ECON=0x01;
 252   1        if(EDATA1==0xff)
 253   1        {
 254   2         Write_f(0x00,0x00);  //擦除flash
 255   2         EADRL=0x9f;
 256   2         for(i=0;i<16;i++)
 257   2           {
 258   3            EADRL=i;           
 259   3                EDATA1=i*10;
 260   3            EDATA2=(i+1)*10;
 261   3            EDATA3=10;
 262   3            EDATA4=0;
 263   3                ECON=0x02;
 264   3            EADRL=0x9f;
 265   3               }
 266   2         }
 267   1         EADRL=0x40;
 268   1         ECON=0x01;
 269   1         j=EDATA1;//j=EDATA1&0x01;
 270   1        //------------------------------
 271   1       while(1)
 272   1        {     
 273   2         if(time_r==0){Run_Id=~Run_Id;time_r=10;}
 274   2         if(Ctrl0)
 275   2         {
 276   3          if(GetADC(ADIN_V0)>0x0030)
 277   3              {
 278   4              i=j&0x1f;
 279   4              if(i>20) i=20;
 280   4              //SetDac(0,Da_i[i]);
 281   4          SetDac(0,temp_s[i]);

⌨️ 快捷键说明

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