PCF8591芯片和A/D编码

I2C总线是Philips公司推出的串行总线,整个系统仅靠数据线(SDA)和时钟线(SCL)实现完善的全双工数据传输,即CPU与各个外围器件仅靠这两条线实现信息交换。I2C总线系统与传统的并行总线系统相比具有结构简单、可维护性好、易实现系统扩展、易实现模块化标准化设计、可靠性高等优点。

在一个完整的单片机系统中,A/D(A :模拟信号 D:数字信号)转换芯片往往是必不可少的。PCF8591是一种具有I2C总线接口的A/D转换芯片。在与CPU的信息传输过程中仅靠时钟线SCL和数据线SDA就可以实现。

芯片介绍
  PCF8591是具有I2C总线接口的8位A/D及D/A转换器。有4路A/D转换输入,1路D/A模拟输出。这就是说,它既可以作A/D转换也可以作D/A转换。A/D转换为逐次比较型。引脚图如图1所示。结构图如图2所示。电源电压典型值为5V。

pcf8591 ad转换实例及程序详解

pcf8591 ad转换实例及程序详解

AIN0~AIN3:模拟信号输入端。

A0~A3:引脚地址端。

VDD、VSS:电源端(2.5~6V)

SDA、SCL:I2C总线的数据线、时钟线。

OSC:外部时钟输入端,内部时钟输出端。

EXT:内部、外部时钟选择线,使用内部时钟时EXT接地。

AGND:模拟信号地。

AOUT:D/A转换输出端。

VREF:基准电源端。

应用
  1、器件总地址

PCF8591采用典型的I2C总线接口器件寻址方法,即总线地址由器件地址、引脚地址和方向位组成。飞利蒲公司规定A/D器件地址为1001。引脚地址为A2A1A0,其值由用户选择,因此I2C系统中最多可接23=8个具有I2C总线接口的A/D器件。地址的最后一位为方向位R/ ,当主控器对A/D器件进行读操作时为1,进行写操作时为0。总线操作时,由器件地址、引脚地址和方向位组成的从地址为主控器发送的第一字节。

2、控制字节

控制字节用于实现器件的各种功能,如模拟信号由哪几个通道输入等。控制字节存放在控制寄存器中。总线操作时为主控器发送的第二字节。其格式如下所示:

pcf8591 ad转换实例及程序详解

其中:D1、D0两位是A/D通道编号:00通道0,01通道1,10通道2,11通道3

D2 自动增益选择(有效位为1)

D5、D4模拟量输入选择:00为四路单数入、01为三路差分输入、10为单端与差分配合输入、11为模拟输出允许有效。

当系统为A/D转换时,模拟输出允许为0。模拟量输入选择位取值由输入方式决定:四路单端输入时取00,三路差分输入时取01,单端与差分输入时取10,二路差分输入时取11。最低两位时通道编号位,当对0通道的模拟信号进行A/D转换时取00,当对1通道的模拟信号进行A/D转换时取01,当对2通道的模拟信号进行A/D转换时取10,当对3通道的模拟信号进行A/D转换时取11
  
**#include “PCF8591.h”
//发送一个字节数据给PCF8591
void PCF8591_Init(uchar dat) //选择的四种模式
{
IIC_Start();//发送起始信号
IIC_Sendbyte(0x90);//发送写地址
IIC_WaitAck();//等待应答
IIC_Sendbyte(dat);//发送指令
IIC_WaitAck();//等待应答
IIC_Stop();//发送停止信号
// Delay_Ms(10);//延时10ms
}
//从PCF8591中读出一个字节数据
uint PCF8591_Get(void)
{
uint dat;

IIC_Start();//发送起始信号
IIC_Sendbyte(0x91);//发送读地址
IIC_WaitAck();//等待应答
dat = IIC_Readbyte();//发送指令
IIC_ACK(0);
IIC_Stop();//发送停止信号

return dat;

}
void main(void)
{
Timer0_Init();
P0=0x00;
Enable_HC138(OT);
PCF8591_Init(3);//选择模式3
//Delay_Ms(10);//这里不能调用延时函数,否则在数码管上全部显示8个8
while(1)
{
smg_8();
display();
if(init_flag)//每隔200ms AD芯片PCF8591取数据一次
{
init_flag = 0;
volat = PCF8591_Get();
volat = volat * 5000.0 / 256;
}
}
}**

猜你喜欢

转载自blog.csdn.net/qq_42108574/article/details/84829342