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

📄 test.lst

📁 24C02EEPROM C源程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V8.02   TEST                                                                  11/11/2007 21:15:12 PAGE 1   


C51 COMPILER V8.02, COMPILATION OF MODULE TEST
OBJECT MODULE PLACED IN test.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE test.c OPTIMIZE(9,SPEED) BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include <reg52.h> 
   2          #include <intrins.h>
   3           
   4          #define ERROR 10
   5           
   6          #define LEDPORT P0               //数码管接线脚
   7          
   8          sbit SCL=P3^5;                   //AT24C02-256的接线脚
   9          sbit SDA=P3^6;
  10           
  11          enum eepromtype {AT2401,AT2402,AT2404,AT2408,AT2416,AT2432,AT2464,AT24128,AT24256}; 
  12          enum eepromtype enumer; 
  13          unsigned char code buf1[]={1,3,5,7,9,10,11,12,13,15};/* 发送缓冲区 */ 
  14          unsigned char buf2[10];                                                          /* 接收缓冲区 */ 
  15          
  16           
  17          
  18          /* 一个通用的24C01-24C256共9种EEPROM的字节读写操作程序, 
  19          此程序有五个入口条件,分别为读写数据缓冲区指针, 
  20          进行读写的字节数,EEPROM首址,EEPROM控制字节, 
  21          以及EEPROM类型。此程序结构性良好,具有极好的容错性,程序机器码也不多: 
  22          DataBuff为读写数据输入/输出缓冲区的首址 
  23          Length 为要读写数据的字节数量 
  24          Addr 为EEPROM的片内地址 AT24256为0~32767 
  25          Control 为EEPROM的控制字节,具体形式为(1)(0)(1)(0)(A2)(A1)(A0)(R/W),其中R/W=1, 
  26          表示读操作,R/W=0为写操作,A2,A1,A0为EEPROM的页选或片选地址; 
  27          enumer为枚举变量,需为AT2401至AT24256中的一种,分别对应AT24C01至AT24C256; 
  28          函数返回值为一个位变量,若返回1表示此次操作失效,0表示操作成功; 
  29          ERROR为允许最大次数,若出现ERRORCOUNT次操作失效后,则函数中止操作,并返回1 
  30          SDA和SCL由用户自定义,这里暂定义为P3^0和P3^1; */          
  31          /* ----- AT24C01~AT24C256 的读写程序 ------ */ 
  32          bit RW24xx(unsigned char *DataBuff,unsigned char Length,unsigned int Addr, 
  33          unsigned char Control,enum eepromtype enumer) 
  34          { 
  35   1              void Delay(unsigned int DelayCount); /* 延时 */ 
  36   1              void Start(void);                                               /* 启动总线 */ 
  37   1              void Stop(void);                                                /* 停止IIC总线 */ 
  38   1              bit RecAck(void);                                               /* 检查应答位 */ 
  39   1              void NoAck(void);                                               /* 不对IIC总线产生应答 */ 
  40   1              void Ack(void);                                                 /* 对IIC总线产生应答 */ 
  41   1              unsigned char Receive(void);                    /* 从IIC总线上读数据子程序 */ 
  42   1              void Send(unsigned char sendbyte);              /* 向IIC总线写数据 */ 
  43   1              unsigned char data j,i=ERROR; 
  44   1              bit errorflag=1;                                                /* 出错标志 */ 
  45   1              while(i--) 
  46   1              { 
  47   2                      Start();                                                                /* 启动总线 */ 
  48   2                      Send(Control & 0xfe);                                   /* 向IIC总线写数据 */ 
  49   2                      if(RecAck()) continue;                                  /* 如写正确结束本次循环 */ 
  50   2                      if(enumer > AT2416) 
  51   2                      { 
  52   3                              Send((unsigned char)(Addr >> 8)); 
  53   3                              if(RecAck()) continue; 
  54   3                      } 
  55   2                      Send((unsigned char)Addr);                              /* 向IIC总线写数据 */ 
C51 COMPILER V8.02   TEST                                                                  11/11/2007 21:15:12 PAGE 2   

  56   2                      if(RecAck()) continue;                                  /* 如写正确结束本次循环 */ 
  57   2                      if(!(Control & 0x01)) 
  58   2                      { 
  59   3                              j=Length; 
  60   3                              errorflag=0;                                                    /* 清错误特征位 */ 
  61   3                              while(j--) 
  62   3                              { 
  63   4                                      Send(*DataBuff++);                                      /* 向IIC总线写数据 */ 
  64   4                                      if(!RecAck()) continue;                                 /* 如写正确结束本次循环 */ 
  65   4                                      errorflag=1; 
  66   4                                      break; 
  67   4                              } 
  68   3                              if(errorflag==1) continue; 
  69   3                              break; 
  70   3                      } 
  71   2                      else 
  72   2                      { 
  73   3                              Start();                                                                /* 启动总线 */ 
  74   3                              Send(Control);                                                  /* 向IIC总线写数据 */ 
  75   3                              if(RecAck()) continue; 
  76   3                              while(--Length)                                                 /* 字节长为0结束 */ 
  77   3                              { 
  78   4                                      *DataBuff ++= Receive(); 
  79   4                                      Ack();                                                                  /* 对IIC总线产生应答 */ 
  80   4                              } 
  81   3                              *DataBuff=Receive();                                    /* 读最后一个字节 */ 
  82   3                              NoAck();                                                                /* 不对IIC总线产生应答 */ 
  83   3                              errorflag=0; 
  84   3                              break; 
  85   3                      } 
  86   2              } 
  87   1              Stop();                                                                 /* 停止IIC总线 */ 
  88   1              if(!(Control & 0x01)) 
  89   1              { 
  90   2                      Delay(255); 
  91   2                      Delay(255); 
  92   2                      Delay(255); 
  93   2                      Delay(255); 
  94   2              } 
  95   1              return(errorflag); 
  96   1      } 
  97          
  98           
  99          
 100          /* * * * * 以下是对IIC总线的操作子程序 * * * * */ 
 101          /* * * * * * 启动总线 * * * * */ 
 102          void Start(void) 
 103          { 
 104   1              SCL=0;                          /* SCL处于高电平时,SDA从高电平转向低电平表示 */ 
 105   1              SDA=1;                                  /* 一个"开始"状态,该状态必须在其他命令之前执行 */ 
 106   1              SCL=1; 
 107   1              _nop_(); _nop_(); _nop_(); 
 108   1              SDA=0; 
 109   1              _nop_(); _nop_(); _nop_(); _nop_(); 
 110   1              SCL=0; 
 111   1              SDA=1; 
 112   1      } 
 113          
 114           
 115          
 116          /* * * * * 停止IIC总线 * * * * */ 
 117          void Stop(void) 
C51 COMPILER V8.02   TEST                                                                  11/11/2007 21:15:12 PAGE 3   

 118          { 
 119   1              SCL=0;                                  /*SCL处于高电平时,SDA从低电平转向高电平 */ 
 120   1              SDA=0;                                          /*表示一个"停止"状态,该状态终止所有通讯 */ 
 121   1              SCL=1; 
 122   1              _nop_(); _nop_(); _nop_();      /* 空操作 */ 
 123   1              SDA=1; 
 124   1              _nop_(); _nop_(); _nop_(); 
 125   1              SCL=0; 
 126   1      }  
 127          /* * * * * 检查应答位 * * * * */ 
 128          bit RecAck(void) 
 129          { 
 130   1              SCL=0; 
 131   1              SDA=1; 
 132   1              SCL=1; 
 133   1              _nop_(); _nop_(); _nop_(); _nop_(); 

⌨️ 快捷键说明

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