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

📄 i2c.lst

📁 单片机控制电机程序
💻 LST
字号:
C51 COMPILER V8.08   I2C                                                                   03/18/2009 21:19:05 PAGE 1   


C51 COMPILER V8.08, COMPILATION OF MODULE I2C
OBJECT MODULE PLACED IN i2c.OBJ
COMPILER INVOKED BY: D:\keil\C51\BIN\C51.EXE i2c.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include<ADuC841.h>
   2          
   3          #define I2C_SCL         MCO                     //ADUC831的I2CCON寄存器中的1位,时钟位
   4          #define I2C_SDA_O       MDO                     //ADUC831的I2CCON寄存器中的1位,数据输出
   5          #define I2C_SDA_I       MDI                     //ADUC831的I2CCON寄存器中的1位,数据输入
   6          #define IO_ENABLE       MDE                     //ADUC831的I2CCON寄存器中的1位,数据输入/输出的使能
   7          #define ZLGWR           0x70                    //ZLG7290的写地址
   8          #define ZLGRD           0x71                    //ZLG7290的读地址 
   9          
  10          /**********************************************************
  11          I2C时序的延时程序
  12          适用于aduc848,系统时钟为12.582912MHz时,for循环30次以上
  13          ***********************************************************/
  14          static void I2C_Delay()
  15          {
  16   1              char i;
  17   1              for(i=0;i<50;i++);
  18   1      }        
  19          
  20          /***********************************************************
  21          函数:I2C_Start()
  22          功能:产生I2C 总线的起始状态
  23          说明:
  24          SCL处于高电平期间,当SDA 出现下降沿时启动I2C 总线
  25          不论SDA 和SCL 处于什么电平状态,本函数总能正确产生起始状态
  26          本函数也可以用来产生重复起始状态
  27          本函数执行后,I2C 总线处于忙状态
  28          ***********************************************************/
  29          static void I2C_Start()
  30          {
  31   1              IO_ENABLE=1;
  32   1              I2C_SDA_O = 1;
  33   1              I2C_Delay();
  34   1              I2C_SCL = 1;
  35   1              I2C_Delay();
  36   1              I2C_SDA_O = 0;
  37   1              I2C_Delay();
  38   1              I2C_SCL = 0;
  39   1              I2C_Delay();
  40   1      } 
  41          
  42          /***********************************************************
  43          函数:I2C_Write()
  44          功能:向I2C 总线写1 个字节的数据
  45          参数:
  46          dat:要写到总线上的数据
  47          ***********************************************************/
  48          static void I2C_Write(char dat)
  49          {
  50   1              unsigned char t = 8;
  51   1              IO_ENABLE=1;
  52   1              do
  53   1              {
  54   2                      I2C_SDA_O = (bit)(dat & 0x80);
  55   2                      dat <<= 1;
C51 COMPILER V8.08   I2C                                                                   03/18/2009 21:19:05 PAGE 2   

  56   2                      I2C_SCL = 1;
  57   2                      I2C_Delay();
  58   2                      I2C_SCL = 0;
  59   2                      I2C_Delay();
  60   2              } while ( --t != 0 );
  61   1      } 
  62          
  63          /***********************************************************
  64          函数:I2C_Read()
  65          功能:从从机读取1 个字节的数据
  66          返回:读取的一个字节数据
  67          ***********************************************************/
  68          static int I2C_Read()
  69          {
  70   1              int dat=0;
  71   1              unsigned char t = 8;
  72   1              do
  73   1              {
  74   2                      I2C_SCL = 0;
  75   2                      I2C_Delay();
  76   2                      I2C_SCL = 1;
  77   2                      I2C_Delay();
  78   2                      dat <<= 1;
  79   2                      IO_ENABLE=0;
  80   2                      if ( I2C_SDA_I ) dat |= 0x01;
  81   2                      I2C_SCL = 0;
  82   2                      I2C_Delay();
  83   2              } while ( --t != 0 );
  84   1              return dat;
  85   1      }
  86          
  87          
  88          /***********************************************************
  89          函数:I2C_GetAck()
  90          功能:读取从机应答位
  91          返回:
  92          0:从机应答
  93          1:从机非应答
  94          说明:
  95          从机在收到每个字节的数据后,要产生应答位
  96          从机在收到最后1 个字节的数据后,一般要产生非应答位
  97          ***********************************************************/
  98          static bit I2C_GetAck()
  99          {
 100   1              bit ack;
 101   1              IO_ENABLE=1;
 102   1              I2C_SDA_O = 1;
 103   1              I2C_Delay();
 104   1              I2C_SCL = 1;
 105   1              I2C_Delay();
 106   1              IO_ENABLE=0;
 107   1              ack = I2C_SDA_I;
 108   1              I2C_SCL = 0;
 109   1              I2C_Delay();
 110   1              return ack;
 111   1      }        
 112          
 113          /********************************************************
 114          函数:I2C_PutAck()
 115          功能:主机产生应答位或非应答位
 116          参数:
 117          ack=0:主机产生应答位
C51 COMPILER V8.08   I2C                                                                   03/18/2009 21:19:05 PAGE 3   

 118          ack=1:主机产生非应答位
 119          说明:
 120          主机在接收完每一个字节的数据后,都应当产生应答位
 121          主机在接收完最后一个字节的数据后,应当产生非应答位
 122          *********************************************************/
 123          static void I2C_PutAck(bit ack)
 124          {
 125   1              IO_ENABLE=1;
 126   1              I2C_SDA_O = ack;
 127   1              I2C_Delay();
 128   1              I2C_SCL = 1;
 129   1              I2C_Delay();
 130   1              I2C_SCL = 0;
 131   1              I2C_Delay();
 132   1      }       
 133          
 134          /***********************************************************
 135          函数:I2C_Stop()
 136          功能:产生I2C 总线的停止状态
 137          说明:
 138          SCL处于高电平期间,当SDA 出现上升沿时停止I2C 总线
 139          不论SDA 和SCL 处于什么电平状态,本函数总能正确产生停止状态
 140          本函数执行后,I2C 总线处于空闲状态
 141          ***********************************************************/
 142          static void I2C_Stop()
 143          {
 144   1              unsigned char t = 10;
 145   1              IO_ENABLE=1;
 146   1              I2C_SDA_O = 0;
 147   1              I2C_Delay();
 148   1              I2C_SCL = 1;
 149   1              I2C_Delay();
 150   1              I2C_SDA_O= 1;
 151   1              I2C_Delay();
 152   1              while ( --t != 0 ); //在下一次产生Start 之前,要加一定的延时
 153   1      }  
 154          
 155          /***********************************************************
 156          功能:将I2C总线置于空闲状态,即将时钟线和数据线都拉高
 157          ***********************************************************/
 158          static void idle()
 159          {
 160   1         I2C_SCL=1;
 161   1         IO_ENABLE=1;
 162   1         I2C_SDA_O=1;
 163   1         IO_ENABLE=0;
 164   1      }
 165          
 166          
 167          /**********************************************************
 168          函数:I2C_Init()
 169          功能:I2C 总线初始化,使总线处于空闲状态
 170          说明:在main()函数的开始处,通常应当要执行一次本函数
 171          ***********************************************************/
 172          void I2C_Init()
 173          {
 174   1              IO_ENABLE=1;                            //使能为1,则为输出;为0,则为输入
 175   1              I2C_SCL = 1;
 176   1              I2C_Delay();
 177   1              I2C_SDA_O = 1;
 178   1              I2C_Delay();
 179   1      }
