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

📄 eeprom.lst

📁 电子称重的程序
💻 LST
字号:
C51 COMPILER V8.02   EEPROM                                                                05/04/2008 21:35:46 PAGE 1   


C51 COMPILER V8.02, COMPILATION OF MODULE EEPROM
OBJECT MODULE PLACED IN EEPROM.OBJ
COMPILER INVOKED BY: e:\Keil\C51\BIN\C51.EXE EEPROM.C BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include        <head.h>
   2          #include        "EEPROM.H"
   3          #include        <function.h>
   4          
   5          BOOL E_err;
   6          
   7          /**************************************************************************
   8          *      函数原型:void I_start(void);
   9          *      功    能:提供I2C总线工作时序中的起始位。
  10          **************************************************************************/
  11          void            I_start(void)
  12          {
  13   1              SCL=HIGH;
  14   1              _nop_();
  15   1              _nop_();
  16   1              SDA=LOW;
  17   1              _nop_();
  18   1              _nop_();
  19   1              SCL=LOW;
  20   1              _nop_();
  21   1              _nop_();
  22   1      }
  23          
  24          
  25          /**************************************************************************
  26          *      函数原型:void I_stop(void);
  27          *      功    能:提供I2C总线工作时序中的停止位。
  28          **************************************************************************/
  29          void            I_stop(void)
  30          {
  31   1              SDA=LOW;
  32   1               _nop_();
  33   1               _nop_();
  34   1              SCL=HIGH;
  35   1              _nop_();
  36   1              _nop_();
  37   1              SDA=HIGH;
  38   1              _nop_();
  39   1              _nop_();
  40   1              SCL=LOW;
  41   1              _nop_();
  42   1              _nop_();
  43   1      }
  44          
  45          /**************************************************************************
  46          *      函数原型:void I_init(void);
  47          *      功    能:I2C总线初始化。在main()函数中应首先调用本函数,然后再用
  48          *               I2C其它函数。
  49          **************************************************************************/
  50          void            I_init(void)
  51          {
  52   1              WP=0;
  53   1              SCL=LOW;
  54   1              _nop_();
  55   1              I_stop();
C51 COMPILER V8.02   EEPROM                                                                05/04/2008 21:35:46 PAGE 2   

  56   1      }
  57          
  58          /**************************************************************************
  59          *      函数原型:bit I_clock(void);
  60          *      功    能:提供I2C总线的时钟信号,并返回在时钟电平为高期间SDA信号线上状
  61          *               态。本函数可用于数据发送,也可用于数据接收。
  62          **************************************************************************/
  63          BOOL    I_clock(void)
  64          {
  65   1              BOOL sample;
  66   1              SCL=HIGH;
  67   1              _nop_();
  68   1              _nop_();
  69   1              _nop_();
  70   1              sample=SDA;
  71   1              SCL=LOW;
  72   1              _nop_();
  73   1              _nop_();
  74   1              _nop_();
  75   1              return(sample);
  76   1      }
  77          
  78          /**************************************************************************
  79          *      函数原型:bit I_send(Uchar I_data);
  80          *      功    能:向I2C总线发送8位数据,并请求一个应答信号ACK。如果收到ACK应答,
  81          *               则返回1(TRUE),否则返回0(FALSE)。
  82          **************************************************************************/
  83          BOOL    I_send(Uchar I_data)
  84          {
  85   1              Uchar i;
  86   1       /*发送8位数据*/
  87   1              for(i=0;i<8;i++)
  88   1              {
  89   2              SDA=(BOOL)(I_data&0x80);
  90   2              I_data=I_data<<1;
  91   2              I_clock();
  92   2              _nop_();
  93   2              _nop_();
  94   2              }
  95   1       /*请求应答信号ACK*/
  96   1              SDA=HIGH;
  97   1              for(i=0;i<3;i++)
  98   1              {
  99   2                      if(!I_clock())return 1;
 100   2                      delayms(1);
 101   2              }
 102   1              E_err=1;
 103   1               return 0;
 104   1              //return(~I_clock());
 105   1      }
 106          
 107          /**************************************************************************
 108          *      函数原型:Uchar I_receive(void);
 109          *      功    能:从I2C总线上接收8位数据信号,并将接收到的8位数据作为一个字节
 110          *               返回,不回送应答信号ACK。主函数在调用本函数这前应保证SDA信
 111          *               号线处于浮置状态。
 112          **************************************************************************/
 113          Uchar I_receive(void)
 114          {
 115   1              register Uchar I_data=0;
 116   1              register Uchar i;
 117   1              for(i=0;i<8;i++)
C51 COMPILER V8.02   EEPROM                                                                05/04/2008 21:35:46 PAGE 3   

 118   1              {
 119   2                      I_data*=2;
 120   2                      _nop_();
 121   2                      _nop_();
 122   2                      if(I_clock())I_data++;
 123   2              }
 124   1              return(I_data);
 125   1      }
 126          /**************************************************************************
 127          *      函数原型:void E_address(Uchar Address);
 128          *      功    能:向24C02写入器件地址和一个指定的字节地址。
 129          **************************************************************************/
 130          void E_address(Uchar Address)
 131          {
 132   1       I_start();
 133   1       I_send(WRITE);
 134   1       I_send(Address);
 135   1      }
 136          /**************************************************************************
 137          *      函数原型:void E_writeex(Uchar Address,Uchar *E_data,Uchar datan);
 138          *      功    能:将 24C02  以Address起始的空间读入e_data指向的空间
 139          **************************************************************************/
 140          void E_writeex(Uchar Address,Uchar *E_data,Uchar datan)
 141          {
 142   1       Uchar i;
 143   1       for(i=0;i<datan;i++)
 144   1       {
 145   2         E_write(Address+i,*(E_data+i));
 146   2         delayms(10);
 147   2       }
 148   1      }
 149          /**************************************************************************
 150          *      函数原型:void E_readex(Uchar Address,Uchar *E_data,Uchar datan);
 151          *      功    能:将E_data所指向的内容写入 24C02  以Address起始的空间
 152          **************************************************************************/
 153          void E_readex(Uchar Address,Uchar *E_data,Uchar datan)
 154          {
 155   1       Uchar i;
 156   1       for(i=0;i<datan;i++)
 157   1       {
 158   2         *(E_data+i)=E_read(Address+i);
 159   2       }
 160   1      }
 161          /**************************************************************************
 162          *      函数原型:void E_write(Uchar Address,Uchar E_data);
 163          *      功    能:将E_data内容写入到24C02的Address单元以及与它相对应的两个备份单元
 164          *               如果总共有六次写入失败,LCD显示E2P ERR的内容,此时专业人员应检查
 165          *               出错原因,系统停止工作。
 166          **************************************************************************/
 167          void E_write(Uchar Address,Uchar E_data)
 168          {
 169   1      Uchar i;
 170   1      
 171   1       for(i=0;i<3;i++)
 172   1       {EA=0;
 173   2        E_address(Address);
 174   2         I_send(E_data);
 175   2          I_stop();
 176   2          EA=1;
 177   2          delayms(10);
 178   2          Address=Address+E2PROM_bias;
 179   2       }
C51 COMPILER V8.02   EEPROM                                                                05/04/2008 21:35:46 PAGE 4   

 180   1      }
 181          
 182          /**************************************************************************
 183          *      函数原型:Uchar E_read(Uchar Address);
 184          *      功    能:从24C02中读出地址为Address单元以及与它相对应的两个备份单元的内容,
 185          *               如果三个都一样,那么返回值就是其中一个值;如果两个一样,另一个不 一样,
 186          *               那么一样的值做为返回值;如果三个都不一样,那么认为中间的值做为返回值。
 187          *               如果三个值有不一样的情况下,必须重新写入。以便三个值都一致。
 188          *               如果读出三个数的失败的次数达到六次, LCD显示E2P   ERR的内容,此时专业人员应检查
 189          *               出错原因,系统停止工作。
 190          **************************************************************************/
 191          Uchar E_read(Uchar Address)
 192          {
 193   1      Uchar i;
 194   1      Uchar accept[3];
 195   1       for(i=0;i<3;i++)
 196   1       {
 197   2       EA=0;
 198   2        E_address(Address);
 199   2         I_start();
 200   2         I_send(READ);
 201   2          accept[i]=I_receive();
 202   2          I_clock();
 203   2          I_stop();
 204   2          EA=1;
 205   2          delayms(1);
 206   2          Address=Address+E2PROM_bias;
 207   2        }
 208   1           if((accept[1]==accept[0])&&(accept[1]==accept[2]))return(accept[1]);
 209   1           else  if((accept[1]!=accept[0])&&(accept[1]!=accept[2]))
 210   1            {E_err=1; return(accept[1]);}
 211   1           else  if(accept[0]==accept[2])accept[1]=accept[0];
 212   1      
 213   1      
 214   1       E_write(Address,accept[1]);
 215   1       return(accept[1]);
 216   1      }
 217          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    399    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----      22
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      1       1
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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