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

📄 i2c_c51.lst

📁 用单片机实现的CAN总线通讯程序
💻 LST
字号:
C51 COMPILER V7.06   I2C_C51                                                               05/09/2005 09:55:25 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE I2C_C51
OBJECT MODULE PLACED IN I2C_C51.OBJ
COMPILER INVOKED BY: e:\Keil\C51\BIN\C51.EXE I2C_C51.c BROWSE INCDIR(C:\Keil\C51\INC\) DEBUG OBJECTEXTEND

stmt level    source

   1          /************************************************************************/
   2          /*      天煌科技实业有限公司       http://www.Teamkit.com               */
   3          /************************************************************************/
   4          /************************************************************************/
   5          /*                                                                      */
   6          /*文件名: I2C_C51.C                                                    */
   7          /*创建人:晁洪超                                                        */
   8          /*创建日期:2004.3.28                                                   */
   9          /*修改日期:                                                            */
  10          /*功 能:  实现I2C数据总线的数据的发送和接收                            */
  11          /*包含的函数说明:                                                      */
  12          /*      bit ISendByte(uchar sla,uchar c) 无子地址器件写单字节数据       */
  13          /*      bit IRcvByte(uchar sla,uchar *c) 无子地址器件读单字节数据       */
  14          /*      bit ISendStr(uchar sla,uchar suba,uchar *s,uchar no)有子地址器件*/
  15          /*                       读取no个字节数据                               */
  16          /*      bit IRcvStr(uchar sla,uchar suba,uchar *s,uchar no)有子地址器件 */
  17          /*                       写入no个字节数据                               */
  18          /*版本号:1.0
  19          /************************************************************************/
  20            
  21                        
  22          #include <reg52.h>          /*头文件的包含*/
  23          #include <intrins.h>
  24          
  25          #define  uchar unsigned char /*宏定义*/
  26          #define  uint  unsigned int
  27          
  28          #define  _Nop()  _nop_()        /*定义空指令*/
  29          
  30          /* 常,变量定义区 */
  31           
  32                                                           /*端口位定义*/
  33          sbit SDA=P1^7;            /*模拟I2C数据传送位*/
  34          sbit SCL=P1^6;            /*模拟I2C时钟控制位*/
  35          
  36                                                           /*状态标志*/
  37          bit ack;                 /*应答标志位*/
  38             
  39          
  40          
  41          
  42          
  43          
  44          /**************************************************************************/
  45          /*函数名称:void Start_I2c()                                              */
  46          /*功能描述:启动I2C总线,发送了I2C起始条件, SCL为高电平时SDA由高变为低    */
  47          /*输入:无                                                                */
  48          /*输出:无                                                                */
  49          /*创建日期:2004.3.28                                                     */
  50          /*修改日期:                                                              */
  51          /**************************************************************************/
  52          
  53          void Start_I2c()
  54          {
  55   1        SDA=1;   /*发送起始条件的数据信号*/
C51 COMPILER V7.06   I2C_C51                                                               05/09/2005 09:55:25 PAGE 2   

  56   1        _Nop();
  57   1        SCL=1;
  58   1        _Nop();    /*起始条件建立时间大于4.7us,延时*/
  59   1        _Nop();
  60   1        _Nop();
  61   1        _Nop();
  62   1        _Nop();    
  63   1        SDA=0;   /*发送起始信号*/
  64   1        _Nop();    /* 起始条件锁定时间大于4μs*/
  65   1        _Nop();
  66   1        _Nop();
  67   1        _Nop();
  68   1        _Nop();       
  69   1        SCL=0;   /*钳住I2C总线,准备发送或接收数据 */
  70   1        _Nop();
  71   1        _Nop();
  72   1      }
  73          
  74          
  75          
  76          
  77          /**************************************************************************/
  78          /*函数名称:void Stop_I2c()                                               */
  79          /*功能描述:结束I2C总线,发送了I2C结束条件,SCL为高电平时SDA由低变为高    */
  80          /*输入:无                                                                */
  81          /*输出:无                                                                */
  82          /*创建日期:2004.3.28                                                     */
  83          /*修改日期:                                                              */
  84          /**************************************************************************/
  85          
  86          void Stop_I2c()
  87          {
  88   1        SDA=0;  /*发送结束条件的数据信号*/
  89   1        _Nop();   /*发送结束条件的时钟信号*/
  90   1        SCL=1;  /*结束条件建立时间大于4μs*/
  91   1        _Nop();
  92   1        _Nop();
  93   1        _Nop();
  94   1        _Nop();
  95   1        _Nop();
  96   1        SDA=1;  /*发送I2C总线结束信号*/
  97   1        _Nop();
  98   1        _Nop();
  99   1        _Nop();
 100   1        _Nop();
 101   1      }
 102          
 103          
 104          
 105          
 106          /**************************************************************************/
 107          /*函数名称:void SendByte(uchar c)                                        */
 108          /*功能描述:字节数据传送函,将数据C发送出,发送完成后等待应答,           */
 109          /*          并对状态位进行操作(不应答或非应答信号时使ACK=0,正常数         */
 110          /*           据时使ACK=1).                                                */
 111          /*输入:c                                                                 */
 112          /*返回:ack=1送出成功,ack=0送出失败                                      */
 113          /*创建日期:2004.3.28                                                     */
 114          /*修改日期:                                                              */
 115          /**************************************************************************/
 116          
 117          void  SendByte(uchar c)
