CD74HC4067高速CMOS16通道模拟多路复用器实践
咱们在玩arduino或stm32、esp8266时,有时会遇到板子模拟口不够用的情况,这个时候CD74HC4067就派上用场了,它可以将16路数字/模拟信号通过4数字+1模拟=5口来读取。
这货长这样,还有一种是纯芯片的,就是上面黑色的那块。

引脚c0--c15为输入口,接任意外部设备;s0-s3接板子数字口,用于发送读取信号编码;sig接板子模拟口,用于读取信号;EN口接数字口,用于发送禁用/启用命令,如果一直都是启用,此口可以不接。
16个口,板子不是通过0、1、2、3……这样的口令读取的,他有类似的命令表格,通过s0-s3发送命令,就能在sig读取了。命令表如下:

我是买来片子自己焊的,之前我有一个路边五金店买的40w电烙铁、几块钱的焊锡丝,焊得跟狗啃似的:


朋友说,烙铁和焊锡丝都不对,不适合。于是重买了南京华夏银星牌的20w尖头烙铁,6337焊锡丝(带助焊剂),流动性好,色泽光亮。
我试了一下,果然“技艺大增”,哈哈,下面这个焊点,我还是满意的。

我在多路复用板子上接了2个4键电容键盘、滑动电位器、旋钮电位器、按钮开关,如下:



通过如下代码即可读取:
1 // 定义选择引脚的编号 by longware
2 int s0 = 2;
3 int s1 = 3;
4 int s2 = 4;
5 int s3 = 5;
6
7 // 定义SIG引脚的编号
8 int SIG_pin = A0;
9
10 void setup() {
11 // 设置选择引脚为输出模式
12 pinMode(s0, OUTPUT);
13 pinMode(s1, OUTPUT);
14 pinMode(s2, OUTPUT);
15 pinMode(s3, OUTPUT);
16
17 // 设置SIG引脚为输入模式
18 pinMode(SIG_pin, INPUT);
19
20 // 初始化串口通信
21 Serial.begin(9600);
22 }
23
24 void loop() {
25 // 循环读取16个输入信号的值
26 for (int i = 0; i < 16; i++) {
27
28 // 调用readMux函数,传入通道编号,返回输入信号的值
29 int value = readMux(i);
30
31 // 在串口监视器中打印通道编号和输入信号的值
32 Serial.print(",C");
33 Serial.print(i);
34 Serial.print("=");
35 Serial.print(value);
36
37 // 延时
38 delay(20);
39 }
40 Serial.println(" ");
41
42 // 延时
43 delay(500);
44 }
45
46 // 定义一个函数,用来读取74HC4067的某个通道的输入信号的值
47 int readMux(int channel) {
48
49 // 定义一个二维数组,用来存储16个通道对应的选择引脚的状态
50 int muxChannel[16][4] = {
51 {0, 0, 0, 0}, // 通道0
52 {1, 0, 0, 0}, // 通道1
53 {0, 1, 0, 0}, // 通道2
54 {1, 1, 0, 0}, // 通道3
55 {0, 0, 1, 0}, // 通道4
56 {1, 0, 1, 0}, // 通道5
57 {0, 1, 1, 0}, // 通道6
58 {1, 1, 1, 0}, // 通道7
59 {0, 0, 0, 1}, // 通道8
60 {1, 0, 0, 1}, // 通道9
61 {0, 1, 0, 1}, // 通道10
62 {1, 1, 0, 1}, // 通道11
63 {0, 0, 1, 1}, // 通道12
64 {1, 0, 1, 1}, // 通道13
65 {0, 1, 1, 1}, // 通道14
66 {1, 1, 1, 1} // 通道15
67 };
68
69 // 循环设置选择引脚的状态,根据通道编号和二维数组的值
70 for (int i = 0; i < 4; i++) {
71 digitalWrite(s0 + i, muxChannel[channel][i]);
72 }
73
74 // 读取SIG引脚的模拟值
75 int value = analogRead(SIG_pin);
76
77 // 返回读取的值 by longware
78 return value;
79 }
上面的代码中muxChannel数组列举了通道命令,也可以通过移位来实现,如下面的selectChannel函数。
1 // 定义74HC4067引脚连接到Arduino的引脚 by longware
2 const int S0 = 2;
3 const int S1 = 3;
4 const int S2 = 4;
5 const int S3 = 5;
6 const int SIG_PIN = A0; // 74HC4067的信号引脚连接到Arduino的模拟输入A0
7
8 void setup() {
9 // 设置74HC4067选择引脚为输出
10 pinMode(S0, OUTPUT);
11 pinMode(S1, OUTPUT);
12 pinMode(S2, OUTPUT);
13 pinMode(S3, OUTPUT);
14
15 // 设置信号引脚为输入
16 pinMode(SIG_PIN, INPUT);
17
18 // 初始化选择引脚,选择通道0
19 digitalWrite(S0, LOW);
20 digitalWrite(S1, LOW);
21 digitalWrite(S2, LOW);
22 digitalWrite(S3, LOW);
23
24 // 打开串口通信
25 Serial.begin(9600);
26 }
27
28 void loop() {
29
30 // 循环读取16个通道的值
31 for (int channel = 0; channel < 16; ++channel) {
32
33 // 设置74HC4067选择通道
34 selectChannel(channel);
35
36 // 读取信号引脚的值并打印到串口
37 int sensorValue = analogRead(SIG_PIN);
38 Serial.print(",C");
39 Serial.print(channel);
40 Serial.print("=");
41 Serial.print(sensorValue);
42
43 // 等待一段时间,可根据需要调整
44 delay(20);
45 }
46 Serial.println(" ");
47
48
49 delay(500);
50 }
51
52 // 设置74HC4067选择通道的函数 by longware
53 void selectChannel(int channel) {
54
55 // 使用二进制表示选择通道
56 digitalWrite(S0, (channel & B0001) > 0);
57 digitalWrite(S1, (channel & B0010) > 0);
58 digitalWrite(S2, (channel & B0100) > 0);
59 digitalWrite(S3, (channel & B1000) > 0);
60 }
打开串口监视器,效果如下:




读取到sig值了,你想干嘛就干嘛了。详细资料也可以去厂商看看文档 。
CD74HC4067高速CMOS16通道模拟多路复用器实践的更多相关文章
- 基于ESP32的智能家居管理系统的设计与实现
基于ESP32的智能家居管理系统的设计与实现 ESP32的智能家居管理系统访问链接: https://www.cnblogs.com/easyidea/p/13101165.html 一.需求分析 1 ...
- 用STM32内置的高速ADC实现简易示波器
做一个数字采样示波器一直是我长久以来的愿望,不过毕竟这个目标难度比较大,涉及的方面实在太多,模拟前端电路.高速ADC.单片机.CPLD/FPGA.通讯.上位机程序.数据处理等等,不是一下子就能成的,慢 ...
- cameralink base 接口双通道任意图像数据源模拟
设备说明 PCIe-CLS2000是基于PCIe 接口的2通道 camera link base接口图像模拟源,适用于图像数据源模拟.接收处理平台测试等场景. PCIe Gen2x4/x8 接口,支持 ...
- 0-20ma 0-5V,0-10V ,0-15V ,0-20V,0-30V模拟量(范围可以定制)多功能采集模块,支持1路继电器输出,2路Di输入,8路Ai输入,可电脑控制,支持485 modbus rtu协议。端口参数可以配置保存,支持定制修改。
多功能模拟量采集模块MRD-5017具有8 通道模拟量采集(支持0-20mA,0-5V,0-10V混合测量),2路DI,1路继电器输出,1路485接口(支持MODBUS RTU),能实现8路AI(12 ...
- [Go] golang缓冲通道实现管理一组goroutine工作
通道1.当一个资源需要在goroutine之间共享时,通道在goroutine之间架起了一个管道2.无缓冲通道和有缓冲通道,make的第二个参数就是缓冲区大小3.无缓冲通道需要发送和接收都准备好,否则 ...
- 【UTR #2】题目交流通道
题目描述 定好了难度,雄心勃勃的吉米多出题斯基开始寻找智慧的神犇星球的居民出题. 然而吉米多出题斯基没有料到,神犇星球的居民告诉吉米多出题斯基:"今年神犇星球经济不景气,大家都想宅在家里,哪 ...
- 【UTR #2】[UOJ#278]题目排列顺序 [UOJ#279]题目交流通道 [UOJ#280]题目难度提升
[UOJ#278][UTR #2]题目排列顺序 试题描述 “又要出题了.” 宇宙出题中心主任 —— 吉米多出题斯基,坐在办公桌前策划即将到来的 UOI. 这场比赛有 n 道题,吉米多出题斯基需要决定这 ...
- @loj - 2339@ 「WC2018」通道
目录 @desription@ @solution@ @accepted code@ @details@ @desription@ 11328 年,C 国的科学家们研发了一种高速传送通道,可以在很短的 ...
- JDK(JDK8,JDK11)高速下载
JDK(JDK8,JDK11)高速下载 oracl 需要登陆才能下载,网速还贼慢. 华为云各版本高速下载通道:https://repo.huaweicloud.com/java/jdk/
- DSP基础学习-ADC同步采样
DSP基础学习-ADC同步采样 彭会锋 2015-04-28 20:31:06 在DSP28027 LauchPad学习过程中,关于ADC同步采样和顺序采样的区别稍加研究了一下,发现里面还真有些门道, ...
随机推荐
- 2023-07-31:用r、e、d三种字符,拼出一个回文子串数量等于x的字符串。 1 <= x <= 10^5。 来自百度。
2023-07-31:用r.e.d三种字符,拼出一个回文子串数量等于x的字符串. 1 <= x <= 10^5. 来自百度. 答案2023-07-31: 大体步骤如下: 1.初始化一个字符 ...
- [golang]使用gocron编写定时任务
前言 linux自带的crontab默认情况下只能精确到分钟,没法执行秒级任务.当然,也不是不行,比如: * * * * * for i in $(seq 1 11);do echo hello &g ...
- WPF如何构建MVVM+模块化的桌面应用
为何模块化 模块化是一种分治思想,不仅可以分离复杂的业务逻辑,还可以进行不同任务的分工.模块与模块之间相互独立,从而构建一种松耦合的应用程序,便于开发和维护. 开发技术 .Net 6 + WPF + ...
- 【升职加薪秘籍】我在服务监控方面的实践(6)-业务维度的mysql监控
大家好,我是蓝胖子,关于性能分析的视频和文章我也大大小小出了有一二十篇了,算是已经有了一个系列,之前的代码已经上传到github.com/HobbyBear/performance-analyze,接 ...
- 【pytorch】从零开始,利用yolov5、crnn+ctc进行车牌识别
笔者的运行环境:python3.8+pytorch2.0.1+pycharm+kaggle用到的网络框架:yolov5.crnn+ctc项目地址:GitHub - WangPengxing/plate ...
- 《CTFshow-Web入门》08. Web 71~80
@ 目录 web71 题解 原理 web72 题解 原理 web73 题解 web74 题解 web75 题解 原理 web76 题解 web77 题解 原理 web78 题解 原理 web79 题解 ...
- 2023 ICPC 网络赛 I
没留够时间准备导致开考的时候耽搁了 开场我先写缺省源,抄串了一行,后面才发现...然后看了 L 发现是签到,此时 ddw 会了 A 让 zsy 上去写,我等了一会才把 zsy 撵下来写 L 是个失误 ...
- 循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(8) -- 使用Converter类实现内容的转义处理
在我们WPF应用端的时候,和WInform开发或者Vue前端开发一样,有时候也需要对内容进行转义处理,如把一些0,1数值转换为具体含义的文本信息,或者把一些布尔变量转换为是否等,都是常见的转换处理,本 ...
- Java多线程编程的优点和缺点
优点: 加快响应用户的时间:多线程允许并发执行多个任务,可以充分利用多核处理器,从而提高程序的性能和响应速度.比如我们经常用的迅雷下载,都喜欢多开几个线程去下载,谁都不愿意用一个线程去下载,为什么呢? ...
- 从输入URL到页面加载完都发生了什么
1.浏览器的地址栏输入URL并按下回车. 2.浏览器查找当前URL是否存在缓存,并比较缓存是否过期. 3.DNS解析URL对应的IP. 4.根据IP建立TCP连接(三次握手). 5.HTTP发起请求. ...