作者 主题: 使用4017数字集成块扩展Arduino开关阵列  (阅读 4225 次)

Ansifa

  • Newbie
  • *
  • 帖子: 18
    • 博客
使用4017数字集成块扩展Arduino开关阵列
« 于: 九月 09, 2011, 05:14:24 下午 »
    使用4017数字集成块扩展Arduino开关阵列
    --用3个单片机引脚读取10个开关状态


    使用Arduino做制作,需要有一组开关控制Arduino状态。但是Arduino引脚不多,传统接法开关多了要占用很多引脚。减少引脚的方法有很多,可以选矩阵方式,编码器方式,还有本文要介绍的分时复用开关法等。


    特点:十个开关占用三个数据引脚,之后每增加十个开关就增加一个引脚。
    4017是一块十进制计数器,每输入一个CLK脉冲,Q0~Q9轮流产生高电平。每时刻有且只有一个引脚高电平。
    二极管防止多个开关闭合时,有的输出端输出高电平,有的输出低电平,互相接上的话,会低电平引脚会干扰高电平脚的工作。
    开关用10路拨动式小型开关,或者自己选择其他开关形式。


    电路工作原理:
    [list=1]
    • 先在RST(4017的复位脚MR)发出一个脉冲,使4017复位。
    • 此时有且只有Q0输出高电平(Q0对应开关S1,Q9对应开关S10),读取一次输出信号DATA。如果第一个开关S1闭合了,应该DATA得到高电平;如果S1断开了,就DATA得到低电平。此时记DATA结果对应第一个开关S1的状态。
    • 给CLK输出一个脉冲,让4017移位,有且只有Q1输出高电平(Q0,Q2~Q9均为低电平)。读取DATA。得到S2状态。
    • 不断给CLK脉冲。总共给10次脉冲,让4017由Q0移动到Q9,完成一次开关遍历,每次移动获取一次DATA状态。存为S1~S10状态。
    电路原理图如图:



    洞洞板图(由于引脚多,不建议面包板制作。)



    关于在一块Arduino上使用多块模块:每增加一块模块,可以增加十路开关(当然你也可以使用两块4017做成行列矩阵控制100个开关。不过那个就属于另外话题了)。增加的方式是将两块模块的RST,CLK,VCC,GND接在一起,接到单片机的相应引脚,然后两个模块的DATA脚分别接单片机两个IO口。

    Arduino程序例子:


    [indent]
    const int rst = 2; //板子的RST脚接Arduino的D4口(自定义)
    const int clk = 3; //板子的CLK脚接Arduino的D3口(自定义)
    const int data1 = 4; //板子的DATA脚接Arduino的D2口(自定义)
    //const int data2 = 5; //如果有第二块板子的话,两块板子共用RST和CLK引脚。DATA接Arduino的D5口,第三块板子可以类推接D6口(自定义)
    void setup()
    {
    Serial.begin(9600);
    pinMode(rst, OUTPUT);
    pinMode(clk, OUTPUT);
    pinMode(data1, INPUT);
    //pinMode(data2,INPUT); //如果有第二块板子的话要定义IO
    }
    void loop()
    {
    int KeyStatus[10] = {0}; //按照总开关数定义。可能要改为20,30等
    digitalWrite(rst, HIGH);
    delayMicroseconds(10); //所有delayMicroseconds(10);均是给4017一个反应时间。
    digitalWrite(rst, LOW);
    delayMicroseconds(10);
    for(int i = 0; i < 10; i++)
    {
    KeyStatus\[i\] = digitalRead(data1);
    //KeyStatus[i+10] = digitalRead(data2); //读取第二个板子的状态,地址放在i+10
    digitalWrite(clk, HIGH);
    delayMicroseconds(10);
    digitalWrite(clk, LOW);
    delayMicroseconds(10);
    }


    for(int i = 0; i < 10; i++) //循环打印KeyStatus数组,i<10可能要改为i<20,30等
    {
    Serial.print(KeyStatus\[i\]);
    Serial.print("\t");
    }
    Serial.println();
    delay(100);
    }
    [/indent]


    洞洞板实物图:




    [/list]
    « 最后编辑时间: 九月 09, 2011, 05:16:53 下午 作者 Ansifa »

    咖啡

    • Newbie
    • *
    • 帖子: 5
    Re: 使用4017数字集成块扩展Arduino开关阵列
    « 回复 #1 于: 九月 09, 2011, 08:43:09 下午 »
    哈哈,不错不错,最喜欢图文并茂啦,通俗易懂

    捧场捧场~~~

    是个好东西,当然扩展多了或是系统大了,这个扫描时间(响应时间)就得注意了
    另外我看程序上直接delay也没详细给出4017的响应频率,我看了一下datasheet也帮忙补充一下,嘿嘿

    fCL  Maximum Clock Frequency 最大时钟频率 
                                     典型    最大
     VDD = 5V  Measured with        1.0       2    MHz   
    VDD = 10V  Respect to Carry     2.5      5   
    VDD = 15V  Output Line             3.0      6   


    tWL, tWH  Minimum Clock Pulse Width最小时钟脉冲宽度 
                 典型 最大
    VDD = 5V    125  250   ns
    VDD = 10V    45  90 
    VDD = 15V    35  70 

    No coffee no morning

    Ansifa

    • Newbie
    • *
    • 帖子: 18
      • 博客
    Re: 使用4017数字集成块扩展Arduino开关阵列
    « 回复 #2 于: 九月 15, 2011, 11:43:43 上午 »
    这个可以用74HEF4017,12MHz的
    http://www.nxp.com/documents/data_sheet/HEF4017B.pdf
    « 最后编辑时间: 九月 15, 2011, 01:40:58 下午 作者 Ansifa »

    Tags: