CD74HC4067高速CMOS16通道模擬多路複用器實踐

longware發表於2023-11-22

我們們在玩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值了,你想幹嘛就幹嘛了。詳細資料也可以去廠商看看文件  。

 

相關文章