求教:两个51单片机之间的IIC通讯

求教:两个51单片机之间的IIC通讯,第1张

IIC通讯只能是TTL连接通信,要求两个单片机是近距离的,应在1米以内。既然是TTL连接,为何不用串口呢,也是TTL连接,串口通信简单多了。

而IIC通信,两个单片机都是用引脚来模拟的,通信协议比较麻烦,写程序很麻烦的,又何苦呢?

一个数据是:0x73 (二进制是:01110011b),IIC通信时序是有最高位开始传输,比如要写 *** 作这个数据首先传输最高位,取第7位(0)(由dat&0x80完成),当scl拉底就传输完一位,然后就是第6位(1),所以要左移一位(dat=dat<<1完成),再进行传输.

这样直到传输完第0位为止,一个数据的写 *** 作就完成.总共8次for(i=0i<8i++)

读 *** 作同理.不过注意方向是接受数据.

我把iic通信的代码给你吧

/**************************************

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

**************************************/

/*******************************/

void delay(unsigned int k)

{

unsigned int i,j

for(i=0i<ki++)

{

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

{}}

}

/**************************************

延时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=0i<8i++) //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=0i<8i++) //8位计数器

{

dat <<= 1

SCL = 1 //拉高时钟线

Delay5us()//延时

dat |= SDA//读数据

SCL = 0 //拉低时钟线

Delay5us()//延时

}

return dat

}

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


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

原文地址: https://outofmemory.cn/yw/12037965.html

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

发表评论

登录后才能评论

评论列表(0条)

保存