I2C总线AT24C02芯片应用
code:
本文引用地址:https://www.eepw.com.cn/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;
}
评论