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

📄 ymxiic.lst

📁 i2clCD仿真.rari2clCD仿真 i2clCD仿真 i2clCD仿真
💻 LST
字号:
C51 COMPILER V6.23a  YMXIIC                                                                04/18/2006 22:29:34 PAGE 1   


C51 COMPILER V6.23a, COMPILATION OF MODULE YMXIIC
OBJECT MODULE PLACED IN YMXIIC.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE YMXIIC.C BROWSE DEBUG OBJECTEXTEND TABS(8) 

stmt level    source

   1          #include <AT89X51.h>          /*头文件的包含*/
   2          #include <intrins.h>
   3          #define  uchar unsigned char /*宏定义*/
   4          #define  uint  unsigned int
   5          
   6          sbit SDA=P2^6;            /*模拟I2C数据传送位*/
   7          sbit SCL=P2^7;            /*模拟I2C时钟控制位*/
   8          
   9          bit ack;                 /*应答标志位*/
  10          void delayus(unsigned char i)
  11          {
  12   1              while(i--);
  13   1      }   
  14          void Start_I2c()
  15          {
  16   1              SDA=1;        /*发送起始条件的数据信号*/
  17   1              delayus(10); 
  18   1              SCL=1;
  19   1              delayus(14);    /*起始条件建立时间大于4.7us,延时*/  
  20   1              SDA=0;        /*发送起始信号*/
  21   1              delayus(14);    /* 起始条件锁定时间大于4μs*/
  22   1              SCL=0;        /*钳住I2C总线,准备发送或接收数据 */
  23   1              delayus(10); 
  24   1      }
  25          
  26          void Stop_I2c()
  27          {
  28   1              SDA=0;  /*发送结束条件的数据信号*/
  29   1              delayus(10); /*发送结束条件的时钟信号*/
  30   1              SCL=1;  /*结束条件建立时间大于4μs*/
  31   1              delayus(14);
  32   1              SDA=1;  /*发送I2C总线结束信号*/
  33   1              delayus(10);
  34   1      }
  35          
  36          /*******************************************************************
  37                           字节数据传送函数               
  38          函数原型: void  SendByte(uchar c);
  39          功能:  将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
  40               此状态位进行操作.(不应答或非应答都使ack=0 假)     
  41               发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
  42          ********************************************************************/
  43          void  SendByte(uchar c)
  44          {
  45   1              uchar BitCnt;
  46   1       
  47   1              for(BitCnt=0;BitCnt<8;BitCnt++)  /*要传送的数据长度为8位*/
  48   1          {
  49   2              if((c<<BitCnt)&0x80)
  50   2                              SDA=1;           /*判断发送位*/
  51   2              else  
  52   2                              SDA=0;                  
  53   2              delayus(6);
  54   2              SCL=1;               /*置时钟线为高,通知被控器开始接收数据位*/ 
  55   2              delayus(14);               /*保证时钟高电平周期大于4μs*/        
C51 COMPILER V6.23a  YMXIIC                                                                04/18/2006 22:29:34 PAGE 2   

  56   2              SCL=0; 
  57   2              delayus(8); 
  58   2          }
  59   1          
  60   1              delayus(8);
  61   1              SDA=1;
  62   1              delayus(8);               /*8位发送完后释放数据线,准备接收应答位*/   
  63   1              SCL=1;
  64   1              delayus(10);
  65   1          if(SDA==1)ack=0;     
  66   1              else ack=1;        /*判断是否接收到应答信号*/
  67   1              SCL=0;
  68   1              delayus(8);
  69   1      }
  70          
  71          /*******************************************************************
  72                           字节数据传送函数               
  73          函数原型: uchar  RcvByte();
  74          功能:  用来接收从器件传来的数据,并判断总线错误(不发应答信号),
  75               发完后请用应答函数。  
  76          ********************************************************************/   
  77          uchar  RcvByte()
  78          {
  79   1              uchar retc;
  80   1              uchar BitCnt;
  81   1        
  82   1              retc=0; 
  83   1              SDA=1;             /*置数据线为输入方式*/
  84   1              for(BitCnt=0;BitCnt<8;BitCnt++)
  85   1          {
  86   2              delayus(4);           
  87   2              SCL=0;       /*置时钟线为低,准备接收数据位*/
  88   2              delayus(14);   /*时钟低电平周期大于4.7μs*/
  89   2      
  90   2              SCL=1;       /*置时钟线为高使数据线上数据有效*/
  91   2                      delayus(8);
  92   2              retc=retc<<1;
  93   2              if(SDA==1)retc=retc+1; /*读数据位,接收的数据位放入retc中 */
  94   2                      delayus(10);
  95   2          }
  96   1              SCL=0;    
  97   1              delayus(8);
  98   1              return(retc);
  99   1      }
 100          
 101          /********************************************************************
 102                               应答子函数
 103          原型:  void Ack_I2c(bit a);
 104           
 105          功能:主控器进行应答信号,(可以是应答或非应答信号)
 106          ********************************************************************/
 107          void Ack_I2c(bit a)
 108          {
 109   1        
 110   1              if(a==0)SDA=0;     /*在此发出应答或非应答信号 */
 111   1          else SDA=1;
 112   1              delayus(10);      
 113   1              SCL=1;
 114   1          delayus(14);              /*时钟低电平周期大于4μs*/  
 115   1              SCL=0;                /*清时钟线,钳住I2C总线以便继续接收*/
 116   1              delayus(8);   
 117   1      }
