PCF8591模组介绍
PCF8591是单片,单电源低功耗8位CMOS数据采集期间,具有4个模拟输入,一个输出和一个串行I2C总线接口,3个地址引脚A0,A1,A2用于编程硬件地址,允许将最多8个器件连接至I2C总线而不需要额外硬件。此芯片可应用于电池供电设备,汽车,音响和TV应用方面的模拟数据采集,我今天使用的是直接做好的模组进行模组上自带变阻器的电压的采集可应用于制作电压表。具体模组图片如下。
模块引脚及原理图
模块可自行配置跳线帽决定使用哪一路的AD转换以及配合控制字节进行转换,模块本身固定了A0,A1,A2的引脚直接接到GND也就是固定模组的器件地址为0X90,基准电压直接接到VCC因此基准电压为5V。
具体地址和控制字节
IIC总线系统中的每一片PCF8591通过发送有效地址到该器件来激活。该器件地址包括固定部分和可编程部分,期间地址包括固定部分和可编程部分,通过A0,A1,A2三个引脚电平来设置,地址的最后一位为读/写控制位。
控制字节:
具体程序流程
编写基本的IIC通信时序:
void Start_I2c()
{
SDA=1; /*发送起始条件的数据信号*/
_Nop();
SCL=1;
_Nop(); /*起始条件建立时间大于4.7us,延时*/
_Nop();
_Nop();
_Nop();
_Nop();
SDA=0; /*发送起始信号*/
_Nop(); /* 起始条件锁定时间大于4μs*/
_Nop();
_Nop();
_Nop();
_Nop();
SCL=0; /*钳住I2C总线,准备发送或接收数据 */
_Nop();
_Nop();
}
/*******************************************************************
结束总线函数
函数原型: void Stop_I2c();
功能: 结束I2C总线,即发送I2C结束条件.
********************************************************************/
void Stop_I2c()
{
SDA=0; /*发送结束条件的数据信号*/
_Nop(); /*发送结束条件的时钟信号*/
SCL=1; /*结束条件建立时间大于4μs*/
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
SDA=1; /*发送I2C总线结束信号*/
_Nop();
_Nop();
_Nop();
_Nop();.............剩下的不敲写了
}
主要写下实时电压在LCD1602上面的显示转换函数。
void Display_Voltage()
{
ss=(v*a);
ss=((ss*6)/100);
LCD1602_write_com(0x80+0x09); //1602液晶屏命令操作,表示起始显示位置为第二行第7列
LCD1602_write_data(ss%10000000/1000000 + 0x30);
LCD1602_write_data(ss%1000000/100000 + 0x30);
LCD1602_write_data('.');
LCD1602_write_data(ss%100000/10000 + 0x30);
LCD1602_write_data(ss%10000/1000 + 0x30);
}
具体效果可参考下图
通过调节电位器获取实时电压。
小结
此程序可变相的应用于一些小单片机的设计中,例如用51单片机做一个小电压表或者实时检测一些外来的数据,当然需要进行其他的数据处理,长期发布此类文章,对代码有需求的可下方留言邮箱获取,谢谢大家的支持。