【面试】你能说说我们一般如何应对缓存雪崩以及穿透问题吗?

阿拉伯数字转中国人民币大写字符串

  返回  

Arduino控制PCF8574

2021/7/20 17:27:17 浏览:

内容:

针对I/O扩展板PCF8574,用Arduino访问其地址,并控制I/O口输出。

实物案例用的是PCF8574T

 

PCF8574地址查询:

首先PCF8574的通信是通过I2C完成,在向扩展的I/O口发送控制信号时,需要事先找到其地址。

寻找方法如下:

#include <Wire.h> 
void setup() {
    Serial.begin (9600); 
    Wire.begin(); 
    for (byte i = 8; i < 120; i++) {
        Wire.beginTransmission (i);
        if (Wire.endTransmission () == 0) {
            Serial.println (i, DEC); //以十进制结果显示
            delay (1); 
        } 
    } 
} 

void loop() {

  }

说明:

Wire.beginTransmission (i);(主机)传输数据到指定的从机地址。

Wire.endTransmission ();(主机)结束数据传输,如果发送成功就返回0

所以整个代码就是从地址8开始,每个地址尝试发送一遍数据,有成功的即是我们的PCF的地址。

本案例的地址是32,即0x20。

PCF8574 I/O接口写操作:

我们在找到写入地址后,所要操作的8个I/O口,实际即是一个字节中8位数。

即默认下:

P7P6P5P4P3P2P1P0
00000000

 如果我们要使其中一个I/O口输出1,比如我们只让P2拉高,输出1,这时候向扩展版发送的数据即为0000 0100。即十进制下4。图为:

P7P6P5P4P3P2P1P0
00000100

所以相应代码为:

#include <Wire.h>
void setup()
{
  Wire.begin();
  Wire.beginTransmission(32);  
  Wire.write(4);
  Wire.endTransmission();//结束传送  
}
void loop()
{ 
     
}

如果我们在拉高P1和P2下时,只拉低P2,即由:

P7P6P5P4P3P2P1P0
00000110

变为:

P7P6P5P4P3P2P1P0
00000010

代码:

#include <Wire.h>
void setup()
{
  Wire.begin();
  Wire.beginTransmission(32);  
  Wire.write(6);//同时拉高2号和1号引脚
  Wire.endTransmission();//结束传送  
  delay(2000);//延迟2秒后拉低2号引脚
  Wire.beginTransmission(32);  
  Wire.write(2);
  Wire.endTransmission();//结束传送 
}
void loop()
{ 
     
}

注意:经过测试,代码每次传输数据时,都得以


  Wire.beginTransmission(32);  
  //传数据
  Wire.endTransmission();//结束传送 

这样形式进行。

多个PCF8574 I/O接口写操作:

PCF8574在串联情况下,需要变更PCF8574的地址。PCF8574的A0,A1,A2三个引脚的状态就是代表了该扩展板的不同地址。所以理论上我们最多可以同时串8块。

 

 改变I2C Address Jumper的位置就行。

最后用查询代码查询具体地址即可。

联系我们

如果您对我们的服务有兴趣,请及时和我们联系!

服务热线:18288888888
座机:18288888888
传真:
邮箱:888888@qq.com
地址:郑州市文化路红专路93号