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

📄 i2c.lst

📁 该工程的功能是51单片机模拟i2c器件的工作时序
💻 LST
字号:
C51 COMPILER V7.06   I2C                                                                   12/12/2008 20:59:38 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE I2C
OBJECT MODULE PLACED IN i2c.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE i2c.c BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          #include<string.h>
   2          #include<reg51.h>
   3          #define TIME 4
   4          #define TRUE 1
   5          #define FALSE 0
   6          sbit SCL=P1^2;                          /*定义时钟信号线*/
   7          sbit SDA=P1^1;                          /*定义数据信号线*/
   8          sbit wp=P1^0;
   9          void WriteOneByte(char addr,char d);
  10          char Read_One_Byte(char addr);      
  11          void delay(unsigned int t);    
  12          void main()
  13          {
  14   1          char i;
  15   1              wp=0;    
  16   1              for(i=0;i<10;i++)
  17   1              {
  18   2                WriteOneByte(i,i+1);
  19   2               }
  20   1          while(1)
  21   1              {wp=1;
  22   2               for(i=0;i<10;i++)
  23   2                  {  
  24   3                   P2=Read_One_Byte(i);
  25   3                   delay(50000);
  26   3                       }
  27   2              }
  28   1      }
  29           
  30                  /*延时函数*/
  31          void delay(unsigned int t)
  32          {
  33   1          unsigned int i;
  34   1              for (i=0;i<t;i++);
  35   1      }
  36          
  37                  /*启动I2C总线的函数,当SCL为高电平时使SDA产生一个负跳变*/
  38          void  Start(void)
  39                  {
  40   1              SDA=1;
  41   1              SCL=1;
  42   1              delay(TIME);
  43   1              SDA=0;
  44   1              delay(TIME);
  45   1              SCL=0;
  46   1              delay(TIME);
  47   1              }
  48          
  49                  /*终止I2C总线,当SCL为高电平时使SDA产生一个正跳变*/
  50          void  Stop(void)
  51          {
  52   1              SDA=0;
  53   1              SCL=1;
  54   1              delay(TIME);
  55   1              SDA=1;
C51 COMPILER V7.06   I2C                                                                   12/12/2008 20:59:38 PAGE 2   

  56   1              delay(TIME);
  57   1              SCL=0;
  58   1              delay(TIME);
  59   1      }
  60          
  61                  /*发送完一个字节后检验设备的应答信号*/
  62          bit Check_Ack (void)
  63          {
  64   1              bit q;
  65   1              SDA=1;
  66   1              SCL=1;
  67   1              delay(TIME/2);
  68   1              q=SDA;
  69   1              delay(TIME/2);
  70   1              SCL=0;
  71   1              delay(TIME);
  72   1              if  (q==1)
  73   1                      return(FALSE);
  74   1              else
  75   1                      return(TRUE);
  76   1      }
  77          
  78                  /*发送1,在SCL为高电平时使SDA信号为高*/
  79          void SEND_1 (void)
  80          {
  81   1              SDA=1;
  82   1              SCL=1;
  83   1              delay(TIME);
  84   1              SCL=0;
  85   1              delay(TIME);
  86   1      }
  87          
  88                  /*发送0,在SCL为高电平时使SDA信号为低*/
  89          void SEND_0(void)
  90          {
  91   1              SDA=0;
  92   1              SCL=1;
  93   1              delay(TIME);
  94   1              SCL=0;
  95   1              delay(TIME);
  96   1      }
  97                 
  98                  /*从I2C总线读一个字节*/
  99          char ReadI2CByte(void)  
 100          {
 101   1              bit q;
 102   1              char b=0,i;
 103   1              for (i=0;i<8;i++)
 104   1                      {
 105   2                      SDA=1;                          /*释放总线*/
 106   2                      SCL=1;                          /*接受数据*/
 107   2                      delay(10);
 108   2                      q=SDA;
 109   2                      delay(10);
 110   2                      SCL=0;
 111   2                      if  (q==1)
 112   2                              {
 113   3                              b=b<<1;
 114   3                              b=b|0x01;
 115   3                              }
 116   2                      else
 117   2                              b=b<<1;
C51 COMPILER V7.06   I2C                                                                   12/12/2008 20:59:38 PAGE 3   

 118   2                      }
 119   1              return(b);
 120   1      }
 121          
 122                  /*向I2C总线写一个字节*/ 
 123          void WriteI2CByte(char b)
 124          {
 125   1              char i;
 126   1              for (i=0;i<8;i++)
 127   1                      if ((b<<i)&0x80)
 128   1                              SEND_1();
 129   1                      else
 130   1                              SEND_0();
 131   1      }
 132          
 133                  /**********以下为读写24c02的函数**********/
 134          void WriteOneByte(char addr,char d)                     //单字节写
 135          {
 136   1              bit ack=1;
 137   1              Start();
 138   1              WriteI2CByte(0xa0);
 139   1              ack=Check_Ack();
 140   1              WriteI2CByte(addr);                     //地址
 141   1              ack=Check_Ack();
 142   1              WriteI2CByte(d);                        //数据
 143   1              ack=Check_Ack();
 144   1              Stop();
 145   1      }
 146          char Read_One_Byte(char addr)
 147          {
 148   1              bit ack=1;
 149   1              char mydata;
 150   1              Start();
 151   1              WriteI2CByte(0xa0);
 152   1              ack=Check_Ack();
 153   1              WriteI2CByte(addr);                     /* 地址 */
 154   1              ack=Check_Ack();
 155   1              Start();
 156   1              WriteI2CByte(0xa1);
 157   1              ack=Check_Ack();
 158   1              mydata=ReadI2CByte();
 159   1              ack=Check_Ack();
 160   1              return(mydata);
 161   1              Stop();
 162   1      }
 163          


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


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

⌨️ 快捷键说明

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