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

📄 at93c46_16.lst

📁 C51写的EEPROM at93c46的源程序
💻 LST
字号:
C51 COMPILER V7.50   AT93C46_16                                                            01/10/2007 17:01:33 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE AT93C46_16
OBJECT MODULE PLACED IN at93c46_16.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE at93c46_16.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          //注意:该程序考虑的是16位数据的情况。
   2          //通过DATASHEET发现,AT93C46的读操作每次只能读、写一个字节或者字。
   3          #include"reg51.h"
   4          #include"intrins.h"
   5          #define uchar unsigned char
   6          #define uint  unsigned int
   7          sbit cs_93c46=P3^6;             //高电平有效
   8          sbit ck_93c46=P3^7;     //上升沿数据输入、输出
   9          sbit di_93c46=P3^4;
  10          sbit do_93c46=P3^5;
  11          uchar code READ_93C46=0x06;
  12          uchar code EWEN_93C46=0x04;
  13          uchar code ERAL_93C46=0x04;
  14          uchar code WRITE_93C46=0x05;
  15          void wr_addr_93c46(uchar addr);
  16          //uchar rd_byte_93c46(uchar addr);
  17          void wr_code_93c46(uchar op_code);
  18          uint rd_93c46(void);
  19          void ewen(void);
  20          void erase_all(void);
  21          void wr_93c46(uint dat);
  22          void delay_1ms(void);
  23          void delay_nms(uint n);
  24          
  25          uint buf_word[2]={0,0};
  26          
  27          
  28          void main(void)
  29          {
  30   1              uchar i;
  31   1              cs_93c46=1;  //向AT93C46输入起始位和操作码110
  32   1              di_93c46=0;
  33   1              do_93c46=0;
  34   1              _nop_();
  35   1              
  36   1              
  37   1              //ewen();
  38   1              /********************************
  39   1              cs_93c46=1;
  40   1              wr_code_93c46(WRITE_93C46);
  41   1              wr_addr_93c46(0x00);
  42   1              wr_93c46(0xaaaa);
  43   1              cs_93c46=0;
  44   1              delay_nms(10);  //注意:对AT93C46的写操作,写完所有的数据之后,片选清零,且持续至少10ms
  45   1              ********************************************************************************************/
  46   1              
  47   1              //erase_all();
  48   1              
  49   1              
  50   1              
  51   1              //-----------------------------
  52   1              i=0;
  53   1              while(i<2)
  54   1              {
  55   2                      cs_93c46=1;
C51 COMPILER V7.50   AT93C46_16                                                            01/10/2007 17:01:33 PAGE 2   

  56   2                      wr_code_93c46(READ_93C46);
  57   2                      wr_addr_93c46(i);
  58   2                      buf_word[i]=rd_93c46();
  59   2                      cs_93c46=0;//取消片选
  60   2                      i++;
  61   2              }
  62   1              
  63   1              //ewen();
  64   1              //erase_all();
  65   1              //cs_93c46=0;
  66   1              _nop_();
  67   1      }
  68          /**********************
  69          //以下是子函数体
  70          void delay_4us(void)
  71          {
  72                  _nop_();
  73                  _nop_();
  74                  _nop_();
  75                  _nop_();
  76          }
  77          ************************/
  78          
  79          void wr_code_93c46(uchar op_code)
  80          {
  81   1              uchar i=3;
  82   1              op_code<<=5;
  83   1              while(i>0)
  84   1              {
  85   2                      ck_93c46=0;
  86   2                      if((op_code&0x80)==0)
  87   2                              di_93c46=0;
  88   2                      else
  89   2                              di_93c46=1;
  90   2                      ck_93c46=1;
  91   2                      op_code<<=1;
  92   2                      i--;
  93   2              }       
  94   1      }
  95          
  96          //功能:向AT93C46写入任意存储字节的6位地址
  97          void wr_addr_93c46(uchar addr)
  98          {
  99   1              uchar i=6;
 100   1              addr<<=2;
 101   1              while(i>0)
 102   1              {
 103   2                      ck_93c46=0;
 104   2                      if((addr&0x80)==0)
 105   2                              di_93c46=0;
 106   2                      else
 107   2                              di_93c46=1;
 108   2                      ck_93c46=1;
 109   2                      addr<<=1;
 110   2                      i--;
 111   2              }       
 112   1      }
 113          //功能:从AT93C46读出一个字16位的数据,仅仅是读操作。
 114          uint rd_93c46(void)
 115          {
 116   1              uint temp=0;
 117   1              uchar i=16;
C51 COMPILER V7.50   AT93C46_16                                                            01/10/2007 17:01:33 PAGE 3   

 118   1              while(i>0)
 119   1              {
 120   2                      ck_93c46=0;
 121   2                      temp<<=1;
 122   2                      ck_93c46=1;
 123   2                      _nop_();
 124   2                      if(do_93c46==1)
 125   2                              temp|=0x0001;
 126   2                      i--;
 127   2              }
 128   1              return(temp);
 129   1      }
 130          
 131          //功能:从AT93C46读出一个字节的数据,包含了之前的写入起始位、操作码和地址。
 132          /***********************************
 133          uchar rd_byte_93c46(uchar addr)
 134          {
 135                  //下面三段程序完成写入起始位和操作码
 136                  uchar i;
 137                  uchar temp;
 138                  cs_93c46=1;  //向AT93C46输入起始位和操作码110
 139                  ck_93c46=0;
 140                  di_93c46=0;
 141                  do_93c46=0;
 142                  _nop_();
 143                  di_93c46=1;
 144                  ck_93c46=1;
 145                  _nop_();
 146                  ck_93c46=0;
 147                  di_93c46=1;
 148                  ck_93c46=1;
 149                  _nop_();
 150                  ck_93c46=0;
 151                  di_93c46=0;
 152                  ck_93c46=1;
 153                  _nop_();
 154                  addr<<=1;
 155                  i=7;
 156                  while(i>0)
 157                  {
 158                          ck_93c46=0;
 159                          if((addr&0x80)==0)
 160                                  di_93c46=0;
 161                          else
 162                                  di_93c46=1;
 163                          ck_93c46=1;
 164                          _nop_();
 165                          addr<<=1;
 166                          i--;
 167                  }       
 168                  i=8;
 169                  temp=0;
 170                  while(i>0)
 171                  {
 172                          ck_93c46=0;
 173                          temp<<=1;
 174                          ck_93c46=1;
 175                          _nop_();
 176                          if(do_93c46==1)
 177                                  temp|=0x01;
 178                          i--;
 179                  }
C51 COMPILER V7.50   AT93C46_16                                                            01/10/2007 17:01:33 PAGE 4   

 180                  ck_93c46=0;
 181                  _nop_();
 182                  cs_93c46=0;
 183                  return(temp);
 184          }
 185          ***********************/
 186          /*****************************************
 187          原型:void wr_93c46(uchar dat)
 188          行参:uchar dat
 189          返回值:无
 190          功能:向AT93c46写入一个字16位的数据,纯粹的写操作。
 191          ********************************************/
 192          
 193          void wr_93c46(uint dat)
 194          {
 195   1              uchar i=16;
 196   1              while(i>0)
 197   1              {
 198   2                      ck_93c46=0;
 199   2                      if((dat&0x8000)==0)
 200   2                              di_93c46=0;
 201   2                      else
 202   2                              di_93c46=1;
 203   2                      ck_93c46=1;
 204   2                      dat<<=1;
 205   2                      i--;
 206   2              }       
 207   1      }
 208          
 209          /*****************************************
 210          原型:void erase_all(void)
 211          行参:无
 212          返回值:无
 213          功能:擦除AT93C46的所有内容
 214          ********************************************/
 215          
 216          void erase_all(void)
 217          {
 218   1              cs_93c46=1;
 219   1              di_93c46=0;
 220   1              do_93c46=0;
 221   1              _nop_();
 222   1              wr_code_93c46(ERAL_93C46);
 223   1              wr_addr_93c46(0x20);
 224   1              cs_93c46=0;
 225   1      }
 226          
 227          /*****************************************
 228          原型:void ewen(void)
 229          行参:无
 230          返回值:无
 231          功能:向AT93C46写入擦写命令,使之可以写入新的内容       
 232          注意:该函数包含了完整的开始和结束条件                  
 233          ********************************************/
 234          void ewen(void)
 235          {
 236   1              cs_93c46=1;
 237   1              di_93c46=0;
 238   1              do_93c46=0;
 239   1              _nop_();
 240   1              wr_code_93c46(EWEN_93C46);
 241   1              wr_addr_93c46(0x30);
C51 COMPILER V7.50   AT93C46_16                                                            01/10/2007 17:01:33 PAGE 5   

 242   1              cs_93c46=0;
 243   1      }
 244          /************************************************************
 245          原型:void delay_1ms(void)
 246          行参:无
 247          返回值:无
 248          功能:延时大约1ms
 249          ************************************************************/
 250          
 251          void delay_1ms(void)
 252          {
 253   1                uchar i;
 254   1          for(i=125;i>0;i--);
 255   1      }
 256          /******************************
 257          原型:void delay_nms(uint n)
 258          行参:uint n
 259          返回值:无
 260          功能:延时n ms
 261          *****************************/
 262          void delay_nms(uint n)
 263          {
 264   1              uchar i;
 265   1              for(;n>0;n--)
 266   1              {
 267   2                      for(i=125;i>0;i--)
 268   2                      {
 269   3                              ;
 270   3                      }
 271   2              }
 272   1      }


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


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

⌨️ 快捷键说明

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