IIC通信总线寻址

IIC的使用

  • IIC总线简介
  • IIC通信时序
  • IIC总线寻址

IIC总线简介

1、IIC总线是一种由PHILIPS公司开发的两线式串行总线
2、IIC在硬件上是时钟总线SCL和数据总线SDA两条线构成
3、器件连接到总线都是SCL连到一起,SDA连到一起
4、任何器件都可以拉低总线的电平

IIC通信时序

IIC通信总线寻址_第1张图片

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照着接相应电平就行

IIC通信总线寻址_第2张图片

IIC通信总线寻址_第3张图片
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;			
}

你可能感兴趣的:(51单片机)