📄 i2c.c
字号:
/************************************************************************
24C01的读写子函数
单字节随机地址读写
*************************************************************************/
#include <reg52.h>//加载头文件
#include <intrins.h>
#define uchar unsigned char//变量类型的宏定义
#define uint unsigned int//变量类型的宏定义
sbit SCL=P1^0;
sbit SDA=P1^1;
sbit LED=P1^2;
bdata uchar com_data;
sbit mos_bit=com_data^7;
sbit low_bit=com_data^0;
/******************************************************************************
函数:Delay()
功能:延时10mS
******************************************************************************/
void Delay()
{
uchar i,j,k;
for(i=0;i<=1;i++)
{
for(j=0;j<=200;j++)
{
for(k=0;k<=200;k++)
_nop_();
}
}
}
/******************************************************************************
函数:I2C_Delay()
功能:模拟I2C总线延时
说明:请根据具体情况调整延时值
******************************************************************************/
void I2C_Delay()
{
unsigned char t;
t = 10;
_nop_();
while ( --t != 0 ); //延时2*t个机器周期
}
/***************************
***************************************/
void start()//启动读写时序
{
SDA=1;I2C_Delay();
SCL=1;I2C_Delay();
SDA=0;I2C_Delay();
SCL=0;I2C_Delay();
}
//*****************************************
void stop()//停止操作
{
SDA=0;I2C_Delay();
SCL=1;I2C_Delay();
SDA=1;I2C_Delay();
}
//***********************
void ack()//slave应答
{
SCL=1;I2C_Delay();
SCL=0;I2C_Delay();
}
//***********************
/*void ack_master()//master应答
{
SDA=0;I2C_Delay();
SCL=1;I2C_Delay();
SCL=0;_nop_();
SDA=1;I2C_Delay();
}
*/
//***********************
void shift8(uchar a)//8位移位输出
{
data uchar i;
com_data=a;
for(i=0;i<8;i++)
{
SDA=mos_bit;
SCL=1;I2C_Delay();
SCL=0;I2C_Delay();
com_data=com_data*2;
}
}
//******************
uchar rd_24c01(uchar a)//读24C01A中a地址单元的数据
{
data uchar i,command;
SDA=1;I2C_Delay();
SCL=0;I2C_Delay();
start();
command=0xA0;
shift8(command); //写从器件地址:EEPROM 10100000b,最后一位0:写控制命令
ack();
shift8(a); //写字节地址
ack();
start();
command=0xA1;
shift8(command); //重新起始写从器件地址:EEPROM 10100001b,最后一位1:读控制命令
ack();
SDA=1;I2C_Delay(); //释放SDA
for(i=0;i<8;i++) //8位移位输入
{
com_data=com_data*2;
SCL=1;I2C_Delay();
low_bit=SDA;
SCL=0;I2C_Delay();
}
stop();
return(com_data);
}
//*****************
void wr_24c01(uchar a,uchar b)//将RAM中b地址单元的数据写入24C01A中a地址单元中
{
data uchar command;
I2C_Delay();
SDA=1;I2C_Delay();
SCL=0;I2C_Delay();
start();
command=0xA0;
shift8(command); //写从器件地址:EEPROM 10100000b,最后一位0:写控制命令
ack();
shift8(a); //写字节地址
ack();
shift8(b); //写入数据
ack();
stop();
I2C_Delay();
}
main()
{
uchar x,k;
for(k=0;k<=10;k++)
{
LED=0;
Delay();
LED=1;
Delay();
}
wr_24c01(0x00,0x45);
Delay();
x=rd_24c01(0x00);
if(x==0x45)
{
LED=0;
Delay();
Delay();
Delay();
Delay();
Delay();
LED=1;
Delay();
LED=0;
Delay();
Delay();
Delay();
Delay();
Delay();
LED=1;
Delay();
LED=0;
Delay();
Delay();
Delay();
Delay();
Delay();
}
else
{
for(k=0;k<=10;k++)
{
LED=0;
Delay();
Delay();
Delay();
Delay();
Delay();
LED=1;
Delay();
Delay();
Delay();
Delay();
Delay();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -