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

📄 vi2c_c51.lst

📁 keil c open
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.06   VI2C_C51                                                              01/06/2005 14:37:28 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE VI2C_C51
OBJECT MODULE PLACED IN F:\存档\HEX\VI2C_C51.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE ..\源文件\VI2C_C51.c LARGE DEBUG OBJECTEXTEND PRINT(.\VI2C_C51.lst) OBJECT(
                    -F:\存档\HEX\VI2C_C51.obj)

stmt level    source

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

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

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

⌨️ 快捷键说明

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