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

📄 i2c.lst

📁 ZLG7290很好的程序! ZLG7290很好的程序! ZLG7290很好的程序! ZLG7290很好的程序!
💻 LST
字号:
C51 COMPILER V6.23a  I2C                                                                   04/10/2007 16:25:31 PAGE 1   


C51 COMPILER V6.23a, COMPILATION OF MODULE I2C
OBJECT MODULE PLACED IN I2C.OBJ
COMPILER INVOKED BY: e:\mcs51\Keil\C51\BIN\C51.EXE I2C.C BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          /***********************************************************************************
   2          程序名称:标准80C51单片机I/O模拟I2C总线的主机程序
   3          版本信息:Copyright (c) 2006,广州周立功单片机发展有限公司
   4                    All rights reserved.
   5                    本程序仅供学习参考,不提供任何可靠性方面的担保;请勿用于商业目的
   6          ***********************************************************************************/
   7          
   8          
   9          #include "I2C.h"
  10          
  11          /***********************************************************************************
  12          函数:I2C_Delay()
  13          功能:延时,模拟I2C总线专用
  14          ***********************************************************************************/
  15          void I2C_Delay()
  16          {
  17   1              unsigned char t = I2C_DELAY_VALUE;
  18   1              while ( --t != 0 );
  19   1      }
  20          
  21          
  22          /***********************************************************************************
  23          函数:I2C_Init()
  24          功能:I2C总线初始化,使总线处于空闲状态
  25          ***********************************************************************************/
  26          void I2C_Init()
  27          {
  28   1              I2C_SCL = 1;
  29   1              I2C_Delay();
  30   1              I2C_SDA = 1;
  31   1              I2C_Delay();
  32   1      }
  33          
  34          
  35          /***********************************************************************************
  36          函数:I2C_Start()
  37          功能:产生I2C总线的起始条件(Start Condition)
  38          说明:按照I2C总线协议的规定,SCL处于高电平期间,当SDA出现下降沿时启动I2C总线
  39                本函数执行后,I2C总线处于忙状态
  40                本函数也可以用来产生重复起始条件
  41          ***********************************************************************************/
  42          void I2C_Start()
  43          {
  44   1              I2C_SDA = 1;
  45   1              I2C_Delay();
  46   1              I2C_SCL = 1;
  47   1              I2C_Delay();
  48   1              I2C_SDA = 0;
  49   1              I2C_Delay();
  50   1              I2C_SCL = 0;
  51   1              I2C_Delay();
  52   1      }
  53          
  54          
  55          /***********************************************************************************
C51 COMPILER V6.23a  I2C                                                                   04/10/2007 16:25:31 PAGE 2   

  56          函数:I2C_Write()
  57          功能:向I2C总线写1个字节的数据
  58          参数:dat是要写到总线上的数据
  59          ***********************************************************************************/
  60          void I2C_Write(unsigned char dat)
  61          {
  62   1              unsigned char t = 8;
  63   1              do
  64   1              {
  65   2                      I2C_SDA = (bit)(dat & 0x80);
  66   2                      dat <<= 1;
  67   2                      I2C_SCL = 1;
  68   2                      I2C_Delay();
  69   2                      I2C_SCL = 0;
  70   2                      I2C_Delay();
  71   2              } while ( --t != 0 );
  72   1      }
  73          
  74          
  75          /***********************************************************************************
  76          函数:I2C_Read()
  77          功能:从从机读取1个字节的数据
  78          返回:读取的1个字节数据
  79          ***********************************************************************************/
  80          unsigned char I2C_Read()
  81          {
  82   1              unsigned char dat;
  83   1              unsigned char t = 8;
  84   1              I2C_SDA = 1;    //在读取数据之前,先要把SDA拉高
  85   1              do
  86   1              {
  87   2                      I2C_SCL = 1;
  88   2                      I2C_Delay();
  89   2                      dat <<= 1;
  90   2                      if ( I2C_SDA ) dat |= 0x01;
  91   2                      I2C_SCL = 0;
  92   2                      I2C_Delay();
  93   2              } while ( --t != 0 );
  94   1              return dat;
  95   1      }
  96          
  97          
  98          /***********************************************************************************
  99          函数:I2C_GetAck()
 100          功能:读取从机应答位
 101          返回:0-从机应答
 102                1-从机非应答
 103          说明:从机在收到每一个字节的数据后,要产生应答位
 104                从机在收到最后一个字节的数据后,一般要产生非应答位
 105          ***********************************************************************************/
 106          bit I2C_GetAck()
 107          {
 108   1              bit ack;
 109   1              I2C_SDA = 1;
 110   1              I2C_Delay();
 111   1              I2C_SCL = 1;
 112   1              I2C_Delay();
 113   1              ack = I2C_SDA;
 114   1              I2C_SCL = 0;
 115   1              I2C_Delay();
 116   1              return ack;
 117   1      }
