51单片机IIC总线模拟

51单片机IIC总线模拟,第1张

首先要声明的是,如果你使用I2C时序的话,一般来说只能实现I2C主器件。

如果有电平检测中断倒是有可能实现从模块,不过也会相当复杂的。

发送一个字节,跟发送多个字节其实没多大差别。

I2C时序首先执行开始时序,然后发送从模块地址还有读写命令。

接着发送数据字节,如果你要发送多字节,就不要马上执行I2C结束时序,

继续发送你要数据,等数据发送完成后再执行结束时序。

当然,也要有响应信号的处理。

程序如下:

void sendstr(uchar addr)

{

start_i2c();

send_byte(addr);

reply();

send_byte(dat1);

reply();

send_byte(dat2);

reply();

send_byte(dat3);

reply();

stop_i2c();

}

篇幅有限,只能提供大致思路,各时序子程序还需自行思考。

希望对你有帮助。

我把iic通信的代码给你吧

/

向IIC总线发送一个字节数据

/

//

void delay(unsigned int k)

{

unsigned int i,j;

for(i=0;i<k;i++)

{

for(j=0;j<121;j++)

{;}}

}

/

延时5微秒(STC90C52RC@12M)

不同的工作环境,需要调整此函数,注意时钟过快时需要修改

当改用1T的MCU时,请调整此延时函数

/

void Delay5us()

{

_nop_();_nop_();_nop_();_nop_();

_nop_();/_nop_();_nop_();_nop_();

_nop_();_nop_();_nop_();_nop_(); /

}

/

延时5毫秒(STC90C52RC@12M)

不同的工作环境,需要调整此函数

当改用1T的MCU时,请调整此延时函数

/

void Delay5ms()

{

WORD n = 1000;

while (n--)

{

_nop_();_nop_();_nop_();_nop_();

};

}

void MMA8452_SendByte(BYTE dat)

{

BYTE i;

for (i=0; i<8; i++) //8位计数器

{

dat <<= 1; //移出数据的最高位

SDA = CY; //送数据口

SCL = 1; //拉高时钟线

Delay5us(); //延时

SCL = 0; //拉低时钟线

Delay5us(); //延时

}

MMA8452_RecvACK();

}

/

从IIC总线接收一个字节数据

/

BYTE MMA8452_RecvByte()

{

BYTE i;

BYTE dat = 0;

SDA = 1; //使能内部上拉,准备读取数据,

for (i=0; i<8; i++) //8位计数器

{

dat <<= 1;

SCL = 1; //拉高时钟线

Delay5us(); //延时

dat |= SDA; //读数据

SCL = 0; //拉低时钟线

Delay5us(); //延时

}

return dat;

}

这是我以前读取传感器信息时候用的。正好是iic通信的那部分,你自己学一下iic吧,我的程序是没问题的哦。

其实程序是一模一样的,唯一的区别是模拟IIC需要CPU运算,这样就增加了单片机的运算时间,而带IIC接口的单片机,程序还是需要的,但是IIC的运算通过集成在单片机里面的寄存器硬件电路来运算,就像定时器电路一样自己会运算,这样就不要cpu来运算过程了,从而节省了时间,使cpu运算的更快。当然这样就的多付出经济成本哦

1、首先IIC通信要分清主机与从机的关系,在主机对从机进行写 *** 作时,一般是在传送完一个数据之后单片机就进入检测应答信号状态:先将两个脚置位SDA=1;SCL=1;然后在一定时间内不断检测SDA脚的电平状态,比如说你弄个循环for(i=255;i>0;i--){;if()break;}进行不断判断,当SDA的电平为低时就跳出循环,说明此时从机已经ACK,就可说明是I2C器件拉低;如果为高时,则一直判断完整个循环,到最后还为高时,就说明没有应答。

2、写应答和读应答肯定有所区别的。写应答是在你读从机数据期间,当你接收到一个数据时,可以应答的(想继续通信就应答),就将SDA复位(拉低),不想应答(想结束通信时)就置位(SDA=1)。读应答则在主机写数据给从机期间,每当从机接收到一个数据就会应答一下(将数据SDA线拉低),主机将不断检测SDA线的电平,主机就是凭SDA的电平状态才知道从机是否已经正确地接收了主机发送的数据。

以上就是关于51单片机IIC总线模拟全部的内容,包括:51单片机IIC总线模拟、51单片机IIC总线通信、51单片机 iic 总线程序,用IO口模拟和用自带IIC口有什么不同等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10111877.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存