C51 COMPILER V8.08   I2C                                                                   03/18/2009 21:19:05 PAGE 4   

 180          
 181          /***********************************************************
 182          函数:I2C_Puts()
 183          功能:I2C 总线综合发送函数,向从机发送多个字节的数据
 184          参数:
 185          SlaveAddr:从机地址(7 位纯地址,不含读写位)
 186          SubAddr:从机的子地址
 187          SubMod:子地址模式,0-无子地址,1-单字节子地址,2-双字节子地址
 188          *dat:要发送的数据
 189          Size:数据的字节数
 190          返回:
 191          0:发送成功
 192          1:在发送过程中出现异常
 193          说明:
 194          本函数能够很好地适应所有常见的I2C 器件,不论其是否有子地址
 195          当从机没有子地址时,参数SubAddr 任意,而SubMod 应当为0
 196          ***********************************************************/
 197          bit I2C_Puts(unsigned char SlaveAddr,unsigned int SubAddr,unsigned char SubMod,char *dat,unsigned int Size
             -)
 198          {
 199   1              unsigned char i;                        //定义临时变量
 200   1              char a[3];
 201   1              if ( Size == 0 ) return 0;      //检查长度
 202   1              a[0] = (SlaveAddr << 1);        //准备从机地址
 203   1              if ( SubMod > 2 ) SubMod = 2;   //检查子地址模式
 204   1              switch ( SubMod )               //确定子地址
 205   1              {
 206   2                      case 0:break;
 207   2                      case 1:a[1] = (char)(SubAddr);break;
 208   2                      case 2:a[1] = (char)(SubAddr >> 8);a[2] = (char)(SubAddr);break;
 209   2                      default:break;
 210   2              }
 211   1              a[1] = (char)(SubAddr);
 212   1              SubMod++;                               //发送从机地址,接着发送子地址
 213   1              I2C_Start();
 214   1              for ( i=0; i<SubMod; i++ )
 215   1              {
 216   2                      I2C_Write(a[i]);
 217   2                      if ( I2C_GetAck() )
 218   2                      {
 219   3                              I2C_Stop();idle();
 220   3                              return 1;
 221   3                      }
 222   2              }
 223   1              do                              //发送数据
 224   1              {
 225   2                      I2C_Write(*dat++);
 226   2                      if ( I2C_GetAck() ) break;
 227   2              } while ( --Size != 0 );
 228   1              I2C_Stop();  idle();            //发送完毕,停止I2C 总线,并返回结果
 229   1              if ( Size == 0 ) return 0;
 230   1              else return 1;
 231   1      }
 232          
 233          /***********************************************************
 234          函数:I2C_Gets()
 235          功能:I2C 总线综合接收函数,接收多个字节的数据
 236          参数:
 237          SubAddr:从机的子地址
 238          ***********************************************************/
 239          int I2C_gets(unsigned char subaddr)
 240          {
C51 COMPILER V8.08   I2C                                                                   03/18/2009 21:19:05 PAGE 5   

 241   1              int i,dat;
 242   1              I2C_Start();
 243   1              I2C_Write(ZLGWR);
 244   1              I2C_GetAck();
 245   1              I2C_Write(subaddr);
 246   1              I2C_SCL=1;
 247   1              for(i=0;i<2;i++){;}
 248   1              I2C_SCL=0;
 249   1              I2C_Stop();
 250   1              for(i=0;i<5;i++){;}
 251   1              I2C_Start();
 252   1              I2C_Write(ZLGRD);
 253   1              I2C_GetAck();
 254   1              dat=I2C_Read();
 255   1              I2C_PutAck(1);
 256   1              I2C_Stop();
 257   1              idle();
 258   1              return dat;
 259   1      }
 260          
 261          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    372    ----
   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 + -