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

📄 iic.lst

📁 I2C总线的一个实例,有原理图的设计,和程序的设计,可直接用在项目开发中,节约开发时间,提高效率.
💻 LST
字号:
C51 COMPILER V7.09   IIC                                                                   08/24/2007 09:33:28 PAGE 1   


C51 COMPILER V7.09, COMPILATION OF MODULE IIC
OBJECT MODULE PLACED IN IIC.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE IIC.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include<reg51.h>
   2          #include"IIC.h"
   3          
   4          //短延时函数:ShortDelay()
   5          void nNop(uint i)
   6          {
   7   1              for(;i>0;i--) ;
   8   1              }
   9                  
  10          //长延时函数:LongDelay()
  11          void LongDelay(uint i)
  12          {
  13   1              uint j;
  14   1              for(;i>0;i--)
  15   1                      { for(j=1000;j>0;j--);}
  16   1              }
  17          
  18          //IC起始信号:
  19          void StartIIC(void)
  20          {
  21   1              PinSDA = 1;
  22   1              nNop(20);
  23   1              PinSCL = 1;
  24   1              nNop(20);
  25   1              PinSDA = 0;
  26   1              nNop(20);
  27   1              PinSCL = 0;
  28   1              //nNop(50);
  29   1              }
  30          
  31          //IIC停止信号:
  32          void StopIIC(void)
  33          {
  34   1              PinSDA = 0;
  35   1              nNop(20);
  36   1              PinSCL = 1;
  37   1              nNop(20);
  38   1              PinSDA = 1;
  39   1              nNop(50);
  40   1              }
  41          
  42          //读取从机应答信号函数:
  43          bit GetACK(void)
  44          {
  45   1              bit ack;
  46   1              PinSDA = 1;
  47   1              PinSCL = 1;
  48   1              nNop(50);
  49   1              ack = PinSDA;
  50   1              PinSCL = 0;
  51   1              nNop(50);
  52   1              return(ack);
  53   1              }
  54          
  55          //向IIC总线发出应答信号函数:
C51 COMPILER V7.09   IIC                                                                   08/24/2007 09:33:28 PAGE 2   

  56          void PutACK(bit ack)
  57          {
  58   1              PinSDA = ack;
  59   1              PinSCL = 1;
  60   1              nNop(50);
  61   1              PinSCL = 0;
  62   1              nNop(50);
  63   1              }
  64          
  65          //初始化IIC总线函数:
  66          void InitIIC(void)
  67          {
  68   1              PinSCL = 1;
  69   1              nNop(10);
  70   1              PinSDA = 1;
  71   1              nNop(50);
  72   1              }
  73          
  74          //功能向IIC总线写一字节数据函数:
  75          void IIC_WriteByte(uchar temp)
  76          {
  77   1              uchar i;
  78   1              for(i=0;i<8;i++)
  79   1              {
  80   2                      PinSDA = (bit)(temp & 0x80);
  81   2                      temp = temp << 1;
  82   2                      nNop(20);
  83   2                      PinSCL = 1;
  84   2                      nNop(20);
  85   2                      PinSCL = 0;
  86   2                      //nNop(50);
  87   2                      }
  88   1              }
  89          
  90          //从IIC总线读一字节数据函数:
  91          uchar IIC_ReadByte(void)
  92          {
  93   1              uchar i;
  94   1              uchar temp;
  95   1              PinSDA = 1;
  96   1              for(i=0;i<8;i++)
  97   1              {
  98   2                      temp = temp << 1;
  99   2                      PinSCL = 1;
 100   2                      while(PinSDA) temp++;
 101   2                      PinSCL = 0;
 102   2                      nNop(20);
 103   2                      }
 104   1              return(temp);
 105   1              }
 106          
 107          //向IIC总线上的从机写多字节数据函数:
 108          bit IIC_Puts(uchar SlaveAddr, uchar SubAddr, uint size, uchar *dat)
 109          {
 110   1              uchar i;
 111   1              
 112   1              //确保从机地址最低位是0
 113   1              SlaveAddr &= 0xfe;
 114   1              
 115   1              //启动I2C总线
 116   1              StartIIC();
 117   1              
C51 COMPILER V7.09   IIC                                                                   08/24/2007 09:33:28 PAGE 3   

 118   1              //发送从机地址
 119   1              IIC_WriteByte(SlaveAddr);
 120   1              if ( GetACK() )
 121   1              {
 122   2                      StopIIC();
 123   2                      return 1;
 124   2                      }
 125   1              
 126   1              //发送子地址
 127   1              IIC_WriteByte(SubAddr);
 128   1              if ( GetACK() )
 129   1              {
 130   2                      StopIIC();
 131   2                      return 1;
 132   2                      }
 133   1              
 134   1              //发送数据
 135   1              for(i=0;i<size;i++)
 136   1              {
 137   2                      IIC_WriteByte(*dat++);
 138   2                      if ( GetACK() )
 139   2                      {
 140   3                              StopIIC();
 141   3                              return 1;
 142   3                              }
 143   2                      }
 144   1      
 145   1              //发送完毕,停止I2C总线,返回
 146   1              StopIIC();
 147   1              return 0;
 148   1              }
 149          
 150          //从IIC总线上的从机读多字节数据函数:
 151          bit IIC_Gets(uchar SlaveAddr, uchar SubAddr, uint size, uchar *dat)
 152          {
 153   1              //确保从机地址最低位是0
 154   1              SlaveAddr &= 0xfe;
 155   1              
 156   1              //启动I2C总线
 157   1              StartIIC();
 158   1              
 159   1              //发送从机地址
 160   1              IIC_WriteByte(SlaveAddr);
 161   1              if ( GetACK() )
 162   1              {
 163   2                      StopIIC();
 164   2                      return 1;
 165   2                      }
 166   1              
 167   1              //发送子地址
 168   1              IIC_WriteByte(SubAddr);
 169   1              if ( GetACK() )
 170   1              {
 171   2                      StopIIC();
 172   2                      return 1;
 173   2                      }
 174   1              
 175   1              //发送重复起始条件
 176   1              StartIIC();
 177   1              
 178   1              //发送从机地址
 179   1              SlaveAddr |= 0x01;
C51 COMPILER V7.09   IIC                                                                   08/24/2007 09:33:28 PAGE 4   

 180   1              IIC_WriteByte(SlaveAddr);
 181   1              if ( GetACK() )
 182   1              {
 183   2                      StopIIC();
 184   2                      return 1;
 185   2                      }
 186   1              
 187   1              //接收数据
 188   1              for(;;)
 189   1              {
 190   2                      *dat++ = IIC_ReadByte();
 191   2                      if ( --size == 0 )
 192   2                      {
 193   3                              PutACK(1);
 194   3                              break;
 195   3                              }
 196   2                      PutACK(0);
 197   2                      }
 198   1              
 199   1              //接收完毕,停止I2C总线,返回
 200   1              StopIIC();
 201   1              return 0;
 202   1              }       


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    384    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----      14
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----       2
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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