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,如果是读取数据则需返回值。