【雕爷学编程】Arduino动手做(134)---PCF8574T扩展模块

发布时间 2023-06-28 13:07:54作者: 行者花雕

7款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞不掂的问题,希望能够抛砖引玉。

 

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)

实验一百三十四:I2C接口I/O扩展模块 支持级联PCF8574T模块

 

 

PCF8574T

是CMOS电路,它通过两条双向总线可使大多数MCU实现远程I/O扩展。该器件包含一个8位准双向口和一个总线接口。pcf8574t 电流消耗很低,并且输出锁存,具有大电流驱动能力,可直接驱动LED。它还带有一种中断接线可与MCU的中断逻辑相连。通过INT发送中断信号,远端I/O口不必经过总线通信就通知MCU是否有数据从端口输入。这意味着 pcf8574t 可以作为一个单被控器。

 

PCF8574逻辑图

 

各P口输入输出简化示意图

 

 

 

双线双向总线(I2C)的8位输入/输出(I/O)扩展器
设计用于2.5-V至6-V VCC操作。PCF8574通过I2C为大多数微控制器系列提供通用远程I/O扩展接口[串行时钟(SCL),串行数据(SDA)。该设备具有一个8位准双向I/O端口(P0–P7),包括带有大电流驱动的锁存输出直接驱动LED的能力。每个准双向I/O都可以用作输入或输出,而无需使用数据方向控制信号。开机时,I/O很高。在此模式下,只有VCC的电流源活跃。另一个强大的拉向VCC允许快速上升到重负荷输出边缘。这个装置转动当输出被写入高位并被SCL的负边缘关闭时打开。I/O应该很高,在用作输入之前。PCF8574提供了一个开漏输出(int),可以连接到微控制器。在输入模式下,端口输入的任何上升或下降沿都会产生中断。后续时间,tiv,int是有效的。当端口上的数据改变时,中断电路复位并重新激活从产生中断的端口读取或写入原始设置或数据。重置发生在在SCL信号上升沿后的确认位处的读取模式,或在SCL信号从高到低转换后的确认位。确认期间发生的中断由于在该脉冲期间中断复位,时钟脉冲可能丢失(或非常短)。每次变更复位后的I/O被检测到,并且在下一个上升时钟边缘之后,被发送。作为int读取,或者写入,另一个设备不影响中断电路。通过在这条线路上发送中断信号,远程I/O可以通知微控制器是否有输入数据在其端口上,无需通过I2C总线进行通信。因此,pcf8574可以保持简单的从机装置。

 

I2C接口I/O 8位扩展 支持级联PCF8574T模块

 

 

I2C接口I/O扩展模块功能:
基于I2C接口的I/O扩展模块,使用2个I/O可扩展8个I/O。支持级联,最多可同时使用8个模块,扩张到64个I/O。通过拨码开关设置模块地址,将3位拨码开关全部拨到’ON’上。此时模块地址为0x27。

PCB Size: 37.5mm x 16.7mm

Arduino实验开源代码

 

/*

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)

  实验一百三十四:I2C接口I/O扩展模块 支持级联PCF8574T模块

  程序之一:扫描设备IIC地址,在串口上即可看到PCF8574T的地址

  Arduino------PCF8574

  5V-------------VCC

  GND-----------GND

  A4-----------SDA IIC 数据线

  A5-----------SCL IIC 时钟线

*/



#include <Wire.h>

void setup() {

  Serial.begin (115200); // 等待串行端口连接

  while (!Serial) { }

  Serial.println ();

  Serial.println ("I2C scanner. Scanning ...");

  byte count = 0;

  Wire.begin();

  for (byte i = 8; i < 120; i++) {

  Wire.beginTransmission (i);

  if (Wire.endTransmission () == 0) {

    Serial.print ("Found address: ");

    Serial.print (i, DEC);

    Serial.print (" (0x");

    Serial.print (i, HEX);

    Serial.println (")");

    count++;

    delay (1); // 也许不需要?

  } //良好反应结束

  } // 结束for循环

  Serial.println ("Done.");

  Serial.print ("Found ");

  Serial.print (count, DEC);

  Serial.println (" device(s).");

} // 运行结束

void loop() {

}

  

通过模块上拨码开关不同位置,来设置模块I2C地址

1上2上3上 为0x27

 

通过模块上拨码开关不同位置,来设置模块I2C地址

1下2上3上  为0x23

 

1下2上3上   为0x23

通过模块上拨码开关不同位置,来设置模块I2C地址

1上2上3上  为0x27

1下2上3上  为0x23

1下2下3上  为0x21

1下2下3下  为0x20

1上2下3下  为0x24

1上2上3下  为0x26

1下2上3下  为0x22

1上2下3上  为0x25

 

 

Arduino实验开源代码

 

/*

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)

 实验一百三十四:I2C接口I/O扩展模块 支持级联PCF8574T模块

  程序之二:每隔2秒钟,让P0~P7口输出高电平、低电平

  实验说明:本程序未能通过验证,请各位大侠帮忙看看

  Arduino------PCF8574

  5V-------------VCC

  GND-----------GND

  A4-----------SDA IIC 数据线

  A5-----------SCL IIC 时钟线

  A0-----------P0

*/



#include <Wire.h>

//初始化

void setup() {

  wire.begin();

}

unsigned char i = 0;

void loop() {

  //读取模拟管脚0上的输入

  if (i = 0)

  (

    wire.beginTransmission(0x27) ;

    wire.write(0xff);

    wire.endTransmission();

    i = 1;

  )

  else

    (

      wire.beginTransmission(0x27) ;

      wire.write(0x00);

      wire.endTransmission();

      i = 0;

    )

    delay(2000);//延迟2秒

}

  实验开源仿真编程(Linkboy V4.62)