2016-1-27 17:47:17 [显示全部楼层]
34654浏览
查看: 34654|回复: 24

[中级教程] Arduino教程中级 项目十三 数字骰子

[复制链接]

项目十三 数字骰子

本系列教程为DF创客社区版权所有,配套硬件套件:新版Arduino中级套件

小时候都玩过飞行棋吧,是不是特别喜欢掷骰子,然而我们今天就要通过Arduino来做个数字骰子,或者叫做电子骰子,随便怎么叫,就是这么个意思!

所需元件

1×  数字大按钮模块
1× LED模块
1× Shiftout模块
Arduino教程中级 项目十三 数字骰子图1

硬件连接

Arduino教程中级 项目十三 数字骰子图2
把LED模块插到Shiftout模块上,插的时候注意引脚一一对应。LED模块中“D”所在排连接到Shiftout的绿色引脚上,“+”对应红色VCC,“-”对应黑色GND。Input相应接到UNO的数字口。数字大按钮模块接到数字口2。

硬件分析

Shiftout模块

Shiftout模块就是一块74HC595串行输入串行或并行输出的移位寄存器芯片。如果要看懂代码,那就需要对 74HC595芯片的工作原理有个简单认识。我们很快的看下这块芯片是如何工作的?

74HC595实现了串行输入转并行输出的功能。

先说下什么是串行与并行。下图可以简单看出串行与并行的区别。串行,是一个一个数往发,而并行是 8位数一道往外发的。
Arduino教程中级 项目十三 数字骰子图3
下载完代码后,不仅可以从LCD屏上显示当前的温湿度,还可以从串口中看到值。

74HC595可以串行进来的数据,让它并行输出。这样的好处是,比如在我们要用到多个LED,而数字引脚又不够用的时候,用一个74HC595,就可以同时控制多个LED了。
Arduino教程中级 项目十三 数字骰子图4
那具体如何发数据,发什么数据?就是由data,latch,clock这三个量决定的。Arduino提供了一个shiftOut()函数,使74HC595使用起来非常简便。
Arduino教程中级 项目十三 数字骰子图5

LED模块

LED模块其实就是8个LED,每一段都是一个独立的LED,一共是8段。一个74HC595芯片输出正好也是8位,所以可以用74HC595的输出正好可以控制一个LED模块。
Arduino教程中级 项目十三 数字骰子图7

输入代码

 //项目十三 – 数字骰子
int latchPin = 8;  //数字口8连接到74HC595芯片的使能引脚
int clockPin = 3;  //数字口3连接到74HC595芯片的时钟引脚
int dataPin = 9;   //数字口9连接到74HC595芯片的数据引脚
int buttonPin = 2; // 按钮连接到数字口2
//代表数字0~9
byte Tab[]={
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
int number;
long randNumber;
void setup() {
  pinMode(latchPin, OUTPUT);
  pinMode(dataPin, OUTPUT);  
  pinMode(clockPin, OUTPUT);
  randomSeed(analogRead(0));   //设置一个随机数产生源模拟口0
}
void loop(){
    randNumber = random(10);   //产生0~9之间的随机数
showNumber(randNumber);    //显示该随机数
//一旦有按键按下,显示该数,并保持到松开为止
    while(digitalRead(buttonPin) == HIGH){  
       delay(100);
    }
}
//该函数用于数码管显示
void showNumber(intnumber){
     digitalWrite(latchPin, LOW);
     shiftOut(dataPin, clockPin, MSBFIRST,Tab[number]);
     digitalWrite(latchPin, HIGH);
     delay(80);
}

数码管会随机产生 0~9之间的数,每次按下按钮都会是不同的数。

代码回顾

前面硬件介绍部分提到了 74HC595的用法,起到的作用就是能够通过一个数据口并行输出 8位,,不会让LED占用 8个数字引脚,当然如果你想接8个数字口也是没

有问题的,只是占用的引脚会多一点而已。也说到了三个比较关键的引脚 latchPin,clockPin,dataPin。所以代码开始定义了这三个量,以及按钮。

下面就来说下 shiftOut()函数怎样用?

shiftOut函数格式:
shiftOut(dataPin,clockPin,bitOrder,value)

dataPin:输出每一位数据的引脚(int)
clockPin:时钟引脚,当 dataPin有值时此引脚电平变化(int)
bitOrder:输出位的顺序,最高位优先(MSBFIRST)或最低位优(LSBFIRST)
value: 要移位输出的数据(byte)

注意:
(1) dataPin和clockPin要setup()的pinMode()中,设置为 OUTPUT。
(2) shiftOut目前只能输出1个字节( 8位),所以如果输出值大于 255需要分两步。

相关参考资料:

代码中,我们可以看出输出位的顺序是最高位优先的,Tab[number]就是输出的数据。

shiftOut(dataPin, clockPin, MSBFIRST, Tab[num-ber]);

那我们看下 Tab[number]里面是些什么?

byte Tab[]={
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

是不是看的一头雾水,什么又是 c0,又是f9的,这都是些什么东西?我们只要说一个,之后的就全明白了。

0xc0这些是16进制表达方式,我们日常生活接触比较多的是10进制,也就是0~9的表现形式。16进制是由0~9,A~F组成。0~9对应0~9;A~F对10~15。

你可能说还是不太明白,没关系,打开电脑自带的计算器,设置成“程序员”模式。选择“十六进制”,输入“c0”,点击“二进制”。此时,“c0”就“11000000”。
Arduino教程中级 项目十三 数字骰子图9Arduino教程中级 项目十三 数字骰子图8
你会说还是没和 LED灯对上号啊?不要急,接着往下。
Arduino教程中级 项目十三 数字骰子图6
看出点名堂了吗?细心的朋友应该可以看出,出来的 8位数正好是和 LED模块上的8个LED对应的。这里“0”为点亮,“1”为熄灭。这是由于这个是共阴数码管,低电平的时候才能被点亮。这里就多做说明。其他的数字应该也能按照相同的方法推算出来。

现在我们知道了 0~9的数字是如何显示的,既然需要做数字骰子,还有一个重要的一步,如何随机产生0~9之间的数字呢? Arduino提供了个好用的函数random()。

random(max)
random()可生成随机数,生成[0,max-1]范围内的随机数。 max是最大值。

random(10);// 生成0~9之间的数

randomSeed()函数是用来设置随机种子的,我们这里就接到了模拟口 0。
randomSeed(analogRead(0));

趣味练习

LED模块还有其他的玩儿,比如可以结合我们前面的红外接收管,做个红外遥控数码管,在数码管上显示你在红外遥控器上按下的数字。没事儿玩儿猜数字游戏也不错啊~

Lesson13_1.ino

1.01 KB, 下载次数: 445

Holiday  初级技匠

发表于 2016-1-28 13:54:02

让我想起了大学时从一个网站上学习做的一个小东西https://wenku.baidu.com/view/0e7048d7aa00b52acfc7cad5
回复

使用道具 举报

大连林海  初级技神

发表于 2016-1-28 11:48:58

孙毅 发表于 2016-1-27 23:01
这个……我能。。。哈哈,你有需求吗?!

按说的是 图形化教程 你给给做个图形化啊 哈哈
回复

使用道具 举报

Jane  高级技匠
 楼主|

发表于 2016-2-2 15:33:13

D.Rainbow 发表于 2016-1-30 13:17
楼主用的说明软件来画arduino的线呀

用的Inkscape来画连线图的
回复

使用道具 举报

hnyzcj  版主

发表于 2016-1-27 20:27:40

好久不见,一见面就甩了一梭子教程,超级赞
回复

使用道具 举报

大连林海  初级技神

发表于 2016-1-27 22:20:04

可不可以 做个图形化的
回复

使用道具 举报

孙毅  初级技匠

发表于 2016-1-27 23:01:14

大连林海 发表于 2016-1-27 22:20
可不可以 做个图形化的

这个……我能。。。哈哈,你有需求吗?!
回复

使用道具 举报

Ash  管理员

发表于 2016-1-28 10:53:07

hnyzcj 发表于 2016-1-27 20:27
好久不见,一见面就甩了一梭子教程,超级赞

jane大神闭关写教程去啦~
回复

使用道具 举报

hnyzcj  版主

发表于 2016-1-28 13:02:30

孙毅 发表于 2016-1-27 23:01
这个……我能。。。哈哈,你有需求吗?!

他需,你给吧
回复

使用道具 举报

孙毅  初级技匠

发表于 2016-1-28 13:15:55

Ash 发表于 2016-1-28 10:53
jane大神闭关写教程去啦~

Jane from DFRobot?
回复

使用道具 举报

孙毅  初级技匠

发表于 2016-1-28 13:17:20


一个寒假陈老师有没有计划点惊艳的大项目啊?
回复

使用道具 举报

孙毅  初级技匠

发表于 2016-1-28 13:18:07


他是“需”,还是 “虚”?
回复

使用道具 举报

hnyzcj  版主

发表于 2016-1-28 13:30:13

孙毅 发表于 2016-1-28 13:17
一个寒假陈老师有没有计划点惊艳的大项目啊?

有,大圣钢管舞
回复

使用道具 举报

孙毅  初级技匠

发表于 2016-1-28 15:02:55

hnyzcj 发表于 2016-1-28 13:30
有,大圣钢管舞

这个是我的项目,不准抢~~
回复

使用道具 举报

D.Rainbow  初级技师

发表于 2016-1-30 13:17:04

楼主用的说明软件来画arduino的线呀
回复

使用道具 举报

D.Rainbow  初级技师

发表于 2016-2-2 18:46:06

Jane 发表于 2016-2-2 15:33
用的Inkscape来画连线图的

谢谢啦
回复

使用道具 举报

Jane  高级技匠
 楼主|

发表于 2016-2-2 18:52:49


不客气啦~
回复

使用道具 举报

jiashe2011  见习技师

发表于 2017-2-21 23:58:27

谢谢啦
回复

使用道具 举报

jiashe2011  见习技师

发表于 2017-2-22 01:00:25

学习13!!!
回复

使用道具 举报

Jane  高级技匠
 楼主|

发表于 2017-3-24 23:26:56


哈哈哈哈~希望有帮助哈
回复

使用道具 举报

kimi423520  学徒

发表于 2018-6-11 16:51:11

学习了, 赞一个
回复

使用道具 举报

12下一页
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail