【蓝桥杯单片机】PCF8591笔记

一、相关概念与基础知识

AD转换:模拟信号(电压值)到数字信号(8位0-255),为输入。

DA转换:数字信号(8位0-255)到模拟信号(电压值),为输出。

在蓝桥杯开发板上,参考电压为5V,PCF8591寄存器为8位。

设当前模拟信号为X(0-5),对应数字信号为Y(0-255),有计算公式  \frac{X}{5}= \frac{Y}{255} 。

二、PCF8591的控制字

第7位:默认0。

第6位:如果进行DA模拟输出,置1。

第5、4位:AD模拟输入选择,选择00四路单端输入即可。

第3位:默认0。

第2位:自动增益选择,置0即可。

第1、0位:A/D通道选择,由原理图可知,00为空引脚,用于后续扩展或DA输出,01为光敏,10为LM324,11为电位器。

三、芯片手册须知

1.通信协议是IIC,数据手册没有提供时序,可以参照AT24C02编写。

2.器件地址

3.控制字:相关已在上文叙述。

四、代码实现

//=====PCF8591 AD输入函数=====//
unsigned char PCF8591_Read(unsigned char control)
{
	unsigned char temp = 0;
	
	I2CStart();
	I2CSendByte(0x90);  //器件地址为10010000,即0x90
	I2CWaitAck();
	I2CSendByte(control); //写控制字和读取的通道
	I2CWaitAck();
	I2CStart();
	I2CSendByte(0x91);
	I2CWaitAck();
	temp = I2CReceiveByte();
	I2CSendAck(1);
	I2CStop();
	return temp;
}


//=====PCF8591 DA输出函数=====//
void PCF8591_Write(unsigned char dat)
{
	I2CStart();
	I2CSendByte(0x90); //器件地址为10010000,即0x90
	I2CWaitAck();
	I2CSendByte(0x43); //控制字,输出时第6位置1,电位器通道11是否必要存疑,等有万用表测试一下
	I2CWaitAck();
	I2CSendByte(dat); //输出的电压数字信号值
	I2CWaitAck();
	I2CStop();
}


//使用示例
V_IN1 = PCF8591_Read(0x43); //开启DA输出的同时,AD读取11电位器通道
V_IN2 = PCF8591_Read(0x03); //只进行AD读取11电位器通道

PCF8591_Write(204); //DA输出204对应的电压值到J3的19

五、注意事项

1.在进行模拟量与数字量的换算时,在运算顺序上应先乘再除,防止中间数值过小被忽略。

2.例如采样AIN1(光敏)通道电压,并转换实际电压值,在数码管上显示,注意数据类型的使用。

unsigned char AIN1 = 0; //存储读取到的原始字节数据0-255
float AIN1_F = 0; //利用公式计算电压值,使用浮点类型
unsigned int AIN1_smg = 0; //数码管显示使用int类型存储,此处将小数点乘10^n为整数便于显示

3.控制字决定了是AD还是DA还是都要、AD的通道(光敏、电位器)。DA输出Write参数是写入的二进制数值0-255,AD输入Read参数是读取的通道是哪个,而读取通道就是控制字设置的,所以就是把控制字作为参数发送,然后再return得到读到的电压值0-255。

注:本笔记仅作个人学习使用。

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值