上学期用过这款芯片,主要还是IIC的应用……
原理的话没有太多时间深究了,主要还是应用

芯片引脚图

在这里插入图片描述

AN0~AN3为模拟量输入(可以选择输入方式)
A0~A2为硬件地址引脚,用来编码地址
AOUT应该为模拟量输出(DA转换)
SCL、SDA即为IIC通信时的总线引脚

设备地址

在这里插入图片描述
高四位为固定的编码,用来标识PCF8591,第四位就是硬件引脚+读写位

控制字

在这里插入图片描述

第6位:控制模拟量输出使能
第5和4位:模拟量输入的方式
第2位:自动增量使能,每次A/D 转换后通道号将自动增加
第1和0位:模拟输入的通道选择
在这里插入图片描述

根据原理图可以确定硬件设备地址

AD转换的操作

分别来看写和读的时序
写:

在这里插入图片描述
读:
在这里插入图片描述

若要完成一次AD转换,应严格按照时序图进行:
开启总线-----发送地址+写-----发送控制字节-----等待PCF8591响应-----停止总线-----重新启动总线-----发送地址+读------读取数据-----主机发送非应答信号-----停止总线

利用之前的IIC总线的驱动完成PCF8591的AD转换

//读取AD转换后得到的值
void Read_PCF8591()
{
	IIC_Start();
	IIC_SendByte(0x90);
	IIC_WaitAck();
	IIC_SendByte(0x03);
	IIC_WaitAck();
	IIC_Stop();
	
	IIC_Start();
	IIC_SendByte(0x91);
	IIC_WaitAck();
	signal=IIC_RecByte();
	IIC_SendAck(1);
	IIC_Stop();
}

切记:每一次发送完数据都要调用等待应答函数,否则读数将出现问题!(之前一直显示127,后来发现发完读命令后忘记等待应答了……)
还有就是延时函数要调整,把宏定义改为25!

Reference
https://www.cnblogs.com/whik/p/6650955.html
https://blog.csdn.net/ohy3686/article/details/86721281