C51 COMPILER V6.23a  I2C                                                                   04/10/2007 16:25:31 PAGE 3   

 118          
 119          
 120          /***********************************************************************************
 121          函数:I2C_PutAck()
 122          功能:主机产生应答位或非应答位
 123          参数:ack=0,主机产生应答位
 124                ack=1,主机产生非应答位
 125          说明:主机在接收完每一个字节的数据后,都应当产生应答位
 126                主机在接收完最后一个字节的数据后,应当产生非应答位
 127          ***********************************************************************************/
 128          void I2C_PutAck(bit ack)
 129          {
 130   1              I2C_SDA = ack;
 131   1              I2C_Delay();
 132   1              I2C_SCL = 1;
 133   1              I2C_Delay();
 134   1              I2C_SCL = 0;
 135   1              I2C_Delay();
 136   1      }
 137          
 138          
 139          /***********************************************************************************
 140          函数:I2C_Stop()
 141          功能:产生I2C总线的停止状态
 142          说明:按照I2C总线协议的规定,SCL处于高电平期间,当SDA出现上升沿时停止I2C总线
 143                本函数执行后,I2C总线处于空闲状态
 144          ***********************************************************************************/
 145          void I2C_Stop()
 146          {
 147   1              unsigned int t = I2C_STOP_WAIT_VALUE;
 148   1              I2C_SDA = 0;
 149   1              I2C_Delay();
 150   1              I2C_SCL = 1;
 151   1              I2C_Delay();
 152   1              I2C_SDA = 1;
 153   1              I2C_Delay();
 154   1              while ( --t != 0 );             //视具体情况,在下一次产生Start之前加一定的延时
 155   1      }
 156          
 157          
 158          /***********************************************************************************
 159          函数:I2C_Puts()
 160          功能:主机通过I2C总线向从机发送多个字节的数据
 161          参数:SlaveAddr:从机地址(高7位是从机地址,最低位是写标志0)
 162                SubAddr:从机的子地址
 163                Size:数据的字节数
 164                *dat:要发送的数据
 165          返回:0:发送成功
 166                1:在发送过程中出现异常
 167          ***********************************************************************************/
 168          bit I2C_Puts(unsigned char SlaveAddr, unsigned char SubAddr, unsigned char Size, char *dat)
 169          {
 170   1      //检查长度
 171   1              if ( Size == 0 ) return 0;
 172   1      //确保从机地址最低位是0
 173   1              SlaveAddr &= 0xFE;
 174   1      //启动I2C总线
 175   1              I2C_Start();
 176   1      //发送从机地址
 177   1              I2C_Write(SlaveAddr);
 178   1              if ( I2C_GetAck() )
 179   1              {
C51 COMPILER V6.23a  I2C                                                                   04/10/2007 16:25:31 PAGE 4   

 180   2                      I2C_Stop();
 181   2                      return 1;
 182   2              }
 183   1      //发送子地址
 184   1              I2C_Write(SubAddr);
 185   1              if ( I2C_GetAck() )
 186   1              {
 187   2                      I2C_Stop();
 188   2                      return 1;
 189   2              }
 190   1      //发送数据
 191   1              do
 192   1              {
 193   2                      I2C_Write(*dat++);
 194   2                      if ( I2C_GetAck() )
 195   2                      {
 196   3                              I2C_Stop();
 197   3                              return 1;
 198   3                      }
 199   2              } while ( --Size != 0 );
 200   1      //发送完毕,停止I2C总线,并返回结果
 201   1              I2C_Stop();
 202   1              return 0;
 203   1      }
 204          
 205          /*
 206          函数:I2C_Gets()
 207          功能:主机通过I2C总线从从机接收多个字节的数据
 208          参数:
 209                  SlaveAddr:从机地址(高7位是从机地址,最低位是读标志1)
 210                  SubAddr:从机的子地址
 211                  Size:数据的字节数
 212                  *dat:保存接收到的数据
 213          返回:
 214                  0:接收成功
 215                  1:在接收过程中出现异常
 216          */
 217          bit I2C_Gets(unsigned char SlaveAddr, unsigned char SubAddr, unsigned char Size, char *dat)
 218          {
 219   1      //检查长度
 220   1              if ( Size == 0 ) return 0;
 221   1      //确保从机地址最低位是0
 222   1              SlaveAddr &= 0xFE;      //确保最低位是0
 223   1      //启动I2C总线
 224   1              I2C_Start();
 225   1      //发送从机地址
 226   1              I2C_Write(SlaveAddr);
 227   1              if ( I2C_GetAck() )
 228   1              {
 229   2                      I2C_Stop();
 230   2                      return 1;
 231   2              }
 232   1      //发送子地址
 233   1              I2C_Write(SubAddr);
 234   1              if ( I2C_GetAck() )
 235   1              {
 236   2                      I2C_Stop();
 237   2                      return 1;
 238   2              }
 239   1      //发送重复起始条件
 240   1              I2C_Start();
 241   1      //发送从机地址
C51 COMPILER V6.23a  I2C                                                                   04/10/2007 16:25:31 PAGE 5   

 242   1              SlaveAddr |= 0x01;
 243   1              I2C_Write(SlaveAddr);
 244   1              if ( I2C_GetAck() )
 245   1              {
 246   2                      I2C_Stop();
 247   2                      return 1;
 248   2              }
 249   1      //接收数据
 250   1              for (;;)
 251   1              {
 252   2                      *dat++ = I2C_Read();
 253   2                      if ( --Size == 0 )
 254   2                      {
 255   3                              I2C_PutAck(1);
 256   3                              break;
 257   3                      }
 258   2                      I2C_PutAck(0);
 259   2              }
 260   1      //接收完毕,停止I2C总线,并返回结果
 261   1              I2C_Stop();
 262   1              return 0;
 263   1      }
 264          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    313    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----      12
   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 + -