pcf8591简明教程 及 51单片机最大只能读到127问题解决

解决问题

今天在使用pcf8591读取电压的时候发现,pcf8591读取的到数据最大只有127,由于pcf8591读取到为8位的数据,所以正常读取到的最大值应该是255,但是我试了好多次发现都是127,最后发现问题出现在发送读取命令后没有waitask,导致读取时出现的数据的丢失。
在这里插入图片描述
如图所示,添加了图中高亮的行后问题待到解决。

总结

pcf8591使用iic总线进行通信,使用的时候一定要弄清iic总线的时序,通信规则,如果读到的数据出现的问题,应该首先考虑读取通信过程是否出现了问题。

器件地址

在这里插入图片描述
高三位为固定值,A2 A1 A0 根据对应引脚上的电平高低来写,最低们为读写控制,读为1写为0

控制字格式

在这里插入图片描述
最高位固定为0,第7位允许模拟电压输出,56位模拟他就是输入方式,一般为00单端输入。在这里插入图片描述
共四种,
第4位默认0,第3位自动增加,开启后每次读会把通信数加一。
第一二位为通道选择位,按以下规则。
在这里插入图片描述

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
基于PCF8591芯片AD DA实验例程C51单片机KEIL源码工程文件5个合集: PCF8591 1602液晶显示 PCF8591 1路AD数码管显示 PCF8591 4路AD数码管显示 PCF8591 DA输出模拟 PCF8591 输出锯齿波 main() { unsigned char num=0,i; unsigned char temp[7];//定义显示区域临时存储数组 float Voltage; //定义浮点变量 LCD_Init(); //初始化液晶 DelayMs(20); //延时有助于稳定 LCD_Clear(); //清屏 while (1) //主循环 { for(i=0;i<5;i++)//连续读5次,取最后一次,以便读取稳定值 num=ReadADC(0); //读取第1路电压值,范围是0-255 Voltage=(float)num*5/256; //根据参考电源VREF算出时间电压,float是强制转换符号,用于将结果转换成浮点型 sprintf(temp,"V0 %3.2f ",Voltage);//格式输出电压值,%3.2f 表示浮点输出,共3位数,小数点后2位 LCD_Write_String(0,0,temp); for(i=0;i<5;i++) num=ReadADC(1); Voltage=(float)num*5/256; sprintf(temp,"V1 %3.2f ",Voltage); LCD_Write_String(8,0,temp); for(i=0;i<5;i++) num=ReadADC(2); Voltage=(float)num*5/256; sprintf(temp,"V2 %3.2f ",Voltage); LCD_Write_String(0,1,temp); for(i=0;i<5;i++) num=ReadADC(3); Voltage=(float)num*5/256; sprintf(temp,"V3 %3.2f ",Voltage); LCD_Write_String(8,1,temp); //主循环中添加其他需要一直工作的程序 DelayMs(200); } } /*------------------------------------------------ 读AD转值程序 输入参数 Chl 表示需要转换的通道,范围从0-3 返回值范围0-255 ------------------------------------------------*/ unsigned char ReadADC(unsigned char Chl) { unsigned char Val; Start_I2c(); //启动总线 SendByte(AddWr); //发送器件地址 if(ack==0)return(0); SendByte(0x40|Chl); //发送器件子地址 if(ack==0)return(0); Start_I2c(); SendByte(AddWr+1); if(ack==0)return(0); Val=RcvByte(); NoAck_I2c(); //发送非应位 Stop_I2c(); //结束总线 return(Val); } /*------------------------------------------------ 写入DA转换数值 输入参数:dat 表示需要转换的DA数值,范围是0-255 ------------------------------------------------*/ /*bit WriteDAC(unsigned char dat) { Start_I2c(); //启动总线 SendByte(AddWr); //发送器件地址 if(ack==0)return(0); SendByte(0x40); //发送器件子地址 if(ack==0)return
要将 PCF8591 与 C51 单片机连接起来,需要按照以下步骤进行: 1. 将 PCF8591 的VCC引脚连接到单片机的正电源上,将GND引脚连接到单片机的地线上。 2. 将 PCF8591 的SDA引脚连接到单片机的P1.1引脚上,将 SCL 引脚连接到单片机的P1.0引脚上。 3. 在程序中使用相应的代码进行初始化,设置 PCF8591 的工作模式和通道,然后读取或写入数据。 例如,以下是一个简单的示例程序: ``` #include <reg51.h> sbit SCL=P1^0; //定义I²C总线SCL引脚 sbit SDA=P1^1; //定义I²C总线SDA引脚 void i2c_start(void); //I²C总线起始信号 void i2c_stop(void); //I²C总线停止信号 void i2c_write(unsigned char dat); //向I²C总线上写数据 unsigned char i2c_read(void); //从I²C总线上读数据 void pcf8591_init(void) //初始化PCF8591 { i2c_start(); //发送起始信号 i2c_write(0x90); //写入器件地址 i2c_write(0x00); //写入控制字节,选择模拟输入通道0 i2c_stop(); //发送停止信号 } void main() { unsigned char dat; pcf8591_init(); //初始化PCF8591 while(1) { i2c_start(); //发送起始信号 i2c_write(0x90); //写入器件地址 i2c_write(0x40); //写入控制字节,启动A/D转换 i2c_stop(); //发送停止信号 i2c_start(); //发送起始信号 i2c_write(0x91); //写入器件地址,准备读取数据 dat = i2c_read(); //读取数据 i2c_stop(); //发送停止信号 //将读取到的数据进行处理,例如输出到LED显示器 } } void i2c_start(void) { SDA=1; SCL=1; SDA=0; SCL=0; } void i2c_stop(void) { SDA=0; SCL=1; SDA=1; } void i2c_write(unsigned char dat) { unsigned char i; for(i=0;i<8;i++) { SDA=(dat&0x80)>>7; SCL=1; SCL=0; dat<<=1; } SDA=1; SCL=1; SCL=0; } unsigned char i2c_read(void) { unsigned char i,dat=0; SDA=1; for(i=0;i<8;i++) { SCL=1; dat<<=1; dat|=SDA; SCL=0; } return dat; } ``` 这个程序中,首先调用 pcf8591_init() 函数初始化 PCF8591,然后在 while 循环中不断读取 PCF8591 的模拟输入通道0的数据,并将其输出到 LED 显示器等设备上。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值