📄 eeprom (at24c02).txt
字号:
//EEPROM (AT24C02)
#include<reg51.h>
#include<intrins.h>
sbit SCL=P0^0;
sbit SDA=P0^1;
bit ACKK;
void delay()
{
unsigned char i=50;
while(i--);
}
bit ACK()//从器件的应答信号
{
ACKK=0;
SCL=0;
SDA=1;
_nop_();
SCL=1;
_nop_();
if(SDA==0) ACKK=0;
else ACKK=1;
SCL=0;
return ACKK;
}
void SACK()//发送应答信号
{
SDA=0;
_nop_();
SCL=1;
delay();
SCL=0;
}
void IICstart()
{
SDA=1;
_nop_();
SCL=1;
delay();//起始信号建立
SDA=0;//起始信号下降沿
delay();//起始信号保持
SCL=0;
}
void IICstop()
{
SCL=0;
_nop_();
SDA=0;
_nop_();
SCL=1;
delay();
SDA=1;
}
void write_8bit(unsigned char ch)
{
unsigned char i=8;
while (i--)
{
SCL=0;
delay();
if(ch&0x80)//SCL变低后最长3.5us,可以开始输出数据,或有应答信号出现
SDA=1;
else SDA=0;
SCL=1;
ch<<=1;
delay();
}
SCL=0;
}
unsigned char read_8bit()
{
unsigned char i=8;
unsigned char ch=0;
while (i--)
{
SDA=1;
_nop_();
SCL=1;
ch<<=1;
if(SDA==1)
ch=(ch|0x01);//SCL变低后最长3.5us,可以开始输出数据,或有应答信号出现
SCL=0;
delay();
}
return ch;
}
void ReadIIC_24C02(unsigned char addr)
{
unsigned char r_high;
do //输入读数据的起始地址
{
IICstart();
write_8bit(0xA0); //写操作方式
}while(ACK()); //采集应答信号,无应答重新发送
write_8bit(addr); //写单元地址
ACK();
IICstart();
write_8bit(0xA1); //读操作方式
ACK();
r_high=read_8bit(); //接收数据
SACK(); //在后添加可以顺序读数据
IICstop();
}
void WriteIIC_24C02(unsigned char addr,unsigned char adata)
{
do
{
IICstart();
write_8bit(0xA0); //写操作方式
}while(ACK()); //采集应答信号,无应答重新发送
write_8bit(addr); //写单元地址
ACK();
write_8bit(adata); //发送数据
ACK(); //在后添加可以页写
IICstop();
}
void main()
{
/************************应用写、读数据举例************************/
WriteIIC_24C02(0x00,0x11); //向器件地址0x00写入数据0x11
ReadIIC_24C02(0x00); //随机读出地址0x00中的数据
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -