51单片机IIC总线通信

51单片机IIC总线通信,第1张

我把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吧扒锋山,我的程序是没问题的哦。

IIC协议有讲的,橘租每一次传输都有

起始

应答

错误

总线忙

非圆猜兆应答

等信号格式

NoACK就是非应答,兆侍他告诉iic传输的是最后一个数据,TestAck()

是发送一个字后等待从机应答


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

原文地址: http://outofmemory.cn/yw/12276414.html

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

发表评论

登录后才能评论

评论列表(0条)

保存