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

📄 i2c.lst

📁 51单片机实验例程
💻 LST
字号:
C51 COMPILER V7.10   I2C                                                                   02/15/2010 14:36:28 PAGE 1   


C51 COMPILER V7.10, COMPILATION OF MODULE I2C
OBJECT MODULE PLACED IN I2C.OBJ
COMPILER INVOKED BY: C:\Program Files\Keil\C51\BIN\C51.EXE I2C.C BROWSE DEBUG OBJECTEXTEND

line level    source

   1          
   2           /*************************此部分为I2C总线的驱动程序*************************************/
   3          
   4          #include<reg52.h>
   5          #include <intrins.h>
   6          #include<Function.h>
   7          
   8          #define  NOP()   _nop_()   /* 定义空指令 */
   9          #define  _Nop()  _nop_()   /*定义空指令*/
  10          
  11           
  12          sbit     SCL=P2^0;     //I2C  时钟 
  13          sbit     SDA=P2^1;     //I2C  数据 
  14          
  15          bit ack;                 /*应答标志位*/
  16             
  17          
  18          /*******************************************************************
  19                               起动总线函数               
  20          函数原型: void  Start_I2c();  
  21          功能:     启动I2C总线,即发送I2C起始条件.  
  22          ********************************************************************/
  23          void Start_I2c()
  24          {
  25   1        SDA=1;         /*发送起始条件的数据信号*/
  26   1        _Nop();
  27   1        SCL=1;
  28   1        _Nop();        /*起始条件建立时间大于4.7us,延时*/
  29   1        _Nop();
  30   1        _Nop();
  31   1        _Nop();
  32   1        _Nop();    
  33   1        SDA=0;         /*发送起始信号*/
  34   1        _Nop();        /* 起始条件锁定时间大于4μs*/
  35   1        _Nop();
  36   1        _Nop();
  37   1        _Nop();
  38   1        _Nop();       
  39   1        SCL=0;       /*钳住I2C总线,准备发送或接收数据 */
  40   1        _Nop();
  41   1        _Nop();
  42   1      }
  43          
  44          /*******************************************************************
  45                                结束总线函数               
  46          函数原型: void  Stop_I2c();  
  47          功能:     结束I2C总线,即发送I2C结束条件.  
  48          ********************************************************************/
  49          void Stop_I2c()
  50          {
  51   1        SDA=0;      /*发送结束条件的数据信号*/
  52   1        _Nop();       /*发送结束条件的时钟信号*/
  53   1        SCL=1;      /*结束条件建立时间大于4μs*/
  54   1        _Nop();
  55   1        _Nop();
C51 COMPILER V7.10   I2C                                                                   02/15/2010 14:36:28 PAGE 2   

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

 118   1        retc=0; 
 119   1        SDA=1;                       /*置数据线为输入方式*/
 120   1        for(BitCnt=0;BitCnt<8;BitCnt++)
 121   1            {
 122   2              _Nop();           
 123   2              SCL=0;                  /*置时钟线为低,准备接收数据位*/
 124   2              _Nop();
 125   2              _Nop();                 /*时钟低电平周期大于4.7μs*/
 126   2              _Nop();
 127   2              _Nop();
 128   2              _Nop();
 129   2              SCL=1;                  /*置时钟线为高使数据线上数据有效*/
 130   2              _Nop();
 131   2              _Nop();
 132   2              retc=retc<<1;
 133   2              if(SDA==1)retc=retc+1;  /*读数据位,接收的数据位放入retc中 */
 134   2              _Nop();
 135   2              _Nop(); 
 136   2            }
 137   1        SCL=0;    
 138   1        _Nop();
 139   1        _Nop();
 140   1        return(retc);
 141   1      }
 142          
 143          /********************************************************************
 144                               应答子函数
 145          函数原型:  void Ack_I2c(bit a);
 146          功能:      主控器进行应答信号(可以是应答或非应答信号,由位参数a决定)
 147          ********************************************************************/
 148          void Ack_I2c(bit a)
 149          {
 150   1        
 151   1        if(a==0)SDA=0;              /*在此发出应答或非应答信号 */
 152   1        else SDA=1;
 153   1        _Nop();
 154   1        _Nop();
 155   1        _Nop();      
 156   1        SCL=1;
 157   1        _Nop();
 158   1        _Nop();                    /*时钟低电平周期大于4μs*/
 159   1        _Nop();
 160   1        _Nop();
 161   1        _Nop();  
 162   1        SCL=0;                     /*清时钟线,钳住I2C总线以便继续接收*/
 163   1        _Nop();
 164   1        _Nop();    
 165   1      }
 166          
 167          
 168          
 169          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    159    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      1       1
C51 COMPILER V7.10   I2C                                                                   02/15/2010 14:36:28 PAGE 4   

END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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