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值了,你想干嘛就干嘛了。详细资料也可以去厂商看看文档

相关推荐
捕鲸叉5 小时前
创建线程时传递参数给线程
开发语言·c++·算法
A charmer5 小时前
【C++】vector 类深度解析:探索动态数组的奥秘
开发语言·c++·算法
Peter_chq5 小时前
【操作系统】基于环形队列的生产消费模型
linux·c语言·开发语言·c++·后端
hairenjing11236 小时前
使用 Mac 数据恢复从 iPhoto 图库中恢复照片
windows·stm32·嵌入式硬件·macos·word
青花瓷7 小时前
C++__XCode工程中Debug版本库向Release版本库的切换
c++·xcode
幺零九零零8 小时前
【C++】socket套接字编程
linux·服务器·网络·c++
捕鲸叉8 小时前
MVC(Model-View-Controller)模式概述
开发语言·c++·设计模式
Dola_Pan9 小时前
C++算法和竞赛:哈希算法、动态规划DP算法、贪心算法、博弈算法
c++·算法·哈希算法
yanlou2339 小时前
KMP算法,next数组详解(c++)
开发语言·c++·kmp算法
小林熬夜学编程9 小时前
【Linux系统编程】第四十一弹---线程深度解析:从地址空间到多线程实践
linux·c语言·开发语言·c++·算法