/******************************************************************** 
                            汇诚科技 
网址:http://www.ourhc.cn 
产品有售淘宝店:http://shop36330473.taobao.com    
*********************************************************************/ 
#include <reg52.H> 
 
/**************************************************************************** 
                                        24C08 读写驱动程序        开始 
*****************************************************************************/ 
#include<reg52.h> 
#include<string.h> 
          #include<intrins.h> 
      #define DELAY_TIME 60 /*经实验,不要小于50!否则可能造成时序混乱*/  
      #define TRUE 1 
      #define FALSE 0 
      sbit SCL=P3^3;/*串行时钟*/  
      sbit SDA=P3^4;/*串行数据*/ 
          char mybyte;        /*单字节*/ 
          char myarray[2]; 
          sbit P2_0=P2^0;/*按键控制数据重载*/ 
          /********** Function Definition  函数定义 ************/  
      void DELAY(unsigned int t) /*延时函数*/  
      { 
        while(t!=0) 
          t--;  
      } 
      void I2C_Start(void) 
      { 
        /*启动I2C总线的函数,当SCL为高电平时使SDA产生一个负跳变*/  
        SDA=1; 
        SCL=1; 
        DELAY(DELAY_TIME); 
        SDA=0; 
        DELAY(DELAY_TIME); 
        SCL=0; 
        DELAY(DELAY_TIME); 
      } 
     void I2C_Stop(void) 
     { 
       /*终止I2C总线,当SCL为高电平时使SDA产生一个正跳变*/  
       SDA=0; 
       SCL=1; 
       DELAY(DELAY_TIME); 
       SDA=1; 
       DELAY(DELAY_TIME); 
       SCL=0; 
       DELAY(DELAY_TIME); 
     } 
     void SEND_0(void) /* SEND ACK */ 
     { 
       /*发送0,在SCL为高电平时使SDA信号为低*/  
       SDA=0; 
       SCL=1; 
       DELAY(DELAY_TIME); 
       SCL=0; 
       DELAY(DELAY_TIME); 
     } 
    void SEND_1(void) 
    { 
      /*发送1,在SCL为高电平时使SDA信号为高*/  
      SDA=1; 
      SCL=1; 
      DELAY(DELAY_TIME); 
      SCL=0; 
      DELAY(DELAY_TIME); 
    } 
    bit Check_AcknowLEDge(void) 
    { 
      /*发送完一个字节后检验设备的应答信号*/  
      SDA=1; 
      SCL=1; 
      DELAY(DELAY_TIME/2); 
      F0=SDA; 
      DELAY(DELAY_TIME/2); 
      SCL=0; 
      DELAY(DELAY_TIME); 
      if(F0==1) 
        return FALSE; 
      return TRUE; 
    } 
        void WriteI2CByte(char b)reentrant 
        { 
          /*向I2C总线写一个字节*/  
          char i; 
          for(i=0;i<8;i++) 
            if((b<<i)&0x80) 
              SEND_1(); 
            else 
              SEND_0(); 
        } 
 
        char ReadI2CByte(void)reentrant 
        { 
          /*从I2C总线读一个字节*/  
          char b=0,i; 
          for(i=0;i<8;i++) 
          { 
            SDA=1;  /*释放总线*/  
            SCL=1;  /*接受数据*/  
            DELAY(10); 
            F0=SDA; 
            DELAY(10); 
            SCL=0; 
            if(F0==1) 
                       { 
              b=b<<1; 
              b=b|0x01; 
            } 
          else 
            b=b<<1; 
        } 
        return b; 
      } 
 
    /**********以下为读写24c02的函数**********/  
    void Write_One_Byte(char addr,char thedata) 
    { 
        bit acktemp=1; 
        /*write a byte to mem*/ 
        I2C_Start(); 
        WriteI2CByte(0xa0); 
        acktemp=Check_AcknowLEDge(); 
        WriteI2CByte(addr);/*address*/ 
        acktemp=Check_AcknowLEDge(); 
        WriteI2CByte(thedata);/*thedata*/ 
        acktemp=Check_AcknowLEDge(); 
        I2C_Stop(); 
    } 
  void Write_A_Page(char *buffer,char addr) 
  { 
      bit acktemp=1; 
      bit wrtmp; 
      int i; 
      /*write a page to at24c02*/ 
      I2C_Start(); 
      WriteI2CByte(0xa0); 
      acktemp=Check_AcknowLEDge(); 
      WriteI2CByte(addr);/*address*/ 
      acktemp=Check_AcknowLEDge(); 
      for(i=0;i<7;i++) 
      { 
        WriteI2CByte(buffer); 
        if(!Check_AcknowLEDge()) 
          { 
            I2C_Stop(); 
          } 
       } 
 
      I2C_Stop(); 
 
 
  } 
  char Read_One_Byte(char addr) 
  {     bit acktemp=1; 
        char mydata; 
       /*read a byte from mem*/ 
        I2C_Start(); 
        WriteI2CByte(0xa0); 
        acktemp=Check_AcknowLEDge(); 
        WriteI2CByte(addr);/*address*/ 
        acktemp=Check_AcknowLEDge(); 
        I2C_Start(); 
        WriteI2CByte(0xa1); 
        acktemp=Check_AcknowLEDge(); 
 
        mydata=ReadI2CByte(); 
        acktemp=Check_AcknowLEDge(); 
        return mydata; 
        I2C_Stop(); 
  } 
  void Read_N_Bytes(char *buffer,char n,char addr) 
  { 
      bit acktemp=1; 
      int i=0; 
       /*read 8 bytes from mem*/ 
      I2C_Start(); 
      WriteI2CByte(0xa0); 
      acktemp=Check_AcknowLEDge(); 
      WriteI2CByte(addr);/*address*/ 
      acktemp=Check_AcknowLEDge(); 
      I2C_Start(); 
      WriteI2CByte(0xa1); 
      acktemp=Check_AcknowLEDge(); 
 
 
      for(i=0;i<n;i++) 
      { 
          buffer=ReadI2CByte(); 
          if(i!=n-1) 
            SEND_0();  /*发送应答*/  
          else 
            SEND_1();  /*发送非应答*/  
      } 
   I2C_Stop(); 
   } 
 
/*************延时函数*************/ 
void delay02s(void) //延时0.2秒子程序 
{ 
unsigned char i,j,k; 
for(i=200;i>0;i--) 
for(j=20;j>0;j--) 
for(k=248;k>0;k--); 
} 
 
/********************************* 
       主函数 
*********************************/  
  void main() 
  { 
       int i; 
           char rdarray[8]; 
/********************************* 
       读出写入的数据值 
*********************************/  
       for(i=0;i<8;i++) 
       { 
           Read_N_Bytes(rdarray,8,0x10); //*读出数据* 
           P0= rdarray[2];                                 //*显示读出数据* 
           delay02s();                                         //*延时函数* 
       } 
/**********结束******************/ 
 
/********************************* 
       写入8个数据值 
*********************************/  
/*       for(i=0;i<8;i++) 
       { 
           rdarray=i;                                 //*产生数据* 
       Write_A_Page(rdarray,0x10);         //*写入数据* 
           P0= rdarray;                                 //*显示数据* 
           delay02s();                                         //*延时函数* 
       } 
/**********结束******************/ 
           } 
 
 
 
 |