C51 COMPILER V7.06   I2C_C51                                                               05/09/2005 09:55:25 PAGE 3   

 118          {
 119   1       uchar BitCnt;
 120   1       
 121   1       for(BitCnt=0;BitCnt<8;BitCnt++)  /*要传送的数据长度为8位*/
 122   1          {
 123   2           if((c<<BitCnt)&0x80)SDA=1;   /*判断发送位*/
 124   2             else  SDA=0;                
 125   2           _Nop();
 126   2           SCL=1;               /*置时钟线为高,通知被控器开始接收数据位*/
 127   2            _Nop(); 
 128   2            _Nop();               /*保证时钟高电平周期大于4μs*/
 129   2            _Nop();
 130   2            _Nop();
 131   2            _Nop();         
 132   2           SCL=0; 
 133   2          }
 134   1          
 135   1          _Nop();
 136   1          _Nop();
 137   1          SDA=1;               /*8位发送完后释放数据线,准备接收应答位*/
 138   1          _Nop();
 139   1          _Nop();   
 140   1          SCL=1;
 141   1          _Nop();
 142   1          _Nop();
 143   1          _Nop();
 144   1          if(SDA==1)ack=0;     
 145   1             else ack=1;        /*判断是否接收到应答信号*/
 146   1          SCL=0;
 147   1          _Nop();
 148   1          _Nop();
 149   1      }
 150          
 151          
 152          /**************************************************************************/
 153          /*函数名称:uchar RcvByte()                                               */
 154          /*功能描述:字节数据传送函数,用来接收从器件传来的数据,并判断总线的      */
 155          /*          错误(不发送应答信号)发送完调用应答函数。                      */
 156          /*输入:无                                                                */
 157          /*返回:retc                                                              */
 158          /*创建日期:2004.3.28                                                     */
 159          /*修改日期:                                                              */
 160          /**************************************************************************/
 161          uchar  RcvByte()
 162          {
 163   1        uchar retc;
 164   1        uchar BitCnt;
 165   1        
 166   1        retc=0; 
 167   1        SDA=1;             /*置数据线为输入方式*/
 168   1        for(BitCnt=0;BitCnt<8;BitCnt++)
 169   1            {
 170   2              _Nop();           
 171   2              SCL=0;       /*置时钟线为低,准备接收数据位*/
 172   2              _Nop();
 173   2              _Nop();         /*时钟低电平周期大于4.7μs*/
 174   2              _Nop();
 175   2              _Nop();
 176   2              _Nop();
 177   2              SCL=1;       /*置时钟线为高使数据线上数据有效*/
 178   2              _Nop();
 179   2              _Nop();
C51 COMPILER V7.06   I2C_C51                                                               05/09/2005 09:55:25 PAGE 4   

 180   2              retc=retc<<1;
 181   2              if(SDA==1)retc=retc+1; /*读数据位,接收的数据位放入retc中 */
 182   2              _Nop();
 183   2              _Nop(); 
 184   2            }
 185   1        SCL=0;    
 186   1        _Nop();
 187   1        _Nop();
 188   1        return(retc);
 189   1      }
 190          
 191          
 192          
 193          
 194          /**************************************************************************/
 195          /*函数名称:void Ack_I2c()                                                */
 196          /*功能描述:主控器进行应答信号                                            */
 197          /*输入:a                                                                  */
 198          /*输出:无                                                                */
 199          /*创建日期:2004.3.28                                                     */
 200          /*修改日期:                                                              */
 201          /**************************************************************************/
 202          void Ack_I2c(bit a)
 203          {
 204   1        
 205   1        if(a==0)SDA=0;     /*在此发出应答或非应答信号 */
 206   1              else SDA=1;
 207   1        _Nop();
 208   1        _Nop();
 209   1        _Nop();      
 210   1        SCL=1;
 211   1          _Nop();
 212   1          _Nop();              /*时钟低电平周期大于4μs*/
 213   1          _Nop();
 214   1          _Nop();
 215   1          _Nop();  
 216   1       SCL=0;                /*清时钟线,钳住I2C总线以便继续接收*/
 217   1          _Nop();
 218   1          _Nop();    
 219   1      }
 220          
 221          
 222          /**************************************************************************/
 223          /*函数名称:bit IRcvStr(uchar sla,uchar suba,uchar *s,uchar no)           */
 224          /*功能描述:向有子地址的IIC器件读取多字节数据函数                         */
 225          /*          从启动总线到发送地址、子地址、结束总线的全过程                */
 226          /*调用函数:Start_I2C SendByte() RcvByte() Ack_I2C() Stop_I2c()           */
 227          /*输入:sla从器件地址、s为读到的数据                                      */
 228          /*返回:1成功 0操作有误                                                   */
 229          /*创建日期:2004.3.28                                                     */
 230          /*修改日期:                                                              */
 231          /**************************************************************************/
 232          
 233          bit IRcvStr(uchar sla,uchar suba,uchar *s,uchar no)
 234          {
 235   1         uchar i;
 236   1      
 237   1         Start_I2c();               /*启动总线*/
 238   1         SendByte(sla);            /*发送器件地址*/
 239   1           if(ack==0)return(0);
 240   1         SendByte(suba);            /*发送器件子地址*/
 241   1           if(ack==0)return(0);
C51 COMPILER V7.06   I2C_C51                                                               05/09/2005 09:55:25 PAGE 5   

 242   1      
 243   1         Start_I2c();
 244   1         SendByte(sla+1);
 245   1            if(ack==0)return(0);
 246   1      
 247   1         for(i=0;i<no-1;i++)
 248   1          {   
 249   2           *s=RcvByte();               /*发送数据*/
 250   2            Ack_I2c(0);                /*发送就答位*/  
 251   2           s++;
 252   2          } 
 253   1         *s=RcvByte();
 254   1          Ack_I2c(1);                 /*发送非应位*/
 255   1       Stop_I2c();                    /*结束总线*/ 
 256   1        return(1);
 257   1      }
 258          
 259          
 260          
 261          
 262          
 263          
 264                                  /*    完毕      */
 265          
 266          
 267          
 268          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    246    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----       6
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      1       1
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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