迷你强 发表于 2012-9-26 19:41:17

Arduino入门教程--第十八课--Arduino驱动数码管

   今天我们来玩数码管,这个东西就是一堆led通过共阳并联在一起的小方块,用来显示数字和几个字母,是非常简单常见的显示器件。和学习笔记中的数码管代码不同,这次使用的代码单位时间只亮一个数码管上的灯,肉眼看到的1,2,3是因为高刷新率,大于肉眼分辨速度,使得肉眼看到1,2,3等。这样的好处是亮度高,而且亮度均匀。

所以准备一下材料

一位共阳数码管   1枚
arduino控制板   1个
面包板                1快
面包板专用跳线盒1盒
数据线               1根
220欧姆电阻       1个


我们先来看数码管的原理图
http://image.geek-workshop.com/forum/201107/21/201833d2e6uvphchm65xr8.jpg

可以看到数码管的链接方式,驱动的原理就是,阳极供电后,其他引脚如果是低电平就能点亮。来看电路图

进过大家的指正,我终于知道哪里画错了,现已修正



我们可以看到,电路按照上面的原理图依据abcdefg的顺序排布了接口,这样写程序会方便很多

然后我们搭建出电路







将程序下载进去

/*
作者:极客工坊-迷你强
时间:2012年10月2日
IDE版本号:1.0.1
发布地址:www.geek-workshop.com
作用:arduino驱动数码管循环显示0,1,2,3,4几个数字
*/

void setup() {
      
   pinMode(13,OUTPUT);   //激活13号引脚,我们需要用它供电            

    for(int n=2;n<=9;n++)
   {
   pinMode(n,OUTPUT);
   }
}


void loop()
{
   
digitalWrite(13,1); //这个就是HIGH和LOW 的另一种写法0代表LOW   1代表HIGH


/*==========显示0=============*/
int n0={0,0,0,0,0,0,1,1};       //定义数组 通过0,1定义各数码管的明灭,
int z=0;
for(int x=2;x<=9;x++)          //采用循环方式依次点亮指定的数码管led(数组中0为点亮),单位时间只点亮1个led
{
    digitalWrite(x,n0);         //点亮led语句X为引脚数n0为数组z为0-8的变量,来依次读取数组中的值
    z++;
    if (z>=9)                  //防止变量z累加超过了8
    z=0;
}
delay(1000);
/*==========显示1=============*/
int n1={1,0,0,1,1,1,1,1};
z=0;
for(int x=2;x<=9;x++)
{
    digitalWrite(x,n1);
    z++;
    if (z>=9)
    z=0;
}
delay(1000);
/*==========显示2=============*/
int n2={0,0,1,0,0,1,0,1};
z=0;
for(int x=2;x<=9;x++)
{
    digitalWrite(x,n2);
    z++;
    if (z>=9)
    z=0;
}
delay(1000);
/*==========显示3=============*/
int n3={0,0,0,0,1,1,0,1};
z=0;
for(int x=2;x<=9;x++)
{
    digitalWrite(x,n3);
    z++;
    if (z>=9)
    z=0;
}
delay(1000);
/*==========显示4=============*/
int n4={1,0,0,1,1,0,0,1};
z=0;
for(int x=2;x<=9;x++)
{
    digitalWrite(x,n4);
    z++;
    if (z>=9)
    z=0;
}
delay(1000);
}

实验视频
http://player.youku.com/player.php/sid/XNDU1MDQzNTE2/v.swf

arduino_ykk 发表于 2013-5-18 12:54:48

看不懂数码管的引脚图... = =

从网上搜了一下,然后画了如下图。希望对小白有帮助。

=============以下出自百度知道 =================
用万用表测一下就可以了。数码管分为共阴极和共阳极。一般情况下有10个引脚。上面5个下面5个,每排的中间一个一般情况下是接低电平或者高电平。先用万用表的正极放在中间一个,另外一个依次去测。如果是共阳极就有亮,否则共阴极,根据发光位置就可以判断引脚了
==========================================

