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

📄 zlg_i2c.lst

📁 使用单片机模拟I2C时序对24c02进行读写,通过proteus仿真对数据进行分析. 有仿真图片
💻 LST
📖 第 1 页 / 共 2 页
字号:
 155          
 156          
 157          
 158          
 159          /********************************************************************
 160                               应答子函数
 161          函数原型:  void ack_i2c(bit a);
 162          功能:      主控器进行应答信号,(可以是应答或非应答信号)
 163          
 164          ********************************************************************/
 165          void ack_i2c(bit a)
 166          {
 167   1        
 168   1              if(a==0)        SDA=0;          /*在此发出应答或非应答信号 */
 169   1          else                SDA=1;
 170   1              _Nop();
 171   1              _Nop();
 172   1              _Nop();      
 173   1              SCL=1;
 174   1          _Nop();
 175   1          _Nop();                     /*时钟低电平周期大于4μs*/
 176   1          _Nop();
 177   1          _Nop();
 178   1          _Nop();  
C51 COMPILER V8.02   ZLG_I2C                                                               11/30/2007 14:28:45 PAGE 4   

 179   1              SCL=0;                  /*清时钟线,钳住I2C总线以便继续接收*/
 180   1          _Nop();
 181   1          _Nop();    
 182   1      }
 183          
 184          
 185          
 186          
 187          
 188          
 189          /*******************************************************************
 190                              向无子地址器件发送字节数据函数               
 191          函数原型: bit send_data(uchar sla,uchar c);  
 192          功能:     从启动总线到发送地址,数据,结束总线的全过程,从器件地址sla.
 193                    如果返回1表示操作成功,否则操作有误。
 194          注意:    使用前必须已结束总线。
 195          ********************************************************************/
 196          bit send_data(uchar sla,uchar c)
 197          {
 198   1              start_i2c();                    /*启动总线*/
 199   1              send_byte(sla);                 /*发送器件地址*/
 200   1          if(ack==0)  
 201   1              return(0);
 202   1              send_byte(c);               /*发送数据*/
 203   1          if(ack==0)  
 204   1              return(0);
 205   1              stop_i2c();                 /*结束总线*/ 
 206   1              return(1);
 207   1      }
 208          
 209          
 210          
 211          
 212          /*******************************************************************
 213                              向有子地址器件发送多字节数据函数               
 214          函数原型: bit send_string(uchar sla,uchar suba,uchar *s,uchar num);  
 215          功能:     从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件
 216                    地址sla,子地址suba,发送内容是s指向的内容,发送num个字节。
 217                     如果返回1表示操作成功,否则操作有误。
 218          注意:    使用前必须已结束总线。
 219          ********************************************************************/
 220          bit send_string(uchar sla,uchar suba,uchar *s,uchar num)
 221          {
 222   1              uchar i;
 223   1              start_i2c();                    /*启动总线*/
 224   1              send_byte(sla);                 /*发送器件地址*/
 225   1          if(ack==0)  
 226   1              return(0);
 227   1              send_byte(suba);            /*发送器件子地址*/
 228   1          if(ack==0)  
 229   1              return(0);
 230   1              for(i=0;i<num;i++)
 231   1          {   
 232   2              send_byte(*s);          /*发送数据*/
 233   2              if(ack==0)      
 234   2                      return(0);
 235   2              s++;
 236   2          } 
 237   1              stop_i2c();                 /*结束总线*/ 
 238   1              return(1);
 239   1      }
 240          
C51 COMPILER V8.02   ZLG_I2C                                                               11/30/2007 14:28:45 PAGE 5   

 241          
 242          
 243          
 244          
 245          
 246          /*******************************************************************
 247                              向无子地址器件读字节数据函数               
 248          函数原型: bit  IRcvByte(uchar sla,ucahr *c);  
 249          功能:     从启动总线到发送地址,读数据,结束总线的全过程,从器件地
 250                    址sla,返回值在c.
 251                    如果返回1表示操作成功,否则操作有误。
 252          注意:    使用前必须已结束总线。
 253          ********************************************************************/
 254          bit receive_data(uchar sla,uchar *c)
 255          {
 256   1              start_i2c();                /*启动总线*/
 257   1              send_byte(sla+1);           /*发送器件地址*/
 258   1          if(ack==0)  
 259   1              return(0);
 260   1              *c=receive_byte();              /*读取数据*/
 261   1          ack_i2c(1);                 /*发送非就答位*/
 262   1              stop_i2c();                 /*结束总线*/ 
 263   1              return(1);
 264   1      }
 265          
 266          
 267          
 268          /*******************************************************************
 269                              向有子地址器件读取多字节数据函数               
 270          函数原型: bit receive_string(uchar sla,uchar suba,uchar *s,uchar num);  
 271          功能:     从启动总线到发送地址,子地址,读数据,结束总线的全过程,从器件
 272                    地址sla,子地址suba,读出的内容放入s指向的存储区,读num个字节。
 273                    如果返回1表示操作成功,否则操作有误。
 274          注意:    使用前必须已结束总线。
 275          ********************************************************************/
 276          bit receive_string(uchar sla,uchar suba,uchar *s,uchar num)
 277          {
 278   1              uchar i;
 279   1              start_i2c();                    /*启动总线*/
 280   1              send_byte(sla);                 /*发送器件地址*/
 281   1          if(ack==0)  
 282   1              return(0);
 283   1              send_byte(suba);            /*发送器件子地址*/
 284   1          if(ack==0)  
 285   1              return(0);
 286   1              start_i2c();
 287   1              send_byte(sla+1);
 288   1          if(ack==0)  
 289   1              return(0);
 290   1              for(i=0;i<num-1;i++)
 291   1          {   
 292   2              *s=receive_byte();      /*发送数据*/
 293   2              ack_i2c(0);             /*发送就答位*/  
 294   2              s++;
 295   2          } 
 296   1              *s=receive_byte();
 297   1              ack_i2c(1);                 /*发送非应位*/
 298   1              stop_i2c();                     /*结束总线*/ 
 299   1              return(1);
 300   1      }


C51 COMPILER V8.02   ZLG_I2C                                                               11/30/2007 14:28:45 PAGE 6   

MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    360    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      1      12
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----       1
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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