欢迎你们关注个人我的博客:www.wangchaochao.top
或微信扫码关注个人公众号
PCF8591 是单电源,低功耗8 位CMOS 数据采集器件,具备4 个模拟输入、一个输出和一个串行I2C 总线接口。3 个地址引脚A0、A1 和A2 用于编程硬件地址,容许将最多8 个器件链接至I2C总线而不须要额外硬件。PCF8591因为其使用的简单方便和集成度高,在单片机应用系统中获得了普遍的应用,这篇文章是介绍IIC通讯在ADDA转换芯片PCF8591中的应用。html
IIC总线通讯协议的介绍在"基于51单片机IIC通讯的AT24C02学习笔记"有详细的介绍。git
PCF8591是单片、单电源低功耗8位CMOS数据采集器件,具备4个模拟输入、一个输出和一个串行I2C总线接口。3个地址引脚A0、A1 和A2 用于编程硬件地址,容许将最多8个器件链接至I2C总线而不须要额外硬件。器件的地址、控制和数据经过两线双向I2C总线传输。器件功能包括多路复用模拟输入、片上跟踪和保持功能、8位模数转换和8位数模拟转换。最大转换速率取决于I2C总线的最高速率。算法
PCF8591的操做和AT24C02很是相似,只不过AT24C02是写入或读出数据,而PCF8591是AIN端口输入模拟电压,而后PCF8591将转换后的数字量经过IIC总线发送给单片机,或是单片机经过IIC总线给一个数字量,而后PCF8591经过AOUT端口将模拟电压输出.编程
最高位默认为0微信
第6位是选择是否容许模拟电压输出,在DA转换时设置为1,AD转换时设置为0或1都可markdown
第5/4位是选择模拟电压输出方式,通常选择00单端输入方式,其余的几种方式以下图所示并发
第3位默认为0模块化
第2位是自动增量使能位,若是自动增量(auto-increment)标志置1,每次A/D 转换后通道号将自动增长。函数
第1/0为是在AD转换时选择哪个通道输入的电压转换为数字量.post
每个IIC器件都有一个器件地址,来区分不一样的IIC设备,下面是PCF8591的地址
它的地址是由1001和A2A1A0组成的,在原理图中能够看出,A2A1A0均为0,因此器件地址为0x90/0x91,最后一位是读写方向位,0表示下一个字节往总线上写数据,1表示下一个字节从总线上读取数据.
AD转换即将AIN端口输入的模拟电压转换为数字量并发送到总线上,能够知道该函数须要指定输入的通道,还要将转换后的数字量返回,因此该函数有返回值,和一个形参
程序实现:
/*读取某一个通道转换后的数字量*/
uchar Read_D(uchar Channel)
{
uchar dat;
start();
write_byte(0x90); //器件地址+0
ack();
write_byte(Channel); //控制字0x01表示通道1
ack();
start();
write_byte(0x91); //器件地址+1,下一个字节要读取
ack();
dat=read_byte();
ack();
stop();
// AD_led=0; //转换成功显示
return dat;
}
DA转换即将从总线上接收到的数字量经过AOUT输出,该函数无返回值,有一个形参
程序实现:
void Out_A(uchar Digital) { start(); write_byte(0x90); //器件地址+0,下一个字节为写入 ack(); write_byte(0x40); //设置控制字 0100 0000 容许模拟输出,不自增单端 ack(); write_byte(Digital); //将要转换的数字量写入 ack(); stop(); // DA_led=0; //转换成功显示 }
咱们能够用一个转换公式,将AD转换后的数字量转换为对应的电压值,在数码管或液晶上显示,公式以下:
#define fun(x) (int)(5*x/255.0*100+0.5) //数字电压x转换为模拟电压的公式
dat1 = Read_D(0x01); //将通道1(电位器v2)的模拟电压转换的数字量读出 Out_A(dat1); //将数字量转换为模拟量输出到led显示 dis_Voltage1(fun(dat1)); //数码管显示电压值 Delay_Ms(5); //延时缓冲
这样就能够实时显示输入的电压值了.还能够将电压值输出到led亮度显示出来.这样就能够做为一个简易的小量程(5v)的电压表了
从程序能够看出PCF8591的操做和AT24C02基本一致,就是增长了控制字的内容,相比于其余的ADDA转换芯片,它结构简单,不须要外围的电路,能够直接使用,并且容易实现模块化设计,在大多数单片机系统中ADDA几乎是不可缺乏的,而PCF8591只须要两个IO口(时钟和数据)和电源就能够实现,大大节省了IO口的使用。
关于AT24C02的使用,请看我另外一篇随笔:“基于51单片机IIC通讯的AT24C02学习笔记”
个人其余博文: