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

📄 i2c.lst

📁 遥控器编码的c51程序,包括遥控器编码,I2C操作编程等
💻 LST
📖 第 1 页 / 共 2 页
字号:
  14   1              if(port==I2C0) I2C0SDA=0;
  15   1              if(port==I2C1) I2C1SDA=0;
  16   1      }
  17          
  18          void SETSCL(uchar port)
  19          {
  20   1              if(port==I2C0) I2C0SCL=1;
  21   1              if(port==I2C1) I2C1SCL=1;
  22   1      }
  23          
  24          void CLRSCL(uchar port)
  25          {
  26   1              if(port==I2C0) I2C0SCL=0;
  27   1              if(port==I2C1) I2C1SCL=0;
  28   1      }
  29          /*******************************************************************************************
  30                              启动I2C总线.
  31          *******************************************************************************************/
  32          void Start_I2c(uchar port)
  33          {
  34   1          setSCL;
  35   1                 setSDA;
  36   1               delay(0);
  37   1               clrSDA;
  38   1              delay(0);     
  39   1      }
  40          
  41          /*******************************************************************************************
  42                              结束I2C总线
  43          ********************************************************************************************/
  44          void Stop_I2c(uchar port)
  45          {
  46   1         setSCL;
  47   1                clrSDA;       
  48   1              delay(0);
  49   1              setSDA;
  50   1              delay(0);
C51 COMPILER V7.07   I2C                                                                   07/08/2005 10:08:22 PAGE 5   

  51   1      }
  52          
  53          /*******************************************************************
  54                          发送一个字节
  55          ********************************************************************/
  56          bit SendByte(uchar c, uchar port)
  57          {
  58   1              uchar BitCnt;
  59   1              bit ack;
  60   1       
  61   1              for(BitCnt=0;BitCnt<8;BitCnt++)   /*数据长度为8位*/
  62   1          {
  63   2              clrSCL;
  64   2                          if((c<<BitCnt)&0x80) setSDA;  /*设置数据位*/
  65   2              else  clrSDA;               
  66   2                   delay(0);
  67   2              setSCL;                   /*置时线为高电平,通知接收方读数据*/
  68   2           delay(0);   
  69   2          }
  70   1      
  71   1         clrSCL;
  72   1         setSDA;                               /*8位数据发送完毕,释放数据线,准备接收应答。*/
  73   1         delay(0);
  74   1         setSCL;      
  75   1              if(port==I2C0)
  76   1              {
  77   2              if(I2C0SDA==1) ack=0;     /*检查是否收到了确认信号。ack==0,不确认*/
  78   2              else ack=1;                /* ack==1,确认。*/
  79   2              }
  80   1              if(port==I2C1)
  81   1              {
  82   2              if(I2C1SDA==1) ack=0;      /*检查是否收到了确认信号。ack==0,不确认*/
  83   2              else ack=1;                 /*ack==1,确认。*/
  84   2              }
  85   1              delay(0);
  86   1          clrSCL;
  87   1              clrSDA; 
  88   1              delay(0);
  89   1              if(ack==1) return(1);             /*如果成功写入了数据,返回1*/
  90   1              else return(0);
  91   1      }
  92          
  93          /*******************************************************************
  94                           读一个字节,读完数据要应答
  95          ********************************************************************/   
  96          uchar RcvByte(uchar port)
  97          {
  98   1              uchar retc;
  99   1              uchar BitCnt;
 100   1        
 101   1              retc=0; 
 102   1              for(BitCnt=0;BitCnt<8;BitCnt++)
 103   1              {
 104   2                      clrSCL;       /*准备接收数据*/
 105   2                      setSDA;       /*把数据线输出寄存器设为1,为输入数据作准备。*/
 106   2                        delay(0);
 107   2              setSCL;       /*置时钟线为高是平,使数据线上的数据有效*/
 108   2              retc=retc<<1;
 109   2                        if(port==I2C0)
 110   2                        {
 111   3              if(I2C0SDA==1)retc=retc+1;     /*读数据位 */
 112   3                         }
C51 COMPILER V7.07   I2C                                                                   07/08/2005 10:08:22 PAGE 6   

 113   2                      if(port==I2C1)
 114   2                        {
 115   3              if(I2C1SDA==1)retc=retc+1;      /*读数据位*/
 116   3                        }
 117   2                       delay(0);
 118   2              }
 119   1              return(retc);                        /*返回收到的数据*/
 120   1      }
 121          
 122          /********************************************************************
 123                               应答函数
 124          ********************************************************************/
 125          void Ack_I2c(bit a, uchar port)
 126          {
 127   1              clrSCL;
 128   1              if(a==0)clrSDA;     /*确认信号*/
 129   1              else setSDA;        /*不确认*/  
 130   1              delay(0);    
 131   1              setSCL;
 132   1              delay(0);
 133   1      }
 134          
 135          /********************************************************************************************
 136                               多字节数据写函数               
 137          功能: 通过"port"总线,向器件地址为"sla"的E2PROM从子地址"suba"开始写入"no"个数据,要发送的数据在指钟"s"所指
             -向的地址中。返回值为1表示操作成功。
 138          ********************************************************************************************/
 139          bit WriteStr(uchar sla,uchar suba,uchar *s,uchar no, uchar port)
 140          {
 141   1              uchar i;
 142   1      
 143   1              Start_I2c(port);                             /*I2C Start*/
 144   1              if(SendByte(sla, port)==0) return(0);            /*发送器件地址*/
 145   1              if(SendByte(suba, port)==0) return(0);          /*发送子地址*/
 146   1      
 147   1              for(i=0;i<no;i++)
 148   1              {   
 149   2              if(SendByte(*s, port)==0) return(0);          /*发送数据*/
 150   2              s++;
 151   2              } 
 152   1              Stop_I2c(port);                            /*I2C Stop*/ 
 153   1              return(1);
 154   1      }
 155          
 156          /********************************************************************************************
 157                              多字节数据读函数             
 158          功能: 通过"port"总线,从器件地址为"sla"的E2PROM的子地址"suba"开始读取"no"个数据,读取的数据放在指钟"s"所指
             -向的地址中。返回值为1表示操作成功。
 159          ********************************************************************************************/
 160          bit ReadStr(uchar sla,uchar suba,uchar *s,uchar no, uchar port)
 161          {
 162   1              uchar i;
 163   1      
 164   1              Start_I2c(port);                             /*I2C Start*/
 165   1              if(SendByte(sla, port)==0) return(0);            /*发送器件地址*/
 166   1              if(SendByte(suba,port)==0) return(0);           /*发送子地址*/
 167   1      
 168   1              Start_I2c(port);                             /*ReStart*/
 169   1              if(SendByte(sla+1, port)==0) return(0);
 170   1      
 171   1              for(i=0;i<no-1;i++)
 172   1              {   
C51 COMPILER V7.07   I2C                                                                   07/08/2005 10:08:22 PAGE 7   

 173   2              *s=RcvByte(port);               /*接收最后一位数据*/
 174   2              Ack_I2c(0, port);                /*发送应答位*/  
 175   2              s++;
 176   2              } 
 177   1              *s=RcvByte(port);                /*接收最后一位数据*/
 178   1              Ack_I2c(1, port);                 /*发送应答位*/
 179   1              Stop_I2c(port);                   /*结束总线*/ 
 180   1              return(1);
 181   1      }
 182          
 183          /********************************************************************************************
 184                        延时函数,没有返回值。             
 185          ********************************************************************************************/
 186          void delay(int us)
 187          {
 188   1              int i;
 189   1              for(i=0;i<us;i++) _Nop();
 190   1      }
 191          
 192          bit Wait(uchar sla, uchar port)
 193          {
 194   1              int i;
 195   1              bit ack;
 196   1      
 197   1              i=0;
 198   1              do
 199   1              {
 200   2                      Start_I2c(port);
 201   2                      i++;
 202   2                      if(i>30000) return(0);        /*如果等待时间超过30ms,结束等待,以免死循环*/
 203   2                      ack=SendByte(sla, port);    /*发送器件地址*/
 204   2              } while(!ack);
 205   1              Start_I2c(port);
 206   1              Stop_I2c(port);
 207   1              return(1);
 208   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    634    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----      29
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----       3
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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