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

📄 vi2c_c51.lst

📁 USB code using I2C bus to communicate with other node
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.06   VI2C_C51                                                              09/06/2003 16:55:52 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE VI2C_C51
OBJECT MODULE PLACED IN VI2C_C51.OBJ
COMPILER INVOKED BY: C:\KEIL\C51\BIN\C51.EXE VI2C_C51.c OPTIMIZE(2,SPEED) DEBUG OBJECTEXTEND

stmt level    source

   1          /********************************************************************
   2                                 VI2C_C51.C
   3            此程序是I2C操作平台(主方式的软件平台)的底层的C子程序,如发送数据
   4          及接收数据,应答位发送,并提供了几个直接面对器件的操作函数,它很方便的
   5          与用户程序连接并扩展.....  
   6            
   7              注意:函数是采用软件延时的方法产生SCL脉冲,固对高晶振频率要作 
   8          一定的修改....
   9          
  10          ********************************************************************/
  11            
  12            
  13                        
  14          #include <reg51.h>          /*头文件的包含*/
  15          #include <intrins.h>
  16          #include "VI2C_C51.h"
  17          
  18          #define  uchar unsigned char /*宏定义*/
  19          #define  uint  unsigned int
  20          
  21          #define  _Nop()  _nop_();_nop_();_nop_()        /*定义空指令*/
  22          
  23          
  24          
  25          /* 常,变量定义区 */
  26           
  27          /*端口位定义*/
  28          sbit SDA=P1^0;            /*模拟I2C数据传送位*/
  29          sbit SCL=P1^1;            /*模拟I2C时钟控制位*/
  30          
  31          /*状态标志*/
  32          bit ack;                 /*应答标志位*/
  33             
  34          
  35          
  36          
  37          
  38          /*******************************************************************
  39                               起动总线函数               
  40          函数原型: void  Start_I2c();  
  41          功能:       启动I2C总线,即发送I2C起始条件.
  42            
  43          ********************************************************************/
  44          void Start_I2c()
  45          {
  46   1        SDA=1;   /*发送起始条件的数据信号*/
  47   1        _Nop();
  48   1        SCL=1;
  49   1        _Nop();    /*起始条件建立时间大于4.7us,延时*/
  50   1        _Nop();
  51   1        _Nop();
  52   1        _Nop();
  53   1        _Nop();    
  54   1        SDA=0;   /*发送起始信号*/
  55   1        _Nop();    /* 起始条件锁定时间大于4μs*/
C51 COMPILER V7.06   VI2C_C51                                                              09/06/2003 16:55:52 PAGE 2   

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

 118   1          
 119   1          _Nop();
 120   1          _Nop();
 121   1          SDA=1;               /*8位发送完后释放数据线,准备接收应答位*/
 122   1          _Nop();
 123   1          _Nop();   
 124   1          SCL=1;
 125   1          _Nop();
 126   1          _Nop();
 127   1          _Nop();
 128   1          if(SDA==1)ack=0;     
 129   1             else ack=1;        /*判断是否接收到应答信号*/
 130   1          SCL=0;
 131   1          _Nop();
 132   1          _Nop();
 133   1      }
 134          
 135          
 136          
 137          
 138          
 139          
 140          /*******************************************************************
 141                           字节数据传送函数               
 142          函数原型: uchar  RcvByte();
 143          功能:  用来接收从器件传来的数据,并判断总线错误(不发应答信号),
 144               发完后请用应答函数。  
 145          ********************************************************************/   
 146          uchar  RcvByte()
 147          {
 148   1        uchar retc;
 149   1        uchar BitCnt;
 150   1        
 151   1        retc=0; 
 152   1        SDA=1;             /*置数据线为输入方式*/
 153   1        for(BitCnt=0;BitCnt<8;BitCnt++)
 154   1            {
 155   2              _Nop();           
 156   2              SCL=0;       /*置时钟线为低,准备接收数据位*/
 157   2              _Nop();
 158   2              _Nop();         /*时钟低电平周期大于4.7μs*/
 159   2              _Nop();
 160   2              _Nop();
 161   2              _Nop();
 162   2              SCL=1;       /*置时钟线为高使数据线上数据有效*/
 163   2              _Nop();
 164   2              _Nop();
 165   2              retc=retc<<1;
 166   2              if(SDA==1)retc=retc+1; /*读数据位,接收的数据位放入retc中 */
 167   2              _Nop();
 168   2              _Nop(); 
 169   2            }
 170   1        SCL=0;    
 171   1        _Nop();
 172   1        _Nop();
 173   1        return(retc);
 174   1      }
 175          
 176          
 177          
 178          
 179          /********************************************************************
C51 COMPILER V7.06   VI2C_C51                                                              09/06/2003 16:55:52 PAGE 4   

 180                               应答子函数
 181          原型:  void Ack_I2c(bit a);
 182           
 183          功能:主控器进行应答信号,(可以是应答或非应答信号)
 184          ********************************************************************/
 185          void Ack_I2c(bit a)
 186          {
 187   1        
 188   1        if(a==0)SDA=0;     /*在此发出应答或非应答信号 */
 189   1              else SDA=1;
 190   1        _Nop();
 191   1        _Nop();
 192   1        _Nop();      
 193   1        SCL=1;
 194   1          _Nop();
 195   1          _Nop();              /*时钟低电平周期大于4μs*/
 196   1          _Nop();
 197   1          _Nop();
 198   1          _Nop();  
 199   1       SCL=0;                /*清时钟线,钳住I2C总线以便继续接收*/
 200   1          _Nop();
 201   1          _Nop();    
 202   1      }
 203          
 204          
 205          
 206          
 207          
 208          
 209          /*******************************************************************
 210                              向无子地址器件发送字节数据函数               

⌨️ 快捷键说明

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