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

📄 i2c.lst

📁 电子称重的程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V8.02   I2C                                                                   02/09/2007 11:18:00 PAGE 1   


C51 COMPILER V8.02, COMPILATION OF MODULE I2C
OBJECT MODULE PLACED IN E:\WORK\程序\计重通~1\I2C.OBJ
COMPILER INVOKED BY: D:\Keil\C51\BIN\C51.EXE E:\WORK\程序\计重通~1\I2C.C DB SB OE

line level    source

   1          #include<head.h>
   2          #include<I2C.H>
   3          #include <function.h>
   4          #include<LCD_1621.h>
   5          //#include<ex.h>
   6          //#include<modi.h>
   7          
   8          bit E_err;
   9          
  10          /**************************************************************************
  11          *      函数原型:void I_start(void);
  12          *      功    能:提供I2C总线工作时序中的起始位。
  13          **************************************************************************/
  14          void I_start(void)
  15          {
  16   1       SCL=HIGH;
  17   1       _nop_();
  18   1       _nop_();
  19   1       SDA=LOW;
  20   1       _nop_();
  21   1       _nop_();
  22   1       SCL=LOW;
  23   1       _nop_();
  24   1       _nop_();
  25   1      }
  26          
  27          
  28          /**************************************************************************
  29          *      函数原型:void I_stop(void);
  30          *      功    能:提供I2C总线工作时序中的停止位。
  31          **************************************************************************/
  32          void I_stop(void)
  33          {
  34   1       SDA=LOW;
  35   1       _nop_();
  36   1       _nop_();
  37   1       SCL=HIGH;
  38   1       _nop_();
  39   1       _nop_();
  40   1       SDA=HIGH;
  41   1       _nop_();
  42   1       _nop_();
  43   1       SCL=LOW;
  44   1       _nop_();
  45   1       _nop_();
  46   1      }
  47          
  48          /**************************************************************************
  49          *      函数原型:void I_init(void);
  50          *      功    能:I2C总线初始化。在main()函数中应首先调用本函数,然后再用
  51          *               I2C其它函数。
  52          **************************************************************************/
  53          void I_init(void)
  54          {
  55   1       WP=0;
C51 COMPILER V8.02   I2C                                                                   02/09/2007 11:18:00 PAGE 2   

  56   1       SCL=LOW;
  57   1       _nop_();
  58   1       I_stop();
  59   1      }
  60          
  61          /**************************************************************************
  62          *      函数原型:bit I_clock(void);
  63          *      功    能:提供I2C总线的时钟信号,并返回在时钟电平为高期间SDA信号线上状
  64          *               态。本函数可用于数据发送,也可用于数据接收。
  65          **************************************************************************/
  66          bit I_clock(void)
  67          {
  68   1      bit sample;
  69   1       SCL=HIGH;
  70   1       _nop_();
  71   1       _nop_();
  72   1       _nop_();
  73   1       sample=SDA;
  74   1       SCL=LOW;
  75   1       _nop_();
  76   1       _nop_();
  77   1       _nop_();
  78   1       return(sample);
  79   1      }
  80          
  81          /**************************************************************************
  82          *      函数原型:bit I_send(Uchar I_data);
  83          *      功    能:向I2C总线发送8位数据,并请求一个应答信号ACK。如果收到ACK应答,
  84          *               则返回1(TRUE),否则返回0(FALSE)。
  85          **************************************************************************/
  86          bit I_send(Uchar I_data)
  87          {
  88   1      Uchar i;
  89   1       /*发送8位数据*/
  90   1       for(i=0;i<8;i++)
  91   1       {
  92   2        SDA=(bit)(I_data&0x80);
  93   2        I_data=I_data<<1;
  94   2        I_clock();
  95   2        _nop_();
  96   2        _nop_();
  97   2       }
  98   1       /*请求应答信号ACK*/
  99   1       SDA=HIGH;
 100   1       for(i=0;i<3;i++)
 101   1       {
 102   2       if(!I_clock())return 1;
 103   2       delayms(1);
 104   2       }
 105   1       E_err=1;
 106   1       return 0;
 107   1       //return(~I_clock());
 108   1      }
 109          
 110          /**************************************************************************
 111          *      函数原型:Uchar I_receive(void);
 112          *      功    能:从I2C总线上接收8位数据信号,并将接收到的8位数据作为一个字节
 113          *               返回,不回送应答信号ACK。主函数在调用本函数这前应保证SDA信
 114          *               号线处于浮置状态。
 115          **************************************************************************/
 116          Uchar I_receive(void)
 117          {
C51 COMPILER V8.02   I2C                                                                   02/09/2007 11:18:00 PAGE 3   

 118   1      register Uchar I_data=0;
 119   1      register Uchar i;
 120   1       for(i=0;i<8;i++)
 121   1       {
 122   2        I_data*=2;
 123   2        _nop_();
 124   2        _nop_();
 125   2        if(I_clock())
 126   2         I_data++;
 127   2       }
 128   1       return(I_data);
 129   1      }
 130          
 131          
 132          
 133          
 134          /**************************************************************************
 135          *      函数原型:void E_address(Uchar Address);
 136          *      功    能:向24C02写入器件地址和一个指定的字节地址。
 137          **************************************************************************/
 138          void E_address(Uchar Address)
 139          {
 140   1       I_start();
 141   1       I_send(WRITE);
 142   1       I_send(Address);
 143   1      }
 144          /**************************************************************************
 145          *      函数原型:void E_writeex(Uchar Address,Uchar *E_data,Uchar datan);
 146          *      功    能:将 24C02  以Address起始的空间读入e_data指向的空间
 147          **************************************************************************/
 148          void E_writeex(Uchar Address,Uchar *E_data,Uchar datan)
 149          {
 150   1       Uchar i;
 151   1       for(i=0;i<datan;i++)
 152   1       {
 153   2         E_write(Address+i,*(E_data+i));
 154   2         delayms(10);
 155   2       }
 156   1      }
 157          /**************************************************************************
 158          *      函数原型:void E_readex(Uchar Address,Uchar *E_data,Uchar datan);
 159          *      功    能:将E_data所指向的内容写入 24C02  以Address起始的空间
 160          **************************************************************************/
 161          void E_readex(Uchar Address,Uchar *E_data,Uchar datan)
 162          {
 163   1       Uchar i;
 164   1       for(i=0;i<datan;i++)
 165   1       {
 166   2         *(E_data+i)=E_read(Address+i);
 167   2       }
 168   1      }
 169          /**************************************************************************
 170          *      函数原型:void E_write(Uchar Address,Uchar E_data);
 171          *      功    能:将E_data内容写入到24C02的Address单元以及与它相对应的两个备份单元

⌨️ 快捷键说明

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