论坛元老
 
- 积分
- 4163
- 金钱
- 4163
- 注册时间
- 2017-10-24
- 在线时间
- 251 小时
|
发表于 2018-8-5 10:34:23
|
显示全部楼层
[mw_shl_code=c,true]/*I2C总线写一个字节*/
//参数是需要写的一个字节数据
void wr_byte(uchar date)
{
//循环辅助变量
uchar i;
//由于一个字节有8位,所以需要循环八次下面的内容
for(i=0;i<8;i++)
{
//数据左移,对于51单片机当前date的最高位将会移动到CY寄存器中
date=date<<1;
//将CY寄存器中的数值,也就是date刚才的最高位放到SDA线上(此时SCL必须为低电平)
SDA=CY;
//短暂延时使数据稳定
delay();
//SCL拉高,告知IIC从器件可以对SDA上的数据进行采样了,此时要保持SDA上的数据不变
SCL=1;
//延时等待从器件操作完成(其实从器件基本都是在SCL的上升沿完成采样,时间极短ns级别)
delay();
//认为从器件读SDA操作完成,由于接下来还是需要操作SDA所以将SCL拉低
SCL=0;
//等待SCL电平稳定(对于51来说没有必要)
delay();
}
}
/*I2C总线读一个字节*/
uchar rd_byte()
{
uchar i, //循环变量
temp; //接收缓冲
//一个字节有8bit,所以需要循环8次
for(i=0;i<8;i++)
{
//在进行下面的操作之前,从器件就应当已经将数据放在SDA线上了
//拉高SCL,告知从器件现在不可以改动SDA线数据
SCL=1;
//延时等待SCL电平稳定(对于51来说没有必要)
delay();
//从SDA线获取数据,并且放在缓冲字节的尾部,这样逐渐移位8次之后就拼凑成了一个完整的字节
temp=(temp<<1)|SDA;
//讲真这个延时没有必要加毫无意义
delay();
//拉低SCL,告知从器件现在把下一bit放在SDA上
SCL=0;
//等待从器件操作完成
delay();
}
//返回从IIC总线读取到的结果
return temp;
}
[/mw_shl_code]
|
|