单片机的IIC写入字节
单片机IIC总线,写一个字节 -
【1】temp=temp<<1; 这个是数据左移;CY就等于移出的最高位。【2】sda=CY;每次循环,将自动取到temp的每一位,从高到低。【3】scl=1;目的是scl线从0到1的跳变。具体可以看IIC通信协议的图形。【4】scl=0; 循环外。字节的所有位,共8位移出后。需要等到IIC从站设备的响应。scl状态还有呢?
如果了解了I2C协议,看看程序形成的波形,对照协议的时序,很容易的。
【1】temp=temp<<1; 这个是数据左移;CY就等于移出的最高位。【2】sda=CY;每次循环,将自动取到temp的每一位,从高到低。【3】scl=1;目的是scl线从0到1的跳变。具体可以看IIC通信协议的图形。【4】scl=0; 循环外。字节的所有位,共8位移出后。需要等到IIC从站设备的响应。scl状态还有呢?
如果了解了I2C协议,看看程序形成的波形,对照协议的时序,很容易的。
用一个INT数值表示,方法有2种1:换可以直接以16位数据形式写入的IIC存储6器比如93C46这种2:用拆分方式存储,读取后在重新还原比如一个16位数据1234吧高8位是12,低8位是34,你存储的时候完全可以这样unsigned int i;unsigned char H,L;存储时:H= i>>8;L=i&0X00FF;然后分别写入2个希望你能满意。
读/写I2C芯片时的数据都是8位无符号数,所以,定义成unsigned char 型的,而通常又用宏定义成uchar的,其实就是unsigned char 型的。
单片机I2C总线通信问题,高手进 -
IIC总线工作原理 I2C总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化。 起始和终止信号:SCL线为高电平期间,SDA线由高电平向低电平的变化表示起始信号;SCL线为高电平期间,SDA线由低电平向高后面会介绍。
在器件在有它各自的址,但它们有两不同的区分方法,如:EEPROM芯片它不仅有内部地,它还有外接的几个引脚用于区分不同的EEPROM芯片,而温度传感器它的内部地址每一个都不同(出厂时就已写入)。有还有就是I2C有8位地址和10位地址两种。
单片机IIC总线中读一个字节 -
uchar read_byte(){ uchar i,d;SCL=0;delay();SDA=1;for(i=0;i<8;i++){ SCL=1;delay();d=(d<<1)|SDA;SCL=0;delay();} delay();return d;}
void writex(unsigned char j) //写一个字节{ unsigned char i,temp;temp=j;for (i=0;i<8;i++){temp=temp<<1; scl=0; flash(); sda=CY; flash(); scl=1; flash();} scl=0; flash(); sda=1; flash();} unsigned char readx() //读一个字节{ unsigned char i,到此结束了?。
单片机iic程序不懂给分析下啊 -
/*程序的I2C从器件地址为1010,片选地址为000*/ include <reg52.h> include <intrins.h> define uchar unsigned char define uint unsigned int sbit SDA=P1^7;sbit SCL=P1^6;void Delay(uint us){ for(us;us>0;us--);} void start_iic() // 启动I2C总线{ SDA=1; // 发送起有帮助请点赞。
你可以先看一下I2C时序。在I2C读时序中,start--->器件地址--->ACK--->内存地址--->ACK--->START--->器件地址--->ACK--->数据--- --->ACK 希望你能满意。--->STOP 其实读时序中包含一个写操作,因为必须告诉从机你要读的地址以及从机希望你能满意。