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

📄 24c04.lst

📁 提供给51单片机24C02存储驱动
💻 LST
字号:
C51 COMPILER V7.50   24C04                                                                 09/12/2008 21:25:27 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE 24C04
OBJECT MODULE PLACED IN 24c04.OBJ
COMPILER INVOKED BY: D:\Program Files\keil c51\C51\BIN\C51.EXE 24c04.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /*****************************************
   2          
   3          说明:
   4          用短路子短接 P0.1-P0.2 、P1.3-P1.5、PP5 的接线柱
   5          下载完程序通电后,若 P00 的 LED 亮,则读写过程出现错误
   6          若 P01 的 LED 亮,则读写过程正确
   7          
   8          *****************************************/
   9          #include <reg51.h>
  10          #define uchar unsigned char
  11          #define uint unsigned int
  12          #define WRITE 0xA0                       /* 定义24C04的器件地址SLA和方向位W */
  13          #define READ 0xA1                        /* 定义24C04的器件地址SLA和方向位R */
  14          #define FALSE 0
  15          #define TRUE ~FALSE
  16          //////////////////////////////////////////////////////////////////////
  17          #define HIGH 1
  18          #define LOW 0
  19          #define FALSE 0
  20          #define TRUE ~FALSE
  21          sbit SDA = P1^5;
  22          sbit SCL = P1^4;
  23          sbit WP = P1^3;
  24          /*#define SDA  P2_7
  25          #define SCL  P2_6*/
  26          /****************************************************************************
  27          *    函数原型: void delay(void);
  28          *    功    能: 本函数实际上只有一条返回指令, 在具体应用中可视具体要求增加延时 
  29          *              指令。
  30          ****************************************************************************/
  31          void delay( void ) 
  32          {
  33   1      }
  34          /****************************************************************************
  35          *    函数原型: void I_start(void);
  36          *    功    能: 提供I2C总线工作时序中的起始位。                             
  37          ****************************************************************************/
  38          void I_start( void ) 
  39          {
  40   1              SCL = HIGH ;
  41   1              delay() ;
  42   1              SDA = LOW ;
  43   1              delay() ;
  44   1              SCL = LOW ;
  45   1              delay() ;
  46   1       }
  47          /****************************************************************************
  48          *    函数原型: void I_stop(void);
  49          *    功    能: 提供I2C总线工作时序中的停止位。
  50          ****************************************************************************/
  51          void I_stop( void ) 
  52          {
  53   1              SDA = LOW ;
  54   1              delay() ;
  55   1              SCL = HIGH ;
C51 COMPILER V7.50   24C04                                                                 09/12/2008 21:25:27 PAGE 2   

  56   1              delay() ;
  57   1              SDA = HIGH ;
  58   1              delay() ;
  59   1              SCL = LOW ;
  60   1              delay() ;
  61   1       }
  62          /****************************************************************************
  63          *    函数原型: void I_init(void);
  64          *    功    能: I2C总线初始化。在main()函数中应首先调用本函数, 然后再调用
  65          *              其它函数。
  66          ****************************************************************************/
  67          void I_init( void ) 
  68          {
  69   1              SCL = LOW ;
  70   1              I_stop() ;
  71   1      }
  72          /****************************************************************************
  73          *    函数原型: bit I_clock(void);
  74          *    功    能: 提供I2C总线的时钟信号, 并返回在时钟电平为高期间SDA 信号线上状
  75          *              态。本函数可用于数据发送, 也可用于数据接收。
  76          ****************************************************************************/
  77          bit I_clock( void ) 
  78          {
  79   1              bit sample ;
  80   1              SCL = HIGH ;
  81   1              delay() ;
  82   1              sample = SDA ;
  83   1              SCL = LOW ;
  84   1              delay() ;
  85   1              return ( sample ) ;
  86   1       }
  87          /****************************************************************************
  88          *    函数原型: bit I_send(uchar I_data);
  89          *    功    能: 向I2C总线发送8位数据, 并请求一个应答信号ACK。如果收到ACK应答
  90          *              则返回1(TRUE), 否则返回0(FALSE)。
  91          ****************************************************************************/
  92          bit I_send( uchar I_data ) 
  93          {
  94   1              uchar i ;
  95   1              /* 发送8位数据 */
  96   1              for ( i=0 ; i<8 ; i++ ) 
  97   1              {
  98   2                      SDA = (bit)( I_data & 0x80 ) ;
  99   2                      I_data = I_data << 1 ;
 100   2                      I_clock() ;
 101   2              }
 102   1              /* 请求应答信号ACK */
 103   1              SDA = HIGH ;
 104   1              return ( ~I_clock() );
 105   1        }
 106          /****************************************************************************
 107          *    函数原型: uchar I_receive(void);
 108          *    功    能: 从I2C总线上接收8位数据信号, 并将接收到8位数据作为一个字节
 109          *              返回, 不回送应答信号ACK。主函数在调用本函数之前应保证SDA信
 110          *              号线处于浮置状态, 即使8051的P1.7脚置1。
 111          ****************************************************************************/
 112          uchar I_receive( void ) 
 113          {
 114   1              uchar I_data = 0;
 115   1              register uchar i ;
 116   1              for ( i=0 ; i<8 ; i++ ) 
 117   1              {
C51 COMPILER V7.50   24C04                                                                 09/12/2008 21:25:27 PAGE 3   

 118   2                      I_data *= 2 ;
 119   2                      if (I_clock()) I_data++;
 120   2              }
 121   1              return ( I_data ) ;
 122   1      }
 123          /****************************************************************************
 124          *    函数原型: void I_Ack(void);
 125          *    功    能: 向I2C总线发送一个应答信号ACK, 一般用于连续数据读取时。
 126          *****************************************************************************/
 127          void I_Ack( void ) 
 128          {
 129   1              SDA = LOW ;
 130   1              I_clock() ;
 131   1              SDA = HIGH ;
 132   1      }
 133          /****************************************************************************
 134          *    函数原型: bit E_address(uchar Address);
 135          *    功    能: 向24C04写入器件地址和一个指定的字节地址。
 136          *****************************************************************************/
 137          bit E_address( uchar Address ) 
 138          {
 139   1              I_start() ;
 140   1              if ( I_send( WRITE ) )
 141   1                      return ( I_send( Address ) ) ;
 142   1              else
 143   1                      return ( FALSE ) ;
 144   1      }
 145          /****************************************************************************
 146          *    函数原型: bit E_read_block(void);
 147          *    功    能: 从24C04中读取BLOCK_SIZE个字节的数据并转存于外部RAM存储映象
 148          *              单元, 采用序列读操作方式从片内0地址开始连续读取数据。如果
 149          *              24C04不接受指定的地址则返回0(FALSE)。
 150          *****************************************************************************/
 151          uchar E_read(uchar add ) 
 152          {   uchar rec=0;
 153   1               E_address(add); 
 154   1                       I_start() ;
 155   1                   I_send( READ ); 
 156   1                       rec = ( I_receive() ); 
 157   1               I_clock() ;
 158   1                       I_stop() ;
 159   1               return rec;
 160   1      }
 161          /****************************************************************************
 162          *    函数原型: void wait_5ms(void);
 163          *    功    能: 提供5ms延时(时钟频率为12MHz)。
 164          *****************************************************************************/
 165          void wait_5ms( void ) 
 166          {
 167   1              int i ;
 168   1              for ( i=0 ; i<1000 ; i++ ); 
 169   1      }
 170          /****************************************************************************
 171          *    函数原型: bit E_write_block(void);
 172          *    功    能: 将外部RAM存储映象单元中的数据写入到24C04的头BLOCK_SIZE个字节。
 173          *              采用字节写操作方式, 每次写入时都需要指定片内地址。如果24C04
 174          *              不接受指定的地址或某个传送的字节未收到应答信号ACK, 则返回0
 175          *              (FALSE)。
 176          *****************************************************************************/
 177          void  E_write( uchar s,uchar add ) 
 178          {  
 179   1                      if ( E_address(add) ) 
C51 COMPILER V7.50   24C04                                                                 09/12/2008 21:25:27 PAGE 4   

 180   1                         {  if(I_send(s))
 181   2                                  {
 182   3                                       I_stop() ;
 183   3                                       wait_5ms();
 184   3                                      }
 185   2                 }
 186   1      }
 187          
 188          /*********************** 主函数 ************************/
 189          void main(void)
 190          {
 191   1              static code CODE[16] = {                                                                         
 192   1                      0xb0,0xa0,0xb0,0xa0,0xd0,0xb4,0xd0,0xc2,0xce,0xc4,0xd5,0xc2,0xb0,0xa0,0xb0,0xa0,
 193   1                      };
 194   1              uint n=0;
 195   1              uint i;
 196   1              P0 = 0;
 197   1      
 198   1              I_init();
 199   1              WP = 0;
 200   1              for(i = 0;i < 16;i ++)
 201   1              {
 202   2                      E_write(CODE[i],i);
 203   2              }
 204   1      
 205   1              for(i = 0;i < 16;i ++)
 206   1              {
 207   2                      if(CODE[i] != E_read(i)) 
 208   2                      {
 209   3                              P0 = 0x01;       //如果读出来的值和写进的值不一样,则 P00 发光二极管点亮
 210   3                              break;
 211   3                      }
 212   2                      P0 = 0x02;
 213   2              }
 214   1              
 215   1              while(1);
 216   1      }  


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    301    ----
   CONSTANT SIZE    =     32    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----       2
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----       1
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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