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

📄 control.lst

📁 一个充电控制器的完整单片机程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.20   CONTROL                                                               06/20/2005 16:55:56 PAGE 1   


C51 COMPILER V7.20, COMPILATION OF MODULE CONTROL
OBJECT MODULE PLACED IN control.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE control.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          
   2          /*
   3          */
   4          #include <absacc.h> 
   5          #include <stdlib.h>
   6          #include <AT89X52.H>
   7          #include <INTRINS.h>
   8          
   9          #include "charger.h"
  10          /*
  11          //init_system_work_point 
  12          */
  13          
  14          #define BENCHMARK 4.5
  15          #define AMPLIFICATORY 10//predefine 0.1 proccess, amplificatory 10
  16          #define ADMAX 4096
  17          
  18          #define system_volatage sys[7]
  19          #define discharge_model sys[8]
  20          #define charge_model    sys[9]
  21          #define float_revise    sys[10]
  22          #define test_temp               sys[11]
  23          #define desinged_rate   sys[12]
  24          //alarm overload
  25          #define overload         sys[6]
  26          
  27          //static array daydata   change to loop link
  28          //sizeof(daydata)=0x2B
  29          extern daydata xdata looplink[BUFFSIZE];
  30          
  31          void init_history_buffer(void)
  32          {
  33   1        unsigned char data i;
  34   1              //Init DoubleLoopLink
  35   1              for(i=0;i<BUFFSIZE-1;i++)
  36   1              {
  37   2                      looplink[i].next=&looplink[i+1];
  38   2                      looplink[i+1].up=&looplink[i];
  39   2                RESET_DOG;
  40   2        }
  41   1              looplink[BUFFSIZE-1].next=&looplink[0];
  42   1              looplink[0].up=&looplink[BUFFSIZE-1];
  43   1      
  44   1        today.next=&looplink[0];
  45   1        today.up=&looplink[BUFFSIZE-1]; //is head->up;
  46   1              today.up->date[0]=0;//break looplink
  47   1              today.up->date[1]=0;//break looplink
  48   1              today.up->date[2]=0;//break looplink
  49   1        RESET_DOG;
  50   1      }
  51          
  52          void init_rate_workpoint(unsigned char n)
  53          {
  54   1              unsigned char data i;
  55   1      //2005/4
C51 COMPILER V7.20   CONTROL                                                               06/20/2005 16:55:56 PAGE 2   

  56   1              n=DEFSYSV;
  57   1      //2005/4
  58   1        if(n<4)//system volatage changed
  59   1        for(i=0;i<12;i++)//Init default seting
  60   1        {
  61   2                      if(i<7)
  62   2                      {//work point
  63   3              sys[i]=dtab[n][i];
  64   3                      }
  65   2                      else
  66   2                      {
  67   3                              if(i==11)//sys[11] is test temp.
  68   3                                      sys[12]=stab[4][n];//desinged_rate
  69   3                              else sys[i]=stab[i-7][n];
  70   3                      }
  71   2              }
  72   1      
  73   1              i=45;//BENCHMARK*AMPLIFICATORY=45;
  74   1              crate.temperature = i*100;
  75   1              crate.volatage = i*desinged_rate;//battery volatage
  76   1              crate.discharge = i*discharge_model/4;
  77   1              crate.charge = i*charge_model/4;
  78   1              //check overload <= discharger model
  79   1              if(overload>discharge_model)overload=discharge_model;
  80   1        RESET_DOG;
  81   1      }
  82          
  83          //intput data from tlc1543,changed and saved
  84          const adintimes =0xDB24;
  85          const adinadd   =0xDB28;
  86          const tmpAh                     =0xDB44;
  87          //today at 
  88          
  89          #define ADCOUNT         10
  90          void getadin(void)
  91          {
  92   1        unsigned char data i;
  93   1              unsigned long data tmp;
  94   1              unsigned long xdata *s;//adinadd
  95   1              unsigned int xdata *t;
  96   1              
  97   1              for(i=0;i<10;i++)//9 way, the 8 way is no use
  98   1              if(i!=7)
  99   1              {
 100   2                      unsigned char data c; 
 101   2      
 102   2                      tmp=0;
 103   2      
 104   2                      for(c=0;c<ADCOUNT;c++)tmp+=tlc1543(i);
 105   2      
 106   2                RESET_DOG;
 107   2              
 108   2                      tmp /= ADCOUNT;
 109   2      
 110   2                      if(i<6)
 111   2                      {
 112   3                              tmp *= crate.charge;
 113   3                              tmp /= ADMAX;   adin[i]=(unsigned int)tmp;      
 114   3                      }
 115   2                      if(i==6)
 116   2                      {
 117   3                              tmp *= crate.discharge;
C51 COMPILER V7.20   CONTROL                                                               06/20/2005 16:55:56 PAGE 3   

 118   3                              tmp /= ADMAX;   adin[6]=(unsigned int)tmp;
 119   3                      }
 120   2                      if(i==8)
 121   2                      {
 122   3                              tmp *= crate.temperature;
 123   3                              tmp /= ADMAX;   adin[7]=(unsigned int)tmp;
 124   3      
 125   3                              if(adin[7]<2730)adin[7]=2730;
 126   3                              if(adin[7]>3080)adin[7]=3080;
 127   3                              adtemp=adin[7];//save no just temperature
 128   3      
 129   3                              /*2005/4
 130   3                              if(test_temp<3230&&test_temp>2230)adin[7]+=just;//+/-50d
 131   3                              2005/4*/
 132   3                      }
 133   2                      if(i==9)
 134   2                      {
 135   3                              tmp *= crate.volatage;
 136   3                              tmp /= ADMAX;   adin[8]=(unsigned int)tmp;      
 137   3                      }
 138   2              }
 139   1              
 140   1              for(i=0;i<9;i++)
 141   1              {
 142   2                      if(i>6)//save min value of battery vola.&temperature
 143   2                      if(adin[i]<today.work[2*i+1]||today.work[2*i+1]==0)
 144   2                              today.work[i*2+1]=adin[i];
 145   2                              //only save max value
 146   2                      if(adin[i]>today.work[2*i])today.work[i*2]=adin[i];
 147   2              }
 148   1              //counter times and add to add current
 149   1                      s=adinadd;
 150   1                      for(i=0;i<7;i++)*s+++=(unsigned long)adin[i];
 151   1                      t=adintimes;
 152   1                      (*t)++;
 153   1                RESET_DOG;
 154   1      }
 155          //-----------------------------
 156          //check error
 157          void syserror(void)
 158          {
 159   1      //系统设置检错
 160   1                      unsigned char data i;
 161   1                      for(i=0;i<7;i++)
 162   1                              if(sys[i]>400||sys[i]<30)
 163   1                              {init_rate_workpoint(DEFSYSV);return;}
 164   1                      if(!(sys[7]==48||sys[7]==110||sys[7]==220||sys[7]==300))
 165   1                      {
 166   2                              init_rate_workpoint(DEFSYSV);
 167   2                              //控制器失效,需要重新设置或者重新上电
 168   2                      }
 169   1      }
 170          
 171          /*
 172          //count today working result
 173          */
 174          void account(void)
 175          {
 176   1      static bit bdata cc;
 177   1      if(tlong%60>50)//50s
 178   1      {
 179   2              if(!cc)
C51 COMPILER V7.20   CONTROL                                                               06/20/2005 16:55:56 PAGE 4   

 180   2              {
 181   3                      char data i;
 182   3                      unsigned long xdata *s;
 183   3                      unsigned long xdata *Ah;//adinadd
 184   3                      unsigned int xdata *t;
 185   3                      t=adintimes;
 186   3                      s=adinadd;
 187   3                      Ah=tmpAh;
 188   3                      for(i=0;i<7;i++)
 189   3                      { //save current integral value (Ah)
 190   4                              unsigned long data taa;
 191   4                              if(*t!=0)*Ah+=*s/(unsigned long)(*t);//保证精度不损失
 192   4                                      else return;
 193   4                              taa=(unsigned long)(*Ah/60);
 194   4                              today.work[i*2+1]=(unsigned int)taa;
 195   4                              *s++=0;
 196   4                              Ah++;
 197   4                        RESET_DOG;
 198   4                      }
 199   3                      cc=1;   *t=0;
 200   3              }
 201   2      }
 202   1      else cc=0;
 203   1      }
 204          
 205          /*
 206          //output control,switch operation
 207          */
 208          

⌨️ 快捷键说明

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