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

📄 i2c.lst

📁 51实例大全
💻 LST
字号:
C51 COMPILER V7.06   I2C                                                                   06/17/2010 16:04:36 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE I2C
OBJECT MODULE PLACED IN .\obj\i2c.obj
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE i2c.c BROWSE DEBUG OBJECTEXTEND PRINT(.\obj\i2c.lst) OBJECT(.\obj\i2c.obj)

stmt level    source

   1          /*-----------------------------------------------
   2            名称:IIC协议 
   3            论坛:www.doflye.net
   4            编写:shifang
   5            修改:无
   6            内容:函数是采用软件延时的方法产生SCL脉冲,固对高晶振频率要作 一定的修改....(本例是1us机器
   7                          周期,即晶振频率要小于12MHZ)
   8          ------------------------------------------------*/  
   9            
  10                        
  11          #include "i2c.h"
  12          #include "delay.h"
  13          
  14          #define  _Nop()  _nop_()  //定义空指令
  15                                   
  16          bit ack;                      //应答标志位
  17          
  18          sbit SDA=P2^1;
  19          sbit SCL=P2^0;
  20          
  21          /*------------------------------------------------
  22                              启动总线
  23          ------------------------------------------------*/
  24          void Start_I2c()
  25          {
  26   1        SDA=1;   //发送起始条件的数据信号
  27   1        _Nop();
  28   1        SCL=1;
  29   1        _Nop();    //起始条件建立时间大于4.7us,延时
  30   1        _Nop();
  31   1        _Nop();
  32   1        _Nop();
  33   1        _Nop();    
  34   1        SDA=0;     //发送起始信号
  35   1        _Nop();    //起始条件锁定时间大于4μ
  36   1        _Nop();
  37   1        _Nop();
  38   1        _Nop();
  39   1        _Nop();       
  40   1        SCL=0;    //钳住I2C总线,准备发送或接收数据
  41   1        _Nop();
  42   1        _Nop();
  43   1      }
  44          /*------------------------------------------------
  45                              结束总线
  46          ------------------------------------------------*/
  47          void Stop_I2c()
  48          {
  49   1        SDA=0;    //发送结束条件的数据信号
  50   1        _Nop();   //发送结束条件的时钟信号
  51   1        SCL=1;    //结束条件建立时间大于4μ
  52   1        _Nop();
  53   1        _Nop();
  54   1        _Nop();
  55   1        _Nop();
C51 COMPILER V7.06   I2C                                                                   06/17/2010 16:04:36 PAGE 2   

  56   1        _Nop();
  57   1        SDA=1;    //发送I2C总线结束信号
  58   1        _Nop();
  59   1        _Nop();
  60   1        _Nop();
  61   1        _Nop();
  62   1      }
  63          
  64          
  65          
  66          
  67          /*----------------------------------------------------------------
  68                           字节数据传送函数               
  69          函数原型: void  SendByte(unsigned char c);
  70          功能:  将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
  71               此状态位进行操作.(不应答或非应答都使ack=0 假)     
  72               发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
  73          ------------------------------------------------------------------*/
  74          void  SendByte(unsigned char c)
  75          {
  76   1       unsigned char BitCnt;
  77   1       
  78   1       for(BitCnt=0;BitCnt<8;BitCnt++)  //要传送的数据长度为8位
  79   1          {
  80   2           if((c<<BitCnt)&0x80)SDA=1;   //判断发送位
  81   2             else  SDA=0;                
  82   2           _Nop();
  83   2           SCL=1;               //置时钟线为高,通知被控器开始接收数据位
  84   2            _Nop(); 
  85   2            _Nop();             //保证时钟高电平周期大于4μ
  86   2            _Nop();
  87   2            _Nop();
  88   2            _Nop();         
  89   2           SCL=0; 
  90   2          }
  91   1          
  92   1          _Nop();
  93   1          _Nop();
  94   1          SDA=1;               //8位发送完后释放数据线,准备接收应答位
  95   1          _Nop();
  96   1          _Nop();   
  97   1          SCL=1;
  98   1          _Nop();
  99   1          _Nop();
 100   1          _Nop();
 101   1          if(SDA==1)ack=0;     
 102   1             else ack=1;        //判断是否接收到应答信号
 103   1          SCL=0;
 104   1          _Nop();
 105   1          _Nop();
 106   1      }
 107          
 108          
 109          
 110          
 111          
 112          
 113          
 114          /*----------------------------------------------------------------
 115                           字节数据传送函数               
 116          函数原型: unsigned char  RcvByte();
 117          功能:  用来接收从器件传来的数据,并判断总线错误(不发应答信号),
C51 COMPILER V7.06   I2C                                                                   06/17/2010 16:04:36 PAGE 3   

 118               发完后请用应答函数。  
 119          ------------------------------------------------------------------*/    
 120          unsigned char  RcvByte()
 121          {
 122   1        unsigned char retc;
 123   1        unsigned char BitCnt;
 124   1        
 125   1        retc=0; 
 126   1        SDA=1;             //置数据线为输入方式
 127   1        for(BitCnt=0;BitCnt<8;BitCnt++)
 128   1            {
 129   2              _Nop();           
 130   2              SCL=0;       //置时钟线为低,准备接收数据位
 131   2              _Nop();
 132   2              _Nop();      //时钟低电平周期大于4.7us
 133   2              _Nop();
 134   2              _Nop();
 135   2              _Nop();
 136   2              SCL=1;       //置时钟线为高使数据线上数据有效
 137   2              _Nop();
 138   2              _Nop();
 139   2              retc=retc<<1;
 140   2              if(SDA==1)retc=retc+1; //读数据位,接收的数据位放入retc中
 141   2              _Nop();
 142   2              _Nop(); 
 143   2            }
 144   1        SCL=0;    
 145   1        _Nop();
 146   1        _Nop();
 147   1        return(retc);
 148   1      }
 149          
 150          
 151          
 152          /*----------------------------------------------------------------
 153                               应答子函数
 154          原型:  void Ack_I2c(void);
 155           
 156          ----------------------------------------------------------------*/
 157          /*void Ack_I2c(void)
 158          {
 159            
 160            SDA=0;     
 161            _Nop();
 162            _Nop();
 163            _Nop();      
 164            SCL=1;
 165            _Nop();
 166            _Nop();              //时钟低电平周期大于4μ
 167            _Nop();
 168            _Nop();
 169            _Nop();  
 170            SCL=0;               //清时钟线,钳住I2C总线以便继续接收
 171            _Nop();
 172            _Nop();    
 173          }*/
 174          /*----------------------------------------------------------------
 175                               非应答子函数
 176          原型:  void NoAck_I2c(void);
 177           
 178          ----------------------------------------------------------------*/
 179          void NoAck_I2c(void)
C51 COMPILER V7.06   I2C                                                                   06/17/2010 16:04:36 PAGE 4   

 180          {
 181   1        
 182   1        SDA=1;
 183   1        _Nop();
 184   1        _Nop();
 185   1        _Nop();      
 186   1        SCL=1;
 187   1        _Nop();
 188   1        _Nop();              //时钟低电平周期大于4μ
 189   1        _Nop();
 190   1        _Nop();
 191   1        _Nop();  
 192   1        SCL=0;                //清时钟线,钳住I2C总线以便继续接收
 193   1        _Nop();
 194   1        _Nop();    
 195   1      }
 196          
 197          
 198          
 199          
 200          
 201          
 202          /*----------------------------------------------------------------
 203                              向无子地址器件发送字节数据函数               
 204          函数原型: bit  ISendByte(unsigned char sla,ucahr c);  
 205          功能:     从启动总线到发送地址,数据,结束总线的全过程,从器件地址sla.
 206                     如果返回1表示操作成功,否则操作有误。
 207          注意:    使用前必须已结束总线。
 208          ----------------------------------------------------------------*/
 209          /*bit ISendByte(unsigned char sla,unsigned char c)
 210          {
 211             Start_I2c();               //启动总线
 212             SendByte(sla);             //发送器件地址
 213               if(ack==0)return(0);
 214             SendByte(c);               //发送数据
 215               if(ack==0)return(0);
 216            Stop_I2c();                 //结束总线
 217            return(1);
 218          }
 219          */
 220          
 221          /*----------------------------------------------------------------
 222                              向有子地址器件发送多字节数据函数               
 223          函数原型: bit  ISendStr(unsigned char sla,unsigned char suba,ucahr *s,unsigned char no);  
 224          功能:     从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件
 225                    地址sla,子地址suba,发送内容是s指向的内容,发送no个字节。
 226                     如果返回1表示操作成功,否则操作有误。
 227          注意:    使用前必须已结束总线。
 228          ----------------------------------------------------------------*/
 229          /*bit ISendStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no)
 230          {
 231             unsigned char i;
 232           for(i=0;i<no;i++)
 233              { 
 234             Start_I2c();               //启动总线
 235             SendByte(sla);             //发送器件地址
 236               if(ack==0)return(0);
 237             SendByte(suba);            //发送器件子地址
 238               if(ack==0)return(0); 
 239           
 240               SendByte(*s);            //发送数据
 241                 if(ack==0)return(0);
C51 COMPILER V7.06   I2C                                                                   06/17/2010 16:04:36 PAGE 5   

 242               Stop_I2c();                  //结束总线
 243                   DelayMs(1);               //必须延时等待芯片内部自动处理数据完毕
 244                   s++;
 245                   suba++;
 246              } 
 247            return(1);
 248          }
 249          */
 250          /*----------------------------------------------------------------
 251                              向无子地址器件读字节数据函数               
 252          函数原型: bit  IRcvByte(unsigned char sla,ucahr *c);  
 253          功能:     从启动总线到发送地址,读数据,结束总线的全过程,从器件地
 254                    址sla,返回值在c.
 255                     如果返回1表示操作成功,否则操作有误。
 256          注意:    使用前必须已结束总线。
 257          ----------------------------------------------------------------*/
 258          /*bit IRcvByte(unsigned char sla,unsigned char *c)
 259          {
 260             Start_I2c();                //启动总线
 261             SendByte(sla+1);            //发送器件地址
 262               if(ack==0)return(0);
 263             *c=RcvByte();               //读取数据
 264               NoAck_I2c();              //发送非就答位
 265               Stop_I2c();               //结束总线
 266            return(1);
 267          }
 268          
 269          */
 270          /*----------------------------------------------------------------
 271                              向有子地址器件读取多字节数据函数               
 272          函数原型: bit  ISendStr(unsigned char sla,unsigned char suba,ucahr *s,unsigned char no);  
 273          功能:     从启动总线到发送地址,子地址,读数据,结束总线的全过程,从器件
 274                    地址sla,子地址suba,读出的内容放入s指向的存储区,读no个字节。
 275                     如果返回1表示操作成功,否则操作有误。
 276          注意:    使用前必须已结束总线。
 277          ----------------------------------------------------------------*/
 278          /*bit IRcvStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no)
 279          {
 280             unsigned char i;
 281          
 282             Start_I2c();               //启动总线
 283             SendByte(sla);             //发送器件地址
 284               if(ack==0)return(0);
 285             SendByte(suba);            //发送器件子地址
 286               if(ack==0)return(0);
 287          
 288             Start_I2c();
 289             SendByte(sla+1);
 290                if(ack==0)return(0);
 291          
 292            for(i=0;i<no-1;i++)
 293              { 
 294               *s=RcvByte();              //发送数据
 295                Ack_I2c();                //发送就答位 
 296               s++;
 297              } 
 298             *s=RcvByte();
 299              NoAck_I2c();                 //发送非应位
 300              Stop_I2c();                    //结束总线
 301            return(1);
 302          }
 303          */
C51 COMPILER V7.06   I2C                                                                   06/17/2010 16:04:36 PAGE 6   



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