您的位置:首页 > 其它

I2c串行总线组成及其工作原理

2013-09-30 11:53 183 查看
采用串行总线技术可以使系统的硬件设计大大简化,系统的体积减小,可靠性提高,同时系统更容易更改和扩充

常用的串行扩展总线有:I2c总线,单总线,SPI总线,以及microwire、Plus等等

I2c总线只有两根双向信号线,一根是数据线SDA,另一根是时钟线SCL

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int

sbit sda = P2^3;
sbit scl = P2^2;
sbit wp = P2^1;
void delay()//微妙级别的延时函数
{;;}

void start()//开始信号
{
sda = 1;
delay();
scl = 1;
delay();
sda = 0;
delay();
}

void stop()//停止信号
{
sda = 0;
delay();
scl = 1;
delay();
sda = 1;
delay();

}

void respons()//应答信号
{
uchar i;
scl = 1;
delay();
while((sda ==1)&&(i<250))//等到第九个时钟周期的时候,还没有变为0,
//那么scl将自动的变为0,表示收到信号
{
i++;
}
scl = 0;
}

void init()
{
sda = 1;
scl = 1;//把线全部释放
}

void write_byte(uchar date)
{
uchar i,temp;
temp = date;
scl = 0;
delay();
for(i = 0;i<8;i++)//写8次
{
temp = temp<<1;//表示将temp左移1位,将最高位移入psw寄存器中的cy位,
//然后将最高位赋值给sda,送走数据
scl = 1;//数据稳定了
delay();
sda = CY;
delay();

scl = 0;//读走数据
delay();
}

sda = 1;//注意养成释放总线的习惯
delay();
}

uchar  read_byte()
{
uchar i,j,k;
scl = 0;
delay();
sda = 1;//释放数据总线
delay();
for(i=0;i<8;i++)
{
scl = 1;
delay();

j = sda ;//读取数据

k =(k<<1)|j;
scl = 0;
delay();
}
return k;

}

uchar read_add(uchar address)
{
uchar date;
start();
write_byte(0xa0);//表示写入器件的地址
respons();
write_byte(address);
respons();
start();
write_byte(0xa1);
respons();
date=read_byte();
stop();
return date;
}

void write_add(uchar address,uchar date)
{
init();//初始化信号总线和地址总线
start();//启动信号
write_byte(0xa0);//表示写入器件的地址
respons();
write_byte(address);//表示往这个器件内部的第三个地址处写入地址
respons();
write_byte(date);//表示器件内部的数据
respons();
stop();
}
void delay1(uint z)
{
uint x,y;
for(x= z;x>0;x--)
for(y=110;y>0;y--);
}

void main()
{
init();
write_add(23,125);
delay1(100);
P1=read_add(23);
while(1);
}


View Code

版权所以转载请注明链接地址:/article/5266366.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: