📄 i2c.c
字号:
#include<string.h>
#include<reg51.h>
#define TIME 4
#define TRUE 1
#define FALSE 0
sbit SCL=P1^2; /*定义时钟信号线*/
sbit SDA=P1^1; /*定义数据信号线*/
sbit wp=P1^0;
void WriteOneByte(char addr,char d);
char Read_One_Byte(char addr);
void delay(unsigned int t);
void main()
{
char i;
wp=0;
for(i=0;i<10;i++)
{
WriteOneByte(i,i+1);
}
while(1)
{wp=1;
for(i=0;i<10;i++)
{
P2=Read_One_Byte(i);
delay(50000);
}
}
}
/*延时函数*/
void delay(unsigned int t)
{
unsigned int i;
for (i=0;i<t;i++);
}
/*启动I2C总线的函数,当SCL为高电平时使SDA产生一个负跳变*/
void Start(void)
{
SDA=1;
SCL=1;
delay(TIME);
SDA=0;
delay(TIME);
SCL=0;
delay(TIME);
}
/*终止I2C总线,当SCL为高电平时使SDA产生一个正跳变*/
void Stop(void)
{
SDA=0;
SCL=1;
delay(TIME);
SDA=1;
delay(TIME);
SCL=0;
delay(TIME);
}
/*发送完一个字节后检验设备的应答信号*/
bit Check_Ack (void)
{
bit q;
SDA=1;
SCL=1;
delay(TIME/2);
q=SDA;
delay(TIME/2);
SCL=0;
delay(TIME);
if (q==1)
return(FALSE);
else
return(TRUE);
}
/*发送1,在SCL为高电平时使SDA信号为高*/
void SEND_1 (void)
{
SDA=1;
SCL=1;
delay(TIME);
SCL=0;
delay(TIME);
}
/*发送0,在SCL为高电平时使SDA信号为低*/
void SEND_0(void)
{
SDA=0;
SCL=1;
delay(TIME);
SCL=0;
delay(TIME);
}
/*从I2C总线读一个字节*/
char ReadI2CByte(void)
{
bit q;
char b=0,i;
for (i=0;i<8;i++)
{
SDA=1; /*释放总线*/
SCL=1; /*接受数据*/
delay(10);
q=SDA;
delay(10);
SCL=0;
if (q==1)
{
b=b<<1;
b=b|0x01;
}
else
b=b<<1;
}
return(b);
}
/*向I2C总线写一个字节*/
void WriteI2CByte(char b)
{
char i;
for (i=0;i<8;i++)
if ((b<<i)&0x80)
SEND_1();
else
SEND_0();
}
/**********以下为读写24c02的函数**********/
void WriteOneByte(char addr,char d) //单字节写
{
bit ack=1;
Start();
WriteI2CByte(0xa0);
ack=Check_Ack();
WriteI2CByte(addr); //地址
ack=Check_Ack();
WriteI2CByte(d); //数据
ack=Check_Ack();
Stop();
}
char Read_One_Byte(char addr)
{
bit ack=1;
char mydata;
Start();
WriteI2CByte(0xa0);
ack=Check_Ack();
WriteI2CByte(addr); /* 地址 */
ack=Check_Ack();
Start();
WriteI2CByte(0xa1);
ack=Check_Ack();
mydata=ReadI2CByte();
ack=Check_Ack();
return(mydata);
Stop();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -