注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

This is Ansifa

近期都不会更新绿色软件

 
 
 
 
 

日志

 
 

Arduino学习笔记 - 使用4017数字集成块扩展Arduino开关输入端  

2011-09-06 00:27:49|  分类: 电子技术 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

使用4017数字集成块扩展Arduino开关输入端

--用3个单片机引脚读取10个开关状态


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

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

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

电路原理图如图:

Arduino学习笔记 - 使用4017数字集成块扩展Arduino开关输入端 - ansifa - This is Ansifa

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

Arduino学习笔记 - 使用4017数字集成块扩展Arduino开关输入端 - ansifa - This is Ansifa

关于在一块Arduino上使用多块模块:

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

多片连接方法: 

Arduino学习笔记 - 使用4017数字集成块扩展Arduino开关输入端 - ansifa - This is Ansifa
 

Arduino程序例子: 

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);
}

作者洞洞板实物图:

Arduino学习笔记 - 使用4017数字集成块扩展Arduino开关输入端 - ansifa - This is Ansifa

 

Arduino学习笔记 - 使用4017数字集成块扩展Arduino开关输入端 - ansifa - This is Ansifa

 

Arduino学习笔记 - 使用4017数字集成块扩展Arduino开关输入端 - ansifa - This is Ansifa

 

  评论这张
 
阅读(1806)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016