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

📄 i2c.lst

📁 单片机开发板配套52个程序(c语言源代码)
💻 LST
字号:
C51 COMPILER V7.06   I2C                                                                   09/30/2011 15:04:05 PAGE 1   


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

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

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

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

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


MODULE INFORMATION:   STATIC OVERLAYABLE
C51 COMPILER V7.06   I2C                                                                   09/30/2011 15:04:05 PAGE 6   

   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 + -