用万用表,打到测电阻的200欧 量程,然后红表笔(+) 接到数码管任意上下引脚的中间那个,黑表笔(-)依次测量每个引脚,对应数码管上面的每一段会变亮。图上面的DP表示那个显示的小数点。


<一一巛 发表于 2013-3-4 16:51:19

本帖最后由 <一一巛 于 2013-3-4 16:54 编辑

void setup() {   
   for(int n=1;n<=7;n++) //abcdefg对应管脚1234567
   pinMode(n,OUTPUT);
}
void loop() {
/*==========显示=============*/
int n={0,0,0,0,0,0,1, //0
                1,0,0,1,1,1,1, //1
                0,0,1,0,0,1,0, //2
                0,0,0,0,1,1,0, //3
                1,0,0,1,1,0,0, //4
                0,1,0,0,1,0,0, //5
                0,1,0,0,0,0,0, //6
                0,0,0,1,1,1,1, //7
                0,0,0,0,0,0,0, //8
                0,0,0,1,1,0,0};//9
for(int i=0;i<=9;i++){
    for(int j=1;j<=7;j++)
      digitalWrite(j,n);
    delay(1000);
    }
}交作业:$
精炼代码循环显示0~9

普通人 发表于 2012-10-10 13:28:19

那什么,图错了,电阻左边那根线

迷你强 发表于 2012-10-10 13:44:44

普通人 发表于 2012-10-10 13:28 static/image/common/back.gif
那什么,图错了,电阻左边那根线

没错吧。。。。

普通人 发表于 2012-10-11 11:36:49

第二个脚

迷你强 发表于 2012-10-11 11:45:22

普通人 发表于 2012-10-11 11:36 static/image/common/back.gif
第二个脚

:L求红圈圈标注。。。

普通人 发表于 2012-10-11 12:05:57

嘿嘿,我已经把字母也试出来了

迷你强 发表于 2012-10-14 08:16:46

感谢热心指正。。。

firstboy0513 发表于 2013-2-23 21:56:54

:L咋一看代码这么多,没必要再定义个辅助变量z,代码重复太多啦,编码一大忌呀。虽然代码可读性重要,但也要注意形象呀~~

dushiyizhan 发表于 2013-4-4 18:20:19

<一一巛 发表于 2013-3-4 16:51 static/image/common/back.gif
void setup() {   
   for(int n=1;n

void setup()
{
pinMode(13,OUTPUT);
for(int n=2; n<=9; n++)
{
    pinMode(n,OUTPUT);
}
}

void loop()
{
digitalWrite(13,HIGH);

int n = { 0,0,0,0,0,0,1,0,
                   1,0,0,1,1,1,1,0,
                   0,0,1,0,0,1,0,0,// 2
                   0,0,0,0,1,1,0,0,// 3
                   1,0,0,1,1,0,0,0,// 4
                   0,1,0,0,1,0,0,0,// 5
                   0,1,0,0,0,0,0,0,// 6
                   0,0,0,1,1,1,1,0,// 7
                   0,0,0,0,0,0,0,0,// 8
                   0,0,0,0,1,0,0,0   // 9
               };
               
for(int i = 0; i<=9; i++){
    for(int j = 2; j<=9;j++)
         digitalWrite(j,n);
         delay(1000);
}
}

针对楼主的程序,对9楼牛人的程序稍加修改,可原封不动使用!

gxdiy 发表于 2013-4-6 14:15:25

都是牛人,我 一直努力学习中

寶□貝 发表于 2013-4-6 16:24:21

gxdiy 发表于 2013-4-6 14:15 static/image/common/back.gif
都是牛人,我 一直努力学习中

我也一直努力中 一起学吧 更有动力

玄冰之神 发表于 2013-4-15 16:34:37

:lol学习 学习。。

天天向上/tp 发表于 2013-4-20 22:49:33

<一一巛 发表于 2013-3-4 16:51 static/image/common/back.gif
void setup() {   
   for(int n=1;n

好东西················
页: [1] 2 3 4 5 6
查看完整版本: Arduino入门教程--第十八课--Arduino驱动数码管