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

📄 rw24xx.lst

📁 51单片机315模块双向通信代码,可直接使用.用于完成家电控制之类的小应用.
💻 LST
字号:
C51 COMPILER V7.04   RW24XX                                                                10/23/2004 13:20:46 PAGE 1   


C51 COMPILER V7.04, COMPILATION OF MODULE RW24XX
OBJECT MODULE PLACED IN rw24xx.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE rw24xx.c ROM(SMALL) BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          #pragma  ot(6,SIZE)
   2          #include <reg52.h>
   3          #include <intrins.h>
   4          #define  ERRORCOUNT 10
   5          sbit     SDA=P1^3;
   6          sbit     SCL=P1^2;
   7          enum  eepromtype  {M2401,M2402,M2404,M2408,M2416,M2432,M2464,M24128,M24256};
   8          
   9          //DataBuff为读写数据输入/输出缓冲区的首址
  10          //ByteQuantity 为要读写数据的字节数量
  11          //Address 为EEPROM的片内地址
  12          //ControlByte 为EEPROM的控制字节,具体形式为(1)(0)(1)(0)(A2)(A1)(A0)(R/W),其中R/W=1,
  13          //表示读操作,R/W=0为写操作,A2,A1,A0为EEPROM的页选或片选地址;
  14          //EepromType为枚举变量,需为M2401至M24256中的一种,分别对应24C01至24C256;
  15          //函数返回值为一个位变量,若返回1表示此次操作失效,0表示操作成功;
  16          //ERRORCOUNT为允许最大次数,若出现ERRORCOUNT次操作失效后,则函数中止操作,并返回1
  17          //SDA和SCL由用户自定义,这里暂定义为P0^0和P0^1;
  18          //其余的用户不用管,只要把只子程序放在你的程序中并调用它就可以了;
  19          
  20          
  21          /***********************************************************************************/
  22          bit   RW24XX(unsigned char *DataBuff,unsigned char ByteQuantity,unsigned int Address,
  23                               unsigned char ControlByte,enum eepromtype EepromType)
  24          {
  25   1      void Delay(unsigned char DelayCount);
  26   1      void IICStart(void);
  27   1      void IICStop(void);
  28   1      bit  IICRecAck(void);
  29   1      void IICNoAck(void);
  30   1      void IICAck(void);
  31   1      unsigned char IICReceiveByte(void);
  32   1      void IICSendByte(unsigned char sendbyte);
  33   1      unsigned char data j,i=ERRORCOUNT;
  34   1      bit      errorflag=1;
  35   1      while(i--)
  36   1         {
  37   2         IICStart();
  38   2         IICSendByte(ControlByte&0xfe);
  39   2         if(IICRecAck())
  40   2             continue;
  41   2         if(EepromType>M2416)
  42   2            {
  43   3            IICSendByte((unsigned char)(Address>>8));
  44   3            if(IICRecAck())
  45   3               continue;
  46   3            }
  47   2         IICSendByte((unsigned char)Address);
  48   2         if(IICRecAck())
  49   2             continue;
  50   2         if(!(ControlByte&0x01))
  51   2            {
  52   3            j=ByteQuantity;
  53   3            errorflag=0;                      //********clr errorflag
  54   3            while(j--)
  55   3              {
C51 COMPILER V7.04   RW24XX                                                                10/23/2004 13:20:46 PAGE 2   

  56   4              IICSendByte(*DataBuff++);
  57   4              if(!IICRecAck())
  58   4                 continue;
  59   4              errorflag=1;
  60   4              break;
  61   4              }
  62   3            if(errorflag==1)
  63   3              continue;
  64   3            break;
  65   3            }
  66   2         else
  67   2           {
  68   3           IICStart();
  69   3           IICSendByte(ControlByte);
  70   3           if(IICRecAck())
  71   3             continue;
  72   3           while(--ByteQuantity)
  73   3             {
  74   4             *DataBuff++=IICReceiveByte();
  75   4             IICAck();
  76   4             }
  77   3           *DataBuff=IICReceiveByte();        //read last byte data
  78   3           IICNoAck();
  79   3           errorflag=0;
  80   3           break;
  81   3           }
  82   2        }
  83   1      IICStop();
  84   1      if(!(ControlByte&0x01))
  85   1        {
  86   2        Delay(255);
  87   2        Delay(255);
  88   2        Delay(255);
  89   2        Delay(255);
  90   2        }
  91   1      return(errorflag);
  92   1      }
  93          
  94          
  95          /*****************以下是对IIC总线的操作子程序***/
  96          /*****************启动总线**********************/
  97          void IICStart(void)
  98          {
  99   1      SCL=0;                  //
 100   1      SDA=1;
 101   1      SCL=1;
 102   1      _nop_();
 103   1      _nop_();
 104   1      _nop_();
 105   1      SDA=0;
 106   1      _nop_();
 107   1      _nop_();
 108   1      _nop_();
 109   1      _nop_();
 110   1      SCL=0;
 111   1      SDA=1;                  //
 112   1      }
 113          
 114          /*****************停止IIC总线****************/
 115          void IICStop(void)
 116          {
 117   1      SCL=0;
C51 COMPILER V7.04   RW24XX                                                                10/23/2004 13:20:46 PAGE 3   

 118   1      SDA=0;
 119   1      SCL=1;
 120   1      _nop_();
 121   1      _nop_();
 122   1      _nop_();
 123   1      SDA=1;
 124   1      _nop_();
 125   1      _nop_();
 126   1      _nop_();
 127   1      SCL=0;
 128   1      }
 129          
 130          /**************检查应答位*******************/
 131          bit IICRecAck(void)
 132          {
 133   1      SCL=0;
 134   1      SDA=1;
 135   1      SCL=1;
 136   1      _nop_();
 137   1      _nop_();
 138   1      _nop_();
 139   1      _nop_();
 140   1      CY=SDA;                 //因为返回值总是放在CY中的
 141   1      SCL=0;
 142   1      return(CY);
 143   1      }
 144          
 145          /***************对IIC总线产生应答*******************/
 146          void IICACK(void)
 147          {
 148   1      SDA=0;
 149   1      SCL=1;
 150   1      _nop_();
 151   1      _nop_();
 152   1      _nop_();
 153   1      _nop_();
 154   1      SCL=0;
 155   1      _nop_();
 156   1      SDA=1;
 157   1      }
 158          
 159          /*****************不对IIC总线产生应答***************/
 160          void IICNoAck(void)
 161          {
 162   1      SDA=1;
 163   1      SCL=1;
 164   1      _nop_();
 165   1      _nop_();
 166   1      _nop_();
 167   1      _nop_();
 168   1      SCL=0;
 169   1      }
 170          
 171          /*******************向IIC总线写数据*********************/
 172          void IICSendByte(unsigned char sendbyte)
 173          {
 174   1      unsigned char data j=8;
 175   1      for(;j>0;j--)
 176   1         {
 177   2         SCL=0;
 178   2         sendbyte<<=1;        //无论C51怎样实现这个操作,始终会使CY=sendbyte^7;
 179   2         SDA=CY;
C51 COMPILER V7.04   RW24XX                                                                10/23/2004 13:20:46 PAGE 4   

 180   2         SCL=1;
 181   2         }
 182   1      SCL=0;
 183   1      }
 184          
 185          /**********************从IIC总线上读数据子程序**********/
 186          unsigned char IICReceiveByte(void)
 187          {
 188   1      register receivebyte,i=8;
 189   1      SCL=0;
 190   1      while(i--)
 191   1         {
 192   2         SCL=1;
 193   2         receivebyte=(receivebyte<<1)|SDA;
 194   2         SCL=0;
 195   2         }
 196   1      return(receivebyte);
 197   1      }
 198          
 199          /***************一个简单延时程序************************/
 200          void Delay(unsigned char DelayCount)
 201          {
 202   1      while(DelayCount--);
 203   1      }
 204          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    322    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----      12
   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 + -