各位大侠帮忙,解释一下51单片机iic程序

各位大侠帮忙,解释一下51单片机iic程序,第1张

一个数据是: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吧扒锋山,我的程序是没问题的哦。


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存