首先要声明的是,如果你使用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口有什么不同等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)