📄 eeprom24c32.c
字号:
#pragma ot(6,SIZE)
#include<Intrins.h>
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit scl=P1^0;
sbit sda=P1^1;
void i2cstart(void);
void eeprom24c32writebyte(uint addr,uchar value);
void sendacknowledge(bit ack);
bit i2csentbyte(uchar bytedata);
void i2cstop(void);
uchar i2creceivebyte();
uchar eeprom24c32readbyte(uint addr);
uchar getbyte;
void delay();
bit ack;
void main()
{
bit flag=1;
if (flag)
getbyte=eeprom24c32readbyte(0x0123);
else
eeprom24c32writebyte(0x0123,0xcd);
while(1);
}
/*延时子程序*/
void delay()
{
uchar i;
for(i=0;i<6;i++);
}
/*从slave端读取一个数据*/
uchar i2creceivebyte()
{
uchar j=8;
uchar temp;
scl=0;
while(j--)
{
scl=1;//置时钟线为高使数据线上数据有效
delay();
temp=(temp<<1)|sda;
scl=0;
delay();
}
return temp;
}
/*将数据从EEPROM24c32中读出*/
uchar eeprom24c32readbyte(uint addr)
{
uchar temp;
uchar addrhigh;
uchar addrlow;
i2cstart();
addrhigh=addr>>8;
addrlow=addr&0xff;
i2csentbyte(0xA0);//device 最后一位为LOW时代表写操作
i2csentbyte(addrhigh);//send HIBYTE address
i2csentbyte(addrlow);//send LOBYTE address
i2cstart();
i2csentbyte(0xA1);//device 最后一位为HIGH时代表读操作
temp=i2creceivebyte();
sendacknowledge(1);
i2cstop();
return temp;
}
/*将数据写入EEPROM24c32*/
void eeprom24c32writebyte(uint addr,uchar value)
{
uchar addrhigh;
uchar addrlow;
i2cstart();
addrhigh=addr>>8;
addrlow=addr&0xff;
i2csentbyte(0xA0);//device 最后一位为LOW时代表写操作
i2csentbyte(addrhigh);//send HIBYTE address
i2csentbyte(addrlow);//send LOBYTE address
i2csentbyte(value);
i2cstop();
delay();
}
/*I2C BUS 的起始信号
SDA HIGH->LOW while SCL=HIGH*/
void i2cstart(void)
{
scl=0;
sda=1;//发送起始条件的数据信号
delay();
scl=1;
delay();//起始条件建立时间大于4.7us
sda=0;//发送起始信号
delay();//起始条件锁定时间大于4us
scl=0;//钳住i2c总线准备发送或接收数据
sda=1;
}
/*I2C BUS 的停止信号
SDA LOW->HIGH while SCL=HIGH*/
void i2cstop(void)
{
sda=0;//发送结束条件的数据信号
sda=0;
delay();
scl=1;
delay();//STOP时SCL至少领先SDA 4us
sda=1;//发送I2C总线结束信号
delay();//STOP后必须至少维持4.7us方可START
}
/*传送一个Byte 到 slave*/
bit i2csentbyte(uchar bytedata)
{
unsigned char data j=8;
sda=1;
delay();
for(;j>0;j--)/*要传送的数据长度为8bit*/
{
bytedata<<=1;
sda=CY;
delay();
scl=1;
delay();
scl=0;
delay();//SCL低电平最少保持4.7us
}
sda=1;//发送完后释放数据线
delay();
scl=1;
delay();
do{}while(sda==1);//准备接收应答位
ack=1;
scl=0;
return ack;
}
/*传送确认信号H或L到slave*/
void sendacknowledge(bit ack)
{
sda=ack;//发出应答或非应答信号
delay();
scl=1;
delay();
scl=0;//清时钟线钳住i2c总线以便继续接收
delay();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -