论坛元老 
   
	- 积分
 - 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] 
 |   
 
 
 
 |