IIC总线简介
1、IIC总线是一种由PHILIPS公司开发的两线式串行总线
2、IIC在硬件上是时钟总线SCL和数据总线SDA两条线构成
3、器件连接到总线都是SCL连到一起,SDA连到一起
4、任何器件都可以拉低总线的电平
IIC通信时序
IIC通信时序可分成4个部分:
1、开始信号:在SCL为高电平时,SDA产生一个下降沿
2、数据传输:在SCL为低电平时,SDA可以变化;在SCL为高电平时,读取SDA的状态
3、应答信号:先拉高SDA,然后拉高SCL,读取SDA的状态,假如是低电平说明这个地址上挂有器件,反之没有
4、结束信号:在SCL为低电平时,SDA产生一个上升沿
IIC总线寻址
这里以PCF8591为例:
1、AIN0、AIN1、AIN2、AIN3为输入端
2、AOUT为输出端
3、EXT为低电平时使用内部时钟,为高电平时使用外部时钟
4、A0、A1、A2为地址端口
5、OCS、VREF、AGND照着接相应电平就行
1、高4位是固定的:为1001
2、A2、A1、A0:这3位看器件上接的相应电平
3、R/W为读写位:0为写,1为读
主程序
/*读取是否有器件回应ACK*/
#include "reg52.h"
#include "LCD1602.h"
#include "IIC.h"
unsigned char shu[5];
void main()
{
bit ack;
InitLcd1602(); //初始化LCD1602这里没有给出
iic_Start(); //开始信号
ack = iic_SendByte(0x92); //读取ACK
iic_Stop(); //结束信号
shu[0]= '9';
shu[1]= '2';
shu[2]= ':';
shu[3]= (unsigned char)ack+'0';
shu[4]= '\0';
LcdShowStr2(0,0,shu); //LCD1602显示函数,这里没有给出
}
IIC.h
#include "intrins.h"
//总线引脚定义
sbit SDA = P3^6; /* 数据线 */
sbit SCL = P3^7; /* 时钟线 */
void iic_Delay() {_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();}
void iic_Start()
{
SCL = 1;
SDA = 1;
iic_Delay();
SDA = 0;
iic_Delay();
SCL = 0;
}
void iic_Stop()
{
SCL = 0;
SDA = 0;
iic_Delay();
SCL = 1;
iic_Delay();
SDA = 1;
iic_Delay();
}
/*写操作*/
bit iic_SendByte(unsigned char byt)
{
bit ack = 0;
unsigned char mask;
for(mask=0x80;mask!=0;mask>>=1)
{
if((byt&mask) == 0)
SDA = 0;
else
SDA = 1;
iic_Delay();
SCL = 1;
iic_Delay();
SCL = 0;
}
SDA = 1;
iic_Delay();
SCL = 1;
ack = SDA;
iic_Delay();
SCL = 0;
return ack;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)