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

📄 iic_c51.lst

📁 在uvision2开发平台下用C51语言开发
💻 LST
📖 第 1 页 / 共 2 页
字号:
 186   2                  SCL = 1;       /*置时钟线为高使数据线上数据有效*/
 187   2                  _Nop();
 188   2                  _Nop();
 189   2                  _Nop();
 190   2                  _Nop();
 191   2                  retc = retc << 1;
 192   2                  if (SDA == 1) retc = retc+1; /*读数据位,接收的数据位放入retc中 */
 193   2                  _Nop();
 194   2                  _Nop(); 
 195   2              _Nop();
 196   2                  _Nop();
 197   2        }
 198   1        
 199   1        SCL = 0;    
 200   1        _Nop();
 201   1        _Nop();
 202   1        _Nop();
 203   1        _Nop();
 204   1        printuf("rect = %x\n", retc);
 205   1        return(retc);
 206   1      }
 207          
 208          
 209          
 210          
 211          /********************************************************************
 212                               应答子函数
 213          原型:  void Ack_I2c(bit a);
 214           
 215          功能:主控器进行应答信号,(可以是应答或非应答信号)
 216          ********************************************************************/
 217          void Ack_I2c(bit a)
 218          {
 219   1        
 220   1         if(a == 0) SDA = 0;     /*在此发出应答或非应答信号 */
 221   1         else SDA = 1;
 222   1        _Nop();
 223   1        _Nop();
 224   1        _Nop();      
 225   1        _Nop();
 226   1        _Nop();      
 227   1      
 228   1        SCL = 1;
 229   1        IICWait(20);              /*时钟低电平周期大于4μs*/  
 230   1        SCL = 0;                /*清时钟线,钳住I2C总线以便继续接收*/
 231   1        _Nop();
 232   1        _Nop();
 233   1        _Nop();
 234   1        _Nop();    
 235   1      }
 236          
 237          
 238          
 239          
 240          
 241          
C51 COMPILER V8.02   IIC_C51                                                               03/20/2008 16:38:57 PAGE 5   

 242          /*******************************************************************
 243                              向无子地址器件发送字节数据函数               
 244          函数原型: bit  ISendByte(uchar sla,ucahr c);  
 245          功能:     从启动总线到发送地址,数据,结束总线的全过程,从器件地址sla.
 246                     如果返回1表示操作成功,否则操作有误。
 247          注意:    使用前必须已结束总线。
 248          ********************************************************************/
 249          /*uchar ISendByte(uchar sla,uchar c)
 250          {
 251             Start_I2c();               /*启动总线*/
 252          //   SendByte(sla);            /*发送器件地址*/
 253          //     if(ack==0)return(0);
 254          //   SendByte(c);               /*发送数据*/
 255          //     if(ack==0)return(0);
 256          //  Stop_I2c();                 /*结束总线*/ 
 257          //  return(1);
 258          //}   
 259          
 260          
 261          
 262          
 263          /*******************************************************************
 264                              向有子地址器件发送多字节数据函数               
 265          函数原型: bit  ISendStr(uchar sla,uchar suba,ucahr *s,uchar no);  
 266          功能:     从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件
 267                    地址sla,子地址suba,发送内容是s指向的内容,发送no个字节。
 268                     如果返回1表示操作成功,否则操作有误。
 269          注意:    使用前必须已结束总线。
 270          ********************************************************************/
 271          bit ISendStr(uchar sla,uchar suba,uchar *s,uchar no)
 272          {
 273   1         uchar i;
 274   1      
 275   1         Start_I2c();               /*启动总线*/
 276   1         SendByte(sla);            /*发送器件地址*/
 277   1           if(ack==0)return(0);
 278   1         SendByte(suba);            /*发送器件子地址*/
 279   1           if(ack==0)return(0);
 280   1      
 281   1         for(i=0;i<no;i++)
 282   1          {   
 283   2           SendByte(*s);               /*发送数据*/
 284   2             if(ack==0)return(0);
 285   2           s++;
 286   2          } 
 287   1       Stop_I2c();                 /*结束总线*/ 
 288   1        return(1);
 289   1      }
 290          
 291          
 292          
 293          
 294          
 295          
 296          /*******************************************************************
 297                              向无子地址器件读字节数据函数               
 298          函数原型: bit  IRcvByte(uchar sla,ucahr *c);  
 299          功能:     从启动总线到发送地址,读数据,结束总线的全过程,从器件地
 300                    址sla,返回值在c.
 301                     如果返回1表示操作成功,否则操作有误。
 302          注意:    使用前必须已结束总线。
 303          ********************************************************************/
C51 COMPILER V8.02   IIC_C51                                                               03/20/2008 16:38:57 PAGE 6   

 304          //bit IRcvByte(uchar sla,uchar *c)
 305          //{
 306          //   Start_I2c();                /*启动总线*/
 307          //   SendByte(sla+1);           /*发送器件地址*/
 308          //     if(ack==0)return(0);
 309          //   *c=RcvByte();               /*读取数据*/
 310          //     Ack_I2c(1);               /*发送非就答位*/
 311          //  Stop_I2c();                  /*结束总线*/ 
 312          //  return(1);
 313          //}
 314          
 315          
 316          
 317          /*******************************************************************
 318                              向有子地址器件读取多字节数据函数               
 319          函数原型: bit  ISendStr(uchar sla,uchar suba,ucahr *s,uchar no);  
 320          功能:     从启动总线到发送地址,子地址,读数据,结束总线的全过程,从器件
 321                    地址sla,子地址suba,读出的内容放入s指向的存储区,读no个字节。
 322                     如果返回1表示操作成功,否则操作有误。
 323          注意:    使用前必须已结束总线。
 324          ********************************************************************/
 325          bit IRcvStr(uchar sla,uchar suba,uchar *s,uchar no)
 326          {
 327   1         uchar i, j = 0;
 328   1         uchar stemp = *s;
 329   1      
 330   1         Start_I2c();               /*启动总线*/
 331   1         SendByte(sla);            /*发送器件地址*/
 332   1           if(ack==0)return(0);
 333   1      //   printu("1 \n");
 334   1         SendByte(suba);            /*发送器件子地址*/
 335   1          if(ack==0)return(0);
 336   1      //   printu("2 \n");
 337   1      
 338   1         Start_I2c();
 339   1         SendByte(sla+1);
 340   1            if(ack==0)return(0);
 341   1       //  printu("3 \n");
 342   1      
 343   1         for(i=0;i<no-1;i++)
 344   1         {   
 345   2            *(s+j) = RcvByte();               /*发送数据*/
 346   2            Ack_I2c(0);                /*发送就答位*/  
 347   2            j++;
 348   2         } 
 349   1         *(s+j) = RcvByte();
 350   1          Ack_I2c(1);                 /*发送非应位*/
 351   1       Stop_I2c();                    /*结束总线*/ 
 352   1        return(1);
 353   1      }
 354          
 355          void IICWait(uchar freq)   //根据采用晶振频率的不同,机器周期也不同,频率单位为MHz
 356          {
 357   1         uchar i,NumMcycle;
 358   1         NumMcycle = 5*freq/12 + 1;   //NumMcycle为nop指令持续次数,5表示5us,12个晶振周期等于一个机器周期,加一
             -是为了确保次数购要求
 359   1         for (i=0; i<NumMcycle; i++)
 360   1         {
 361   2           _Nop();
 362   2         }
 363   1      }

C51 COMPILER V8.02   IIC_C51                                                               03/20/2008 16:38:57 PAGE 7   


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    440    ----
   CONSTANT SIZE    =     11    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----      20
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      1       1
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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