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

项目十三 数字骰子
本系列教程为DF创客社区版权所有,配套硬件套件:新版Arduino中级套件上一课:项目十二 遥控灯
小时候都玩过飞行棋吧,是不是特别喜欢掷骰子,然而我们今天就要通过Arduino来做个数字骰子,或者叫做电子骰子,随便怎么叫,就是这么个意思!
所需元件
l1×数字大按钮模块

image001.jpg (18.67 KB, 下载次数: 1)

下载附件

保存到相册

2016-1-27 17:07 上传

      l1× LED模块

image002.jpg (21.01 KB, 下载次数: 1)

下载附件

保存到相册

2016-1-27 17:07 上传

l1× Shiftout模块

image003.jpg (40.6 KB, 下载次数: 1)

下载附件

保存到相册

2016-1-27 17:07 上传

硬件连接
把LED模块插到Shiftout模块上,插的时候注意引脚一一对应。LED模块中“D”所在排连接到Shiftout的绿色引脚上,“+”对应红色VCC,“-”对应黑色GND。Input相应接到UNO的数字口。数字大按钮模块接到数字口2。

image004.jpg (103.07 KB, 下载次数: 1)

下载附件

保存到相册

2016-1-27 17:07 上传

输入代码样例代码 13-1: //项目十三 – 数字骰子 int latchPin = 8;//数字口8连接到74HC595芯片的使能引脚int clockPin = 3;//数字口3连接到74HC595芯片的时钟引脚int dataPin = 9; //数字口9连接到74HC595芯片的数据引脚int buttonPin = 2; // 按钮连接到数字口2 //代表数字0~9byte 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之间的数,每次按下按钮都会是不同的数。
硬件分析Shiftout模块Shiftout模块就是一块74HC595芯片。如果要看懂代码,那就需要对74HC595芯片的工作原理有个简单认识。我们很快的看下这块芯片是如何工作的?74HC595实现了串行输入转并行输出的功能。先说下什么是串行与并行。下图可以简单看出串行与并行的区别。串行,是一个一个数往发,而并行是8位数一道往外发的。

image005.jpg (48.93 KB, 下载次数: 1)

下载附件

保存到相册

2016-1-27 17:07 上传

74HC595可以串行进来的数据,让它并行输出。这样的好处是,比如在我们要用到多个LED,而数字引脚又不够用的时候,用个74HC595,就可以同时控制多个LED了。

image006.jpg (29.23 KB, 下载次数: 1)

下载附件

保存到相册

2016-1-27 17:07 上传

那具体如何发数据,发什么数据?就是由data,latch,clock这三个量决定的。Arduino提供了一个shiftOut()函数,使74HC595使用起来非常简便。

image007.jpg (59.6 KB, 下载次数: 1)

下载附件

保存到相册

2016-1-27 17:07 上传

LED模块

LED模块其实就是8个LED,每一段都是一个独立的LED,一共是8段。一个74HC595芯片输出正好也是8位,所以可以用74HC595的输出正好可以控制一个LED模块。

image008.jpg (11.71 KB, 下载次数: 1)

下载附件

保存到相册

2016-1-27 17:07 上传

代码回顾
前面硬件介绍部分提到了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需要分两步。相关参考资料: http://wiki.dfrobot.com.cn/index.php/ShiftOut()http://arduino.cc/en/Reference/ShiftOuthttp://arduino.cc/en/Tutorial/ShiftOut 代码中,我们可以看出输出位的顺序是最高位优先的,Tab[number]就是输出的数据。shiftOut(dataPin,clockPin, MSBFIRST, Tab[number]); 那我们看下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”。

image009.jpg (54.53 KB, 下载次数: 1)

下载附件

保存到相册

2016-1-27 17:07 上传

image010.jpg (55.04 KB, 下载次数: 1)

下载附件

保存到相册

2016-1-27 17:07 上传

你会说还是没和LED灯对上号啊?不要急,接着往下。

image011.jpg (36.51 KB, 下载次数: 1)

下载附件

保存到相册

2016-1-27 17:07 上传

看出点名堂了吗?细心的朋友应该可以看出,出来的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模块还有其他的玩儿,比如可以结合我们前面的红外接收管,做个红外遥控数码管,在数码管上显示你在红外遥控器上按下的数字。没事儿玩儿猜数字游戏也不错啊~希望你的Arduino之旅不会因此而停止,用你的奇思妙想,玩出更多新颖有创意的作品。如果你愿意与我们分享的话,也可以直接登陆我们的论坛,让我们的社区论坛记录下你的点点滴滴!
※ 在之后的Arduino学习之旅中,不管你遇到奇奇怪怪的问题,都希望你与我们交流,欢迎登陆我们的DFRobot创客社区!www.dfrobot.com.cn

标签: Arduino教程