新闻中心

EEPW首页>嵌入式系统>设计应用> I2C总线AT24C02芯片应用

I2C总线AT24C02芯片应用

作者: 时间:2016-12-01 来源:网络 收藏

code:

本文引用地址://m.amcfsurvey.com/article/201612/324161.htm

/*
通讯中 SDA 口通讯双方都可为输出,如果一方输出低,

另一方则如果输出高也不能使SDA为高,相当于,输出低的一方占住了SDA口。

两个口,一个出高一个出低,则线上电平是低的。

这是由于,出高的驱动能力不及出低拉电流的能力。


所以SDA=1为释放数据线
*/

#include

#define uint unsigned int

#define uchar unsigned char

sbit sda=P2^0;

sbit scl=P2^1;

void delay()//执行空语句,微秒级延时函数

{;;}

void delay1ms(uint z)//延时1ms

{

uint x,y;

for(x=z;x>0;x--)

{

for(y=0;y<=110;y++)

{

}

}

}

void init()//初始化状态下SCL和SDA都为高电平

{

scl=1;

delay();

sda=1;

delay();

}

void start()//在SCL为高电平时SDA由高电平到低电平

{

sda=1;

delay();

scl=1;

delay();

sda=0;

}

void respons()

/*

应答信号,SCL在高电平期间,SDA被从设备拉为低电平表示应答。

(sda==1)和i<255相与,表示若在一段时间内没有从器件的应答则主器件

默认从器件已经收到数据而不再等待应答信号

*/

{

uchar i;

scl=1;

delay();

while((sda==1)&&(i<250))

{

i++;

}

scl=0;

delay();

}

void stop()//SCL在高电平期间,SDA一个上升沿停止信号

{

sda=0;

delay();

scl=1;

delay();

sda=1;

}

void write_byte(uchar date)//写一个字节

{

uchar i,temp;

temp=date;

for(i=0;i<8;i++)

{

temp=temp<<1;

scl=0;//只有在SCL为0期间才允许SDA数据线上的状态才允许变化

delay();

sda=CY;//PSW的寄存器的CY进位标志位

delay();

scl=1; //SCL时钟信号为高电平期间数据线上的数据必须保持稳定

delay();

}

scl=0;

delay();

sda=1;//释放总线

delay();

}

uchar read_byte()

{

uchar i,k;

scl=0;

delay();

sda=1;//释放总线

delay();

for(i=0;i<8;i++)

{

scl=1;

delay();

k=(k<<1)|sda;

scl=0;

delay();

}

//delay();here is a bug

return k;

}



关键词:I2C总线AT24C02芯

评论


技术专区

关闭