C51 COMPILER V6.23a  YMXIIC                                                                04/18/2006 22:29:34 PAGE 3   

 118          
 119          /*
 120                              向有子地址器件发送多字节数据函数               
 121          函数原型: bit  ISendStr(uchar sla,uchar suba,ucahr *s,uchar no);  
 122          功能:     从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件
 123                    地址sla,子地址suba,发送内容是s指向的内容,发送no个字节。
 124                     如果返回1表示操作成功,否则操作有误。
 125          注意:    使用前必须已结束总线。
 126          ********************************************************************/
 127          bit ISendStr(uchar sla,uchar suba,uchar *s,uchar no)
 128          {
 129   1         uchar i;
 130   1         Start_I2c();               /*启动总线*/
 131   1         SendByte(sla);             /*发送器件地址*/
 132   1           if(ack==0)return(0);
 133   1         SendByte(suba);            /*发送器件子地址*/
 134   1           if(ack==0)return(0);
 135   1      
 136   1         for(i=0;i<no;i++)
 137   1          {   
 138   2           SendByte(*s);             /*发送数据*/
 139   2             if(ack==0)return(0);
 140   2           s++;
 141   2          } 
 142   1       Stop_I2c();                   /*结束总线*/ 
 143   1        return(1);
 144   1      }
 145          
 146          /*******************************************************************
 147                              向有子地址器件读取多字节数据函数               
 148          函数原型: bit  ISendStr(uchar sla,uchar suba,ucahr *s,uchar no);  
 149          功能:     从启动总线到发送地址,子地址,读数据,结束总线的全过程,从器件
 150                    地址sla,子地址suba,读出的内容放入s指向的存储区,读no个字节。
 151                     如果返回1表示操作成功,否则操作有误。
 152          注意:    使用前必须已结束总线。
 153          ********************************************************************/
 154          bit IRcvStr(uchar sla,uchar suba,uchar *s,uchar no)
 155          {
 156   1         uchar i;
 157   1      
 158   1         Start_I2c();               /*启动总线*/
 159   1         SendByte(sla);            /*发送器件地址*/
 160   1           if(ack==0)return(0);
 161   1         SendByte(suba);            /*发送器件子地址*/
 162   1           if(ack==0)return(0);
 163   1      
 164   1         Start_I2c();
 165   1         SendByte(sla+1);
 166   1            if(ack==0)return(0);
 167   1      
 168   1         for(i=0;i<no-1;i++)
 169   1          {   
 170   2           *s=RcvByte();               /*发送数据*/
 171   2            Ack_I2c(0);                /*发送就答位*/  
 172   2            s++;
 173   2          } 
 174   1         *s=RcvByte();
 175   1          Ack_I2c(1);                 /*发送非应位*/
 176   1          Stop_I2c();                 /*结束总线*/ 
 177   1          return(1);
 178   1      }
 179          void main(void)
C51 COMPILER V6.23a  YMXIIC                                                                04/18/2006 22:29:34 PAGE 4   

 180          {
 181   1      uchar r[4]={1,2,3,4},k;
 182   1      bit t;
 183   1      uchar b[4]={0};
 184   1      
 185   1      t= ISendStr(0xa0,0x20,r,4);
 186   1      
 187   1      t= IRcvStr(0xa0,0x20,b,4);
 188   1      
 189   1      k=b[0]+b[1]+b[2]+b[3];
 190   1      if(k==10)
 191   1      P0=0x06;
 192   1      else
 193   1      P0=0x5b;
 194   1      while(1)
 195   1              {
 196   2      
 197   2              P2_0=0;
 198   2              }
 199   1      }
 200          
 201          
 202          
 203          
 204          
 205          /*******************************************************************
 206                              向无子地址器件发送字节数据函数               
 207          函数原型: bit  ISendByte(uchar address,ucahr c);  
 208          功能:     从启动总线到发送地址,数据,结束总线的全过程,从器件地址sla.
 209                     如果返回1表示操作成功,否则操作有误。
 210          注意:    使用前必须已结束总线。
 211          ********************************************************************/
 212          //bit ISendByte(uchar address,uchar c)
 213          //{
 214                  //Start_I2c();               /*启动总线*/
 215          //      SendByte(address);            /*发送器件地址*/
 216          //    if(ack==0)return(0);
 217           //     SendByte(c);               /*发送数据*/
 218           //   if(ack==0)return(0);
 219           //     Stop_I2c();                 /*结束总线*/ 
 220           //     return(1);
 221          //}
 222          
 223          /*******************************************************************
 224                              向无子地址器件读字节数据函数               
 225          函数原型: bit  IRcvByte(uchar address,ucahr *c);  
 226          功能:     从启动总线到发送地址,读数据,结束总线的全过程,从器件地
 227                    址sla,返回值在c.
 228                     如果返回1表示操作成功,否则操作有误。
 229          注意:    使用前必须已结束总线。
 230          ********************************************************************/
 231          //bit IRcvByte(uchar address,uchar *c)
 232          //{
 233           //     Start_I2c();                /*启动总线*/
 234            //    SendByte(address+1);           /*发送器件地址*/
 235           //   if(ack==0)return(0);
 236           //     *c=RcvByte();               /*读取数据*/
 237           //   Ack_I2c(1);               /*发送非就答位*/
 238           //     Stop_I2c();                  /*结束总线*/ 
 239           //     return(1);
 240          //}
 241          
C51 COMPILER V6.23a  YMXIIC                                                                04/18/2006 22:29:34 PAGE 5   

 242          /*******************************************************************/
 243                   


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


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

⌨️ 快捷键说明

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