而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吧,我的程序是没问题的哦。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)