【多路复用器CD74HC405x】

一、主要内容

本文主要介绍一款多路复用器,8选1,1个公共端,8个输入输出端。CD74HC4051,立创商城如图所示。
在这里插入图片描述

二、性能参数

1、工作电压。
HC系列推荐工作电压2~6V,完美适合低压使用场景,如2.5V。
HCT系列推荐工作电压4.5~5.5V.
在这里插入图片描述
2、重点参数导通电阻
在这里插入图片描述

三、疑问

1、CD74HC4051M厂家不生产了,CD74HC4051M96正常供货。两者参数,手册上看不出区别,为啥CD74HC4051M要贵一些?
网页上CD74HC4051M导通电阻写的是70R,CD74HC4051M96导通电阻写的是240R。手册上看,导通电阻应该是一样的,一个写的典型值,一个写的是极值。
在这里插入图片描述
在这里插入图片描述

### 如何在Arduino中实现多路复用器的模拟 #### 多路复用器的功能概述 多路复用器是一种电子开关装置,允许多个输入信号共享单一输出通道。这种技术广泛应用于数据采集系统、传感器网络和其他需要高效管理大量输入的应用场景。通过软件编程的方式,可以利用Arduino的数字引脚来模拟一个多路复用器的行为。 --- #### 使用Arduino模拟多路复用器的核心原理 为了实现多路复用器的功能,可以通过以下方式完成: 1. **选择输入源**:使用一组数字引脚作为地址线,指定当前要读取哪个输入信道。 2. **切换逻辑**:根据地址线上设置的状态,决定从哪一个模拟输入端口读取数据。 3. **数据处理**:将选定的数据传递给后续程序进行分析或显示。 这种方法依赖于Arduino的`analogRead()`函数以及一些简单的条件判断语句[^1]。 --- #### 示例代码:基于Arduino Mega的多路复用器仿真 假设我们有四个模拟输入(A0-A3),并通过三个数字引脚(D2-D4)作为地址线来选择其中一个输入: ```cpp // 定义地址线对应的数字引脚 const int addrPin0 = 2; // 地址位0 const int addrPin1 = 3; // 地址位1 const int addrPin2 = 4; // 地址位2 void setup() { Serial.begin(9600); // 初始化串口用于调试输出 // 设置地址线为输出模式 pinMode(addrPin0, OUTPUT); pinMode(addrPin1, OUTPUT); pinMode(addrPin2, OUTPUT); } void loop() { for (int i = 0; i < 8; i++) { // 遍历所有可能的选择(最多支持8个) digitalWrite(addrPin0, bitRead(i, 0)); // 设置最低有效位 digitalWrite(addrPin1, bitRead(i, 1)); // 设置中间位 digitalWrite(addrPin2, bitRead(i, 2)); // 设置最高有效位 if (i < 4) { // 假设只有前4个输入被实际使用 int value = analogRead(A0 + i); // 读取对应模拟输入 Serial.print("Channel "); Serial.print(i); Serial.print(": "); Serial.println(value); } delay(500); // 每次切换等待一段时间以便观察效果 } } ``` 上述代码展示了如何通过改变地址线状态依次访问不同的模拟输入,并将结果打印到串口中。注意这里仅实现了静态扫描机制;对于更复杂的动态应用,则需进一步优化算法设计。 --- #### 结合I2C协议扩展功能 当面对更多的外部设备时,考虑采用I2C总线简化布线复杂度成为一种可行方案。例如,借助专用芯片如CD74HC4067E能够轻松构建多达16路以上的模拟多路复用结构。此时只需按照标准流程初始化Wire库并与目标器件交互即可[^2]。 以下是针对此类情况的一个基础框架实例: ```cpp #include <Wire.h> #define SLAVE_ADDR 0x20 // 替换为你所使用的具体硬件地址 void requestEvent(); void receiveEvent(int howMany); void setup() { Wire.begin(SLAVE_ADDR); // 启动I2C从属角色 Wire.onRequest(requestEvent); // 注册请求事件处理器 Wire.onReceive(receiveEvent); // 注册接收事件处理器 } void loop() {} void requestEvent() { byte channelData; // 这里可以根据实际情况获取相应通道上的数值... channelData = random(0, 255); Wire.write(channelData); // 将数据返回给主机 } void receiveEvent(int howMany) { while(Wire.available()) { char c = Wire.read(); // 接收来自主机的信息 // 可在此处解析命令并调整内部配置... } } ``` 此片段定义了一个基本的服务端行为模型——响应查询的同时也接受外来指令指导操作过程。 --- #### 利用PWM生成伪多路输出 除了单纯读入之外,有时也需要向外界驱动某些负载元件形成闭环控制系统。这时就可以充分利用之前提到过的TIMER资源配合`analogWrite()`接口达成目的[^4]。 比如下面这个例子演示了怎样让LED灯阵列依据预设规律闪烁起来: ```cpp const int ledPins[] = {9, 10}; // PWM兼容管脚列表 const float brightnessLevels[] = {0.2f, 0.5f}; unsigned long previousMillis = 0; const unsigned long interval = 500; byte currentLedIndex = 0; void setup(){ for(auto pin : ledPins){ pinMode(pin,OUTPUT); } } void loop(){ unsigned long currentMillis = millis(); if(currentMillis - previousMillis >= interval){ previousMillis = currentMillis; for(byte idx=0 ;idx<sizeof(ledPins)/sizeof(*ledPins);++idx){ bool isActive=(currentLedIndex==idx)?true:false; uint16_t pwmValue=isActive?brightnessLevels[idx]*1023:0; analogWrite(ledPins[idx],pwmValue); } ++currentLedIndex %= sizeof(ledPins)/sizeof(*ledPins); } } ``` 在这里,每经过固定时间段就会更新一次点亮的目标位置及其亮度等级,从而营造出流动视觉特效的效果。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值