找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2233|回复: 4
打印 上一主题 下一主题
收起左侧

关于PCF8591寻址

[复制链接]
跳转到指定楼层
楼主
最近看到网上很多PCF8591程序,如下
  • /* 读取当前的 ADC 转换值,chn-ADC 通道号 0~3 */
  • unsigned char GetADCValue(unsigned char chn){
  •     unsigned char val;
  •     I2CStart();
  •     if (!I2CWrite(0x48<<1)){ //寻址 PCF8591,如未应答,则停止操作并返回 0
  •         I2CStop();
  •         return 0;
  •     }
  •     I2CWrite(0x40|chn); //写入控制字节,选择转换通道
  •     I2CStart();
  •     I2CWrite((0x48<<1)|0x01); //寻址 PCF8591,指定后续为读操作
  •     I2CReadACK(); //先空读一个字节,提供采样转换时间
  •     val = I2CReadNAK(); //读取刚刚转换完的值
  •     I2CStop();
  •     return val;
  • }


其中第五行寻址为什么要写成0X48<<1  ,  为什么不能直接写成0X90??反正这芯片的寻址是如图


还有转换的电压是怎么计算的,为什么要乘25? 本人刚学,希望大神来指导一下。
  • void ValueToString(unsigned char *str, unsigned char val)
  • {
  •     val = (val*25) / 255;
  •     str[0 = (val/10) + '0'; //整数位字符
  •     str[1 = '.'; //小数点
  •     str[2 = (val%10) + '0'; //小数位字符
  •     str[3 = 'V'; //电压单位
  •     str[4 = '\0'; //结束符
  • }

寻址.png (25.05 KB, 下载次数: 56)

寻址.png
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:111634 发表于 2018-7-25 16:28 | 只看该作者
你的问题不是三言两语能说清,需要系统学习。介绍你一本书,《80C51单片机实用教程——基于Keil C和Proteus》高等教育出版社ISBN 978-7-04-044532-9。内有IIC和PCF8591内容。
回复

使用道具 举报

板凳
ID:1078938 发表于 2023-5-21 19:16 | 只看该作者
其中第五行寻址为什么要写成0X48<<1  ,  为什么不能直接写成0X90??

看的是金沙滩宋老师的视频吧。0x48 = 0100 1000.这里是宋老师的写法原因,左移一位得到1001 0000.
这时候查阅PCF8591手册,这是写地址。1001手册规定是0,后三位A2 ,A1,A1根据电路图选位0,最后一位是读写位。

Snipaste_2023-05-21_19-14-44.jpg (19.12 KB, 下载次数: 41)

Snipaste_2023-05-21_19-14-44.jpg
回复

使用道具 举报

地板
ID:883242 发表于 2023-5-21 22:55 | 只看该作者
0x48是把LSB的R/W去掉,看起来比较清楚的意思,实际上更不清楚了,0x48<<1这个操作在编译器阶段就已经计算完毕,并不会增加单片机运行期间的工作量。
回复

使用道具 举报

5#
ID:526543 发表于 2023-5-22 13:35 | 只看该作者
对于 PCF8591 芯片的寻址,它使用 7 位的地址(A6~A0)进行寻址,其中最高位(MSB)是固定为 0。因此,当我们将芯片地址写入 I2C 总线时,需要将地址左移一位,并将最低位置为 0,以与读写位进行组合。这就是为什么在代码中将地址写为 (0x48 << 1) 的原因。

以 0x48 为例,二进制表示为 0100 1000,左移一位后为 1001 0000,再将最低位置为 0,即 1001 0000(0x90)为写操作,1001 0001(0x91)为读操作。这样可以确保正确的地址与读写位组合。

关于电压的转换,PCF8591 是一个 8 位 ADC(模数转换器),它将输入电压转换为数字值。该芯片的输入范围是 0V 到 Vref(供电电压),对应于 0 到 255 的数字范围。因此,通过读取 ADC 转换值,可以得到输入电压对应的数字值。

在给定的程序中,val 变量存储了 ADC 转换的结果,即输入电压对应的数字值。为了得到电压值,将 val 乘以系数 25。这个系数是根据特定的应用场景和参考电压(Vref)来确定的。具体的系数值可能需要根据实际情况进行调整。

总结一下,程序中的代码实现了对 PCF8591 芯片进行读取 ADC 转换值的操作,通过寻址和写入控制字节选择转换通道,并读取转换结果。转换结果可以通过乘以系数得到相应的电压值。请注意,具体的芯片规格和应用需求可能会有所不同,这里提供的解释是基于一般情况的理解。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表