引言

PCF8591 是单电源,低功耗8 位CMOS 数据采集器件,具有4 个模拟输入、一个输出和一个串行I2C 总线接口。3 个地址引脚A0、A1 和A2 用于编程硬件地址,允许将最多8 个器件连接至I2C总线而不需要额外硬件。PCF8591由于其使用的简单方便和集成度高,在单片机应用系统中得到了广泛的应用,这篇文章是介绍IIC通信在ADDA转换芯片PCF8591中的应用。

关于IIC

IIC总线通信协议的介绍在"基于51单片机IIC通信的AT24C02学习笔记"有详细的介绍。

关于PCF8591

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均可

第5/4位是选择模拟电压输出方式,一般选择00单端输入方式,其他的几种方式如下图所示

第3位默认为0

第2位是自动增量使能位,如果自动增量(auto-increment)标志置1,每次A/D 转换后通道号将自动增加。

第1/0为是在AD转换时选择哪一个通道输入的电压转换为数字量.

PCF8591的器件地址

每一个IIC器件都有一个器件地址,来区分不同的IIC设备,下面是PCF8591的地址

它的地址是由1001和A2A1A0组成的,在原理图中可以看出,A2A1A0均为0,所以器件地址为0x90/0x91,最后一位是读写方向位,0表示下一个字节往总线上写数据,1表示下一个字节从总线上读取数据.

AD转换函数

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转换函数

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学习笔记

参考资料:

PCF8591_百度百科

iic_百度百科

我的其他博文:

欢迎大家关注我的个人博客www.wangchaochao.top

或微信扫码关注我的公众号

 
 
 

基于51单片机IIC通信的PCF8591学习笔记的更多相关文章

  1. 基于51单片机IIC通信的AT24C02学习笔记

    引言 最近在学习几种串行通信协议,感觉收获很多,这篇文章是学习IIC总线协议的第一篇文章,以后还会再写一篇关于PCF8591 IIC通信的ADDA转换芯片的文章. 关于IIC总线 IIC 即Inter ...

  2. 51单片机RAM 数据存储区学习笔记

    转自:http://www.eepw.com.cn/article/216237_2.htm 1.RAM keil C语言编程 RAM是程序运行中存放随机变量的数据空间.在keil中编写程序,如果当前 ...

  3. ET 与RETI 基于51单片机中断跳出指令“RETI”浅议

    最近在基于51单片机编程的过程中出现了个很奇怪的问题“程序执行中在寄存器EA=1,ET0=1,TR0=1条件下,单TF0=1时并没有执行中断”.在有过单片机中断编程经历者都知道当EA=1,ET0=1的 ...

  4. 基于51单片机个LCD1602的万年历程序

    小白 第一次跟新博客 基于51单片机和LCD1602的万年历程序 可实现走时和调时功能 有简单的1602菜单制作 欢迎大家交流 LCD1602和51单片机的连接方法 RS = P3^5; //数据/命 ...

  5. 基于51单片机的CAN通讯协议C语言程序

      //-----------------------函数声明,变量定义-------------------------------------------------------- #includ ...

  6. Flex与51单片机socket通信 策略问题

    直接把<cross-domain-policy> <allow-access-from domain="*" to-ports="*"/> ...

  7. 基于jdk1.8的HashMap源码学习笔记

    作为一种最为常用的容器,同时也是效率比较高的容器,HashMap当之无愧.所以自己这次jdk源码学习,就从HashMap开始吧,当然水平有限,有不正确的地方,欢迎指正,促进共同学习进步,就是喜欢程序员 ...

  8. 线程之间的通信socketpair【学习笔记】【原创】

    平台信息:内核:linux3.1.0系统:android5.0平台:tiny4412 作者:庄泽彬(欢迎转载,请注明作者) 说明: 韦老师的安卓视频学习笔记 一.在一个进程中多个线程如何进行通信,主要 ...

  9. 基于【 MySql 】二 || mysql详细学习笔记

    mysql重点学习笔记 /* Windows服务 */ -- 启动MySQL net start mysql -- 创建Windows服务 sc create mysql binPath= mysql ...

随机推荐

  1. linux 之 tcpdump

    tcpdump详细命令 -i 参数指定监听网口 -c 参数指定监听的数据包数量 -s 参数指定监听数据包大小 -w 参数指定监听数据包写入文件 如果要监听某几台主机数据包 例如10.10.10.10. ...

  2. 中药饮片ERP案例

    企业简介 [规模] 苏州市天灵中药饮片有限公司成立于2002年,为苏州首家中药饮片GMP认证企业.公司品牌“李良济”首创于1914年民国初,祖传三代,为中华老字号企业.目前,公司经营主要分为三大块:中 ...

  3. Bat再次小试

    继<Bat小试牛刀>之后,今天又需要一个小的bat文件.需求是这样的,有一个windows服务(服务名:xxxx,进程映像名:xxxx.exe)被数据库拖慢了,但目前又没时间调整代码,所以 ...

  4. 瞎谈CNN:通过优化求解输入图像

    本文同步自我的知乎专栏: From Beijing with Love 机器学习和优化问题 很多机器学习方法可以归结为优化问题,对于一个参数模型,比如神经网络,用来表示的话,训练模型其实就是下面的参数 ...

  5. 类似于qq空间类型的评论和回复

    最近学习thinkphp,做了一个博客系统,其中感觉实现一个类似于qq空间的评论和回复功能比较复杂,所以把这次的经历记录下来,与大家共勉,具体的方法就不说了,在这里分享一下思路. 目标就是这种,关键是 ...

  6. 解决AJAX在火狐,谷歌都能正常运行,而IE不行的问题

    如图所示: 经过一系列测试,并不是data参数的问题,也不是if...else...判断的问题,居然是console.log()将函数阻拦住了,百度了下说低版本的IE不支持console.log(), ...

  7. Solr vs. Elasticsearch谁是开源搜索引擎王者

    当前是云计算和数据快速增长的时代,今天的应用程序正以PB级和ZB级的速度生产数据,但人们依然在不停的追求更高更快的性能需求.随着数据的堆积,如何快速有效的搜索这些数据,成为对后端服务的挑战.本文,我们 ...

  8. servlet匹配规则和顺序

    1.  写法 ①完全匹配:以“/”开头,以字母(非“*”)结束    如:<url-pattern>/test/list.do</url-pattern> ②目录匹配:以“/” ...

  9. 基于JAVA语言的selenium测试基础总结

    目录一.基本语句1.循环控制(break,continue)3.字符的替换(replace,repalceFirst,replaceAll,regex)4.字符串的连接("+",a ...

  10. 009 Java集合浅析4

    前面一篇教程中,我们分析了List派别中的最常见也最重要的一个类ArrayList<E>.从我们的分析来看,ArrayList作为动态数组的模拟,使用的是连续内存空间来存储数据,带来了可随 ...