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

📄 at2402.c

📁 24c02 通用子模块源代码
💻 C
字号:
/*******************************************************************
	  I2C 器件 AT24C02 驱动程序
注意调用方式:
   要避免出现复写死循环的现象
*******************************************************************/

#include <reg52.h>
//#include <intrins.h>
#define uint  unsigned int 
#define uchar unsigned char

#define Delay2402_TIME  50 //经实验,不要小于50!否则可能造成时序混乱

//24操作位定义
sbit SCL       = P1 ^ 4;            
sbit SDA       = P1 ^ 5;

//24c02 函数声明
void Write_One_Byte(unsigned char addr,unsigned char thedata);
char Read_One_Byte(unsigned char addr);


/******************************************************************************/
/* 24C02.c*/
//调用方式如下:	
//Write_One_Byte(0x10,0x04);
//k=Read_One_Byte(0x10);
/********** 函数定义 ************/
void Delay2402(unsigned int t) /*延时函数*/
{
	while(t!=0)
    	t--;
}

void I2C_Start(void)
{
  	/*启动I2C总线的函数,当SCL为高电平时使SDA产生一个负跳变*/
    SDA=1;
    SCL=1;
    Delay2402(Delay2402_TIME);
    SDA=0;
    Delay2402(Delay2402_TIME);
    SCL=0;
    Delay2402(Delay2402_TIME);
}

void I2C_Stop(void)
{
 	/*终止I2C总线,当SCL为高电平时使SDA产生一个正跳变*/
   	SDA=0;
	SCL=1;
    Delay2402(Delay2402_TIME);
    SDA=1;
    Delay2402(Delay2402_TIME);
    SCL=0;
    Delay2402(Delay2402_TIME);
}

void SEND_0(void)   /* SEND ACK */
{
   	/*发送0,在SCL为高电平时使SDA信号为低*/
    SDA=0;
    SCL=1;
    Delay2402(Delay2402_TIME);
    SCL=0;
    Delay2402(Delay2402_TIME);
}

void SEND_1(void)
{
	/*发送1,在SCL为高电平时使SDA信号为高*/
    SDA=1;
    SCL=1;
    Delay2402(Delay2402_TIME);
    SCL=0;
    Delay2402(Delay2402_TIME);
}

bit Check_Acknowledge(void)
{
	/*发送完一个字节后检验设备的应答信号*/
    SDA=1;
    SCL=1;
    Delay2402(Delay2402_TIME/2);
    F0=SDA;
    Delay2402(Delay2402_TIME/2);
    SCL=0;
    Delay2402(Delay2402_TIME);
    if(F0==1)
    	return 0;
    return 1;
}

void WriteI2CByte(unsigned char b)reentrant
{
	/*向I2C总线写一个字节*/
    unsigned char i;
    for(i=0;i<8;i++)
   		if((b<<i)&0x80)
        	SEND_1();
        else
            SEND_0();
}

unsigned char ReadI2CByte(void)reentrant
{
	/*从I2C总线读一个字节*/
   	unsigned char b=0,i;
  	for(i=0;i<8;i++)
    {
   		SDA=1;    /*释放总线*/
      	SCL=1;    /*接受数据*/
        Delay2402(10);
        F0=SDA;
        Delay2402(10);
        SCL=0;
        if(F0==1)
        {
        	b=b<<1;
            b=b|0x01;
        }
        else
            b=b<<1;
    }
    return b;
}

/**********以下为读写24c02的函数***********************************************/
void Write_One_Byte(unsigned char addr,unsigned 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();
}

/******************************************************************************/
char Read_One_Byte(unsigned char addr)
{         
	bit acktemp=1;
    unsigned 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[i]=ReadI2CByte();
                      if(i!=n-1)
                          SEND_0();    /*发送应答*/
                      else
                          SEND_1();    /*发送非应答*/
                }
         I2C_Stop();
      }
















  


⌨️ 快捷键说明

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