经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » 树莓派 » 查看文章
CD74HC4067高速CMOS16通道模拟多路复用器实践
来源:cnblogs  作者:longware  时间:2023/11/22 16:45:48  对本文有异议

咱们在玩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. 1 // 定义选择引脚的编号 by longware
  2. 2 int s0 = 2;
  3. 3 int s1 = 3;
  4. 4 int s2 = 4;
  5. 5 int s3 = 5;
  6. 6
  7. 7 // 定义SIG引脚的编号
  8. 8 int SIG_pin = A0;
  9. 9
  10. 10 void setup() {
  11. 11 // 设置选择引脚为输出模式
  12. 12 pinMode(s0, OUTPUT);
  13. 13 pinMode(s1, OUTPUT);
  14. 14 pinMode(s2, OUTPUT);
  15. 15 pinMode(s3, OUTPUT);
  16. 16
  17. 17 // 设置SIG引脚为输入模式
  18. 18 pinMode(SIG_pin, INPUT);
  19. 19
  20. 20 // 初始化串口通信
  21. 21 Serial.begin(9600);
  22. 22 }
  23. 23
  24. 24 void loop() {
  25. 25 // 循环读取16个输入信号的值
  26. 26 for (int i = 0; i < 16; i++) {
  27. 27
  28. 28 // 调用readMux函数,传入通道编号,返回输入信号的值
  29. 29 int value = readMux(i);
  30. 30
  31. 31 // 在串口监视器中打印通道编号和输入信号的值
  32. 32 Serial.print(",C");
  33. 33 Serial.print(i);
  34. 34 Serial.print("=");
  35. 35 Serial.print(value);
  36. 36
  37. 37 // 延时
  38. 38 delay(20);
  39. 39 }
  40. 40 Serial.println(" ");
  41. 41
  42. 42 // 延时
  43. 43 delay(500);
  44. 44 }
  45. 45
  46. 46 // 定义一个函数,用来读取74HC4067的某个通道的输入信号的值
  47. 47 int readMux(int channel) {
  48. 48
  49. 49 // 定义一个二维数组,用来存储16个通道对应的选择引脚的状态
  50. 50 int muxChannel[16][4] = {
  51. 51 {0, 0, 0, 0}, // 通道0
  52. 52 {1, 0, 0, 0}, // 通道1
  53. 53 {0, 1, 0, 0}, // 通道2
  54. 54 {1, 1, 0, 0}, // 通道3
  55. 55 {0, 0, 1, 0}, // 通道4
  56. 56 {1, 0, 1, 0}, // 通道5
  57. 57 {0, 1, 1, 0}, // 通道6
  58. 58 {1, 1, 1, 0}, // 通道7
  59. 59 {0, 0, 0, 1}, // 通道8
  60. 60 {1, 0, 0, 1}, // 通道9
  61. 61 {0, 1, 0, 1}, // 通道10
  62. 62 {1, 1, 0, 1}, // 通道11
  63. 63 {0, 0, 1, 1}, // 通道12
  64. 64 {1, 0, 1, 1}, // 通道13
  65. 65 {0, 1, 1, 1}, // 通道14
  66. 66 {1, 1, 1, 1} // 通道15
  67. 67 };
  68. 68
  69. 69 // 循环设置选择引脚的状态,根据通道编号和二维数组的值
  70. 70 for (int i = 0; i < 4; i++) {
  71. 71 digitalWrite(s0 + i, muxChannel[channel][i]);
  72. 72 }
  73. 73
  74. 74 // 读取SIG引脚的模拟值
  75. 75 int value = analogRead(SIG_pin);
  76. 76
  77. 77 // 返回读取的值 by longware
  78. 78 return value;
  79. 79 }

上面的代码中muxChannel数组列举了通道命令,也可以通过移位来实现,如下面的selectChannel函数。

  1. 1 // 定义74HC4067引脚连接到Arduino的引脚 by longware
  2. 2 const int S0 = 2;
  3. 3 const int S1 = 3;
  4. 4 const int S2 = 4;
  5. 5 const int S3 = 5;
  6. 6 const int SIG_PIN = A0; // 74HC4067的信号引脚连接到Arduino的模拟输入A0
  7. 7
  8. 8 void setup() {
  9. 9 // 设置74HC4067选择引脚为输出
  10. 10 pinMode(S0, OUTPUT);
  11. 11 pinMode(S1, OUTPUT);
  12. 12 pinMode(S2, OUTPUT);
  13. 13 pinMode(S3, OUTPUT);
  14. 14
  15. 15 // 设置信号引脚为输入
  16. 16 pinMode(SIG_PIN, INPUT);
  17. 17
  18. 18 // 初始化选择引脚,选择通道0
  19. 19 digitalWrite(S0, LOW);
  20. 20 digitalWrite(S1, LOW);
  21. 21 digitalWrite(S2, LOW);
  22. 22 digitalWrite(S3, LOW);
  23. 23
  24. 24 // 打开串口通信
  25. 25 Serial.begin(9600);
  26. 26 }
  27. 27
  28. 28 void loop() {
  29. 29
  30. 30 // 循环读取16个通道的值
  31. 31 for (int channel = 0; channel < 16; ++channel) {
  32. 32
  33. 33 // 设置74HC4067选择通道
  34. 34 selectChannel(channel);
  35. 35
  36. 36 // 读取信号引脚的值并打印到串口
  37. 37 int sensorValue = analogRead(SIG_PIN);
  38. 38 Serial.print(",C");
  39. 39 Serial.print(channel);
  40. 40 Serial.print("=");
  41. 41 Serial.print(sensorValue);
  42. 42
  43. 43 // 等待一段时间,可根据需要调整
  44. 44 delay(20);
  45. 45 }
  46. 46 Serial.println(" ");
  47. 47
  48. 48
  49. 49 delay(500);
  50. 50 }
  51. 51
  52. 52 // 设置74HC4067选择通道的函数 by longware
  53. 53 void selectChannel(int channel) {
  54. 54
  55. 55 // 使用二进制表示选择通道
  56. 56 digitalWrite(S0, (channel & B0001) > 0);
  57. 57 digitalWrite(S1, (channel & B0010) > 0);
  58. 58 digitalWrite(S2, (channel & B0100) > 0);
  59. 59 digitalWrite(S3, (channel & B1000) > 0);
  60. 60 }

打开串口监视器,效果如下:

 

 

 

 读取到sig值了,你想干嘛就干嘛了。详细资料也可以去厂商看看文档  。

 

原文链接:https://www.cnblogs.com/longware/p/17848877.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号