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

📄 24c02.c

📁 24C02,我已经编译成功了,如果用串口下载
💻 C
字号:
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define DELAY_TIME 60 /*经实验,不要小于50!否则可能造成时序混乱*/
#define TRUE 1
#define FALSE 0
sbit SDA=P2^0;/*假设由P1.7和P1.6控制*/
sbit SCL=P2^1;

void DELAY(uint t) /*延时函数*/
{
    while(t!=0)
        t--;
}
void I2C_Init()
{
	SCL=1;
	DELAY(DELAY_TIME); 
	SDA=1; 
	DELAY(DELAY_TIME);
}
void I2C_Start()
{
    /*启动I2C总线的函数,当SCL为高电平时使SDA产生一个负跳变*/
    SDA=1;
    SCL=1;
    DELAY(DELAY_TIME);
    SDA=0;
    DELAY(DELAY_TIME);
    SCL=0;
    DELAY(DELAY_TIME);
}

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

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

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

bit Check_Acknowledge()
{
    /*发送完一个字节后检验设备的应答信号,应答信号将SDA拉低*/
    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(uchar b)
{
    /*向I2C总线写一个字节*/
    char i;
    for(i=0;i<8;i++)
        if((b<<i)&0x80)
            SEND_1();
        else
            SEND_0();
}

char ReadI2CByte()
{
	/*从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(uchar addr,uchar 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(uchar 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 Uart_Init()
{
	TMOD=0x20;//T1的典型工作方式是8位自动重装
	TH1=0xfd;//波特率9600时的初值
	TL1=0xfd;
	TR1=1;//启动T1
	SM0=0;//确定串行口的工作方式
	SM1=1;
	REN=1;//允许串行接收位
}
//向串口发送一个字符 
void Send_Char(uchar ch) 
{ 
	SBUF=ch; 
	while (TI== 0 ); 
	TI= 0 ; 
}

void main()
{
	uchar temp;
	I2C_Init();
	Uart_Init();
    Write_One_Byte(0x00,0x55);
	Read_One_Byte(0x00);
	temp=Read_One_Byte(0x00);
	P1= temp;
	Send_Char(temp);

         
}


⌨️ 快捷键说明

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