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

📄 main.c

📁 24c02程序
💻 C
字号:
#include <reg52.h>
#include <stdio.h>
#include <absacc.h>
#include <intrins.h>   
#define  uchar unsigned   char
#define  uint  unsigned   int  
//************************变量声明***************************   
  //读写控制命令   
  const   uchar   WR24C02   =   0xA0;  //EEPROM地址+写命令   
  const   uchar   RD24C02   =   0xA1;  //EEPROM地址+读命令   
  //I/O口定义   
  sbit     I2C_SCL   =   P1^1;   
  sbit     I2C_SDA   =   P1^0;   
  //用户变量声明   
  bit   ErrorBit;                      //读写错误标志       1错误     0   正确   
  uchar   idata   ErrorCode;           //错误码   
  //************************函数声明***************************   
  void     Start(void);   
  void     Stop(void);   
  void     Ack(void);   
  void     NoAck(void);   
  void     TestAck(void);   
  void     Write_I2c(uchar   date);   
  uchar    Read_I2c(void);   
  void     DelayMs(uchar   time);   
  void     Write_Date(uchar   StartAddress,uchar   *date,uchar   bytes);   
  void     Read_Date(uchar   StartAddress,uchar   *date,uchar   bytes);   
  #endif   
/*...................................................*/
  void   Start(void)   
  {   
          I2C_SDA   =   1;           //起始条件的数据信号   
          _nop_();   
          I2C_SCL   =   1;           //起始条件时钟信号   
          _nop_();                   //信号建立时间>4.7us   
          _nop_();   
          _nop_();   
          _nop_();   
          _nop_();   
          I2C_SDA   =   0;           //起始信号   
          _nop_();   
          _nop_();   
          _nop_();   
          _nop_();                   
          _nop_();   
          I2C_SCL   =   0;           //钳住I2C总线,   准备发送或者接受数据   
          _nop_();   
          _nop_();   
  }   
  /***************************************   
  *函数名称:       void   Stop(void)   
  *功能描述:       读写结束   
  *输入:               无   
  *输出:               无   
  *全局变量:       I2C_SCL,I2C_SDA   
  *调用模块:       无   
    
  ****************************************/   
  void   Stop(void)   
  {   
          I2C_SDA   =   0;             //结束条件的数据信号   
          _nop_();   
          I2C_SCL   =   1;             //结束条件的时钟信号   
          _nop_();   
          _nop_();   
          _nop_();   
          _nop_();                   
          _nop_();   
          I2C_SDA   =   1;             //结束信号   
          _nop_();   
          _nop_();   
          _nop_();   
          _nop_();                   
  }   
  /***************************************   
  *函数名称:       void   Ack(void)   
  *功能描述:       正确应答,读一个字节后必须应答   
  *输入:               无   
  *输出:               无   
  *全局变量:       I2C_SCL,I2C_SDA   
  *调用模块:       无   
    
  ****************************************/   
  void   Ack(void)   
  {   
          I2C_SDA   =   0;   
          _nop_();   
          _nop_();           
          I2C_SCL   =   1;   
          _nop_();   
          _nop_();   
          _nop_();   
          _nop_();   
          _nop_();           
          I2C_SCL   =   0;   
          _nop_();   
          _nop_();   
  }   
  /***************************************   
  *函数名称:       void   NoAck(void)   
  *功能描述:       无应答   
  *输入:               无   
  *输出:               无   
  *全局变量:       I2C_SCL,I2C_SDA   
  *调用模块:       无   
    
  ****************************************/   
  void   NoAck(void)   
  {   
          I2C_SDA   =   1;   
          _nop_();   
          _nop_();   
          I2C_SCL   =   1;   
          _nop_();   
          _nop_();   
          _nop_();   
          _nop_();   
          _nop_();   
          I2C_SCL   =   0;   
          _nop_();   
          _nop_();   
  }   
  /***************************************   
  *函数名称:       void   TestAck(void)   
  *功能描述:       读写错误测试,写一个字节应该测试应答信号   
  *输入:           无   
  *输出:           返回一个位   
  *全局变量:       I2C_SCL,I2C_SDA   
  *调用模块:       无   
    
  ****************************************/   
  void   TestAck(void)   
  {         
          I2C_SDA   =   1;   
          _nop_();   
          _nop_();   
          I2C_SCL   =   1;   
          _nop_();   
          _nop_();   
          _nop_();   
          ErrorBit=I2C_SDA;   
          I2C_SCL=0;   
          _nop_();   
          _nop_();           
  }   
  /***************************************   
  *函数名称:       void   Write_I2c(uchar   date)   
  *功能描述:       写I2C   
  *输入:           待送数据,高字节先送   
  *输出:           无   
  *全局变量:       I2C_SCL,I2C_SDA   
  *调用模块:       无   
    
  ****************************************/   
  void   Write_I2c(uchar   date)   
  {   
          uchar   i;   
          for(i=0;i<8;i++)   
          {   
                  I2C_SDA=date&0x80;                 //送数据到数据线上   
                  date<<=1;   
                  _nop_();                   
                  I2C_SCL   =   1;                   //置时钟信号为高电平,使数据有效   
                  _nop_();   
                  _nop_();   
                  _nop_();   
                  _nop_();   
                  _nop_();           
                  I2C_SCL   =   0;   
                  _nop_();   
                  _nop_();                   
                    
          }   
  }   
  /***************************************   
  *函数名称:       uchar   Read_I2c(void)   
  *功能描述:       读I2C   
  *输入:           无   
  *输出:           返回一个字节的数据,高字节在前   
  *全局变量:       I2C_SCL,I2C_SDA   
  *调用模块:       无   
    
  ****************************************/   
  uchar   Read_I2c(void)   
  {   
          uchar   i;   
          uchar   byte=0;   
          for(i=0;i<8;i++)   
          {   
                  I2C_SCL=0;                    //置时钟为低电平,准备接受数据   
                  _nop_();   
                  _nop_();   
                  _nop_();   
                  _nop_();   
                  _nop_();   
                  I2C_SCL   =   1;              //置时钟为高电平,使数据线数据有效   
                  _nop_();   
                  _nop_();   
                  byte <<=1;   
                  byte|=I2C_SDA;   
                  _nop_();   
                  _nop_();   
                  I2C_SCL   =   0;   
          }   
          return(byte);   
  }   
  /***************************************   
  *函数名称:       void   DelayMs(uchar   time)   
  *功能描述:       延时   
  *输入:           延时时间   
  *输出:           无   
  *全局变量:       无   
  *调用模块:       无   
    
  ****************************************/   
  void   DelayMs(uchar   time)   
  {   
        uchar   i;   
        do   
        {   
          for(i=0;i<125;i++);     //*延时 8us x 125 = 1ms   
        }   
        while(time--);   
  }   
  /***************************************   
  *函数名称:       void     Write_Date(uchar   StartAddress,uchar   *date,uchar   bytes)   
  *功能描述:       写数据   
  *输入:           数据开始地址,保存数据指针,数据字节数   
  *输出:           无   
  *全局变量:       无   
  *调用模块:       Start(),Write_I2c(),Stop(),TestAck()   
  *注意事项:       调用之前,需要定义一个数组,用来存待发送的数据   
  ****************************************/   
  void   Write_Date(uchar   StartAddress,uchar   *date,uchar   bytes)   
  {   
          uchar i=0;   
          Start();   
          Write_I2c(WR24C02);   
          TestAck();   
          Write_I2c(StartAddress);   
          TestAck();   
          for(i=0;i<bytes;i++)   
          {   
              Write_I2c(*date);   
              TestAck();   
              date++;   
          }   
          Stop();   
          DelayMs(20);   
  }   
  /***************************************   
  *函数名称:       void     Read_Date(uchar   StartAddress,uchar   *date,uchar   bytes)   
  *功能描述:       读数据   
  *输入:               数据开始地址,读取数据指针,数据字节数   
  *输出:               无   
  *全局变量:       无   
  *调用模块:       Start(),Write_I2c(),Read_I2c(),Ack(),NoAck(),Stop(),TestAck()   
  *注意事项:       调用之前,需要定义一个数组,用来存读取的数据   
  ****************************************/   
  void   Read_Date(uchar   StartAddress,uchar   *date,uchar   bytes)   
  {   
          uchar   i;   
          Start();   
          Write_I2c(WR24C02);   
          TestAck();   
          Write_I2c(StartAddress);   
          TestAck();   
          Write_I2c(RD24C02);   
          TestAck();   
          for   (i=0;i<bytes;i++)   
          {   
             *date=Read_I2c();   
             Ack();   
             date++;   
          }   
          NoAck();   
          Stop();   
          DelayMs(10);   
  }   

⌨️ 快捷键说明

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