19.IIC通信:PCF8591:数模/模数转换芯片

IIC通信

IIC总线是双向、二线制、同步串行总线,是一种多向控制总线,即多个芯片可以连接到同一个总线结构下,每个芯片都可以作为实时数据传输的控制源。

PCF8591芯片:

PCF8591:模数/数模转换芯片,是一个单片集成、单独供电、低功耗、8-bit CMOS数据获取器件,具有4个模拟输入、1个模拟输出和一个串行IIC总线接口。原理图如下:
在这里插入图片描述
1个模拟输出:AOUT引脚,接在外部排针OUT上(比赛没有涉及过DA输出);
4个模拟输入:AIN0接在外部排针(可以由外部输入模拟信号),AIN1接在光敏电阻,AIN2接在LM324放大器,AIN3接在滑动变阻器Rb2,比赛没有使用过AIN0和AIN2。光敏电阻和滑动变阻器原理图如下:
在这里插入图片描述
如何确定使用的是IIC总线系统的PCF8591芯片——发送PCF8591的有效地址到器件(发送的第一个字节)
在这里插入图片描述

IIC_SendByte(0x90);		//写IIC_SendByte(0x91);		//读

紧接着发送控制字到PCF8591 将被存储在控制寄存器,用于控制器件功能。(发送的第二个字节)
在这里插入图片描述
控制寄存器的高半字节用于允许模拟输出,和将模拟输入编程为单端或差分输入。低半字节选择一个由高半字节定义的模拟输入通道。(见芯片手册)通道3捕获模拟信号输入:0X03;允许模拟信号输出:0X40。

读模式的总线协议,A/D转换:
在这里插入图片描述

uchar AD_Read(uchar add)
{
	uchar temp;
	//IIC写
	IIC_Start();
	IIC_SendByte(0X90);
	IIC_WaitAck();
	IIC_SendByte(add);
	IIC_WaitAck();
	IIC_Stop();
	//IIC读
	IIC_Start();
	IIC_SendByte(0X91);
	IIC_WaitAck();
	temp=IIC_AckByte();
	IIC_Stop();
	//返回temp值
	return temp;
}

写模式的总线协议,D/A转换:
在这里插入图片描述

void AD_Write(uchar dat)
{
	IIC_Start();
	IIC_SendByte(0X90);
	IIC_WaitAck();
	IIC_SendByte(0X40);
	IIC_WainAck();
	IIC_SendByte(dat);
	IIC_WaitAck();
	IIC_Stop();
}

综上读写程序,我们可以总结出,使用PCF8591芯片的步骤:
1.开启IIC;2.发送PCF8591的写有效地址;3.发送控制字确定输入或输出地址;4.如果需要写入数据,则控制字确定的是模拟输出模式,紧接着写入数据;如果需要读出数据,则控制字确定的是从通道0~3之一捕获模拟信号输入,关闭并重新开启IIC,发送PCF8591的读有效地址,通过IIC获取数据。5.关闭IIC,如果是读取数据则需返回值。

猜你喜欢

转载自blog.csdn.net/qq_44628230/article/details/104492239