YFROBOT创客社区

标题: Arduino入门教程—基础实验篇九 数码管显示实验 [打印本页]

作者: AllBlue    时间: 2013-6-9 08:40
标题: Arduino入门教程—基础实验篇九 数码管显示实验
本帖最后由 AllBlue 于 2013-8-15 20:16 编辑

数码管显示实验

废话不多说,今天我们用数码管做一个数字显示实验!

首先我们看下我们要用到的实验元件:

UNO 实验套装(UNO兼容板一块、USB数据线一根、优质面包板一块、彩色面包板线若干)

共阳极一位数码管 一枚

电阻220Ω 八枚

数码管也称LED 数码管,是一种半导体发光器件,其基本单位是发光二极管。按段数可分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示);按能显示多少个“8”可分为1 位、2 位、4 位、7 位等数码管;按发光二极管单元连接方式分为共阳极数码管和共阴极数码管。

下图为本次实验所用数码管:
[attach]481[/attach]

LG5611BH,根据资料中命名规则可以得知,LG 公司名,56 表示0.56 英寸,1 表示1 位,1 为模具号,B 为共阳,H 为高亮红。

共阳极就是把所有LED 的阳极连接到共同接点com也就是公共极这里的3、8都是公共极,而每个LED的阴极分别为a、b、c、d、e、f、g 及dp(小数点)。如下图:
[attach]353[/attach]
数码管在应用中应注意如下几点:

a、段及小数点都要上加限流电阻这是为了使得数码管的显示亮度一样,有的人会在公共极上加一个电阻,那样的话,虽然8个LED亮度相同,但数字2和数字8的亮度就不同了,因为他们点亮的个数不同);

b、使用电压:根据发光颜色决定;

c、使用电流:静态总电流80mA(每段10mA);动态平均电流4-5mA 峰值电流100mA。
介绍完数码管,我们看下电路图(电路布线有点多,但是只要仔细点,对大家来说还是小意思的):
[attach]482[/attach]
实验例程:

  1. /*
  2. 数码管显示
  3. 数码管连续显示1~9
  4. */

  5. //设置控制各段的数字IO脚
  6. int a=7;
  7. int b=6;
  8. int c=5;
  9. int d=11;
  10. int e=10;
  11. int f=8;
  12. int g=9;
  13. int dp=4;
  14. //显示数字1
  15. void digital_1()
  16. {
  17. unsigned char j;
  18. digitalWrite(c,LOW); //给数字5引脚低电平,点亮c段
  19. digitalWrite(b,LOW); //点亮b段
  20. for(j=7;j<=11;j++) //熄灭其余段
  21. digitalWrite(j,HIGH);
  22. digitalWrite(dp,HIGH); //熄灭小数点DP段
  23. }
  24. //显示数字2
  25. void digital_2()
  26. {
  27. unsigned char j;
  28. digitalWrite(b,LOW);
  29. digitalWrite(a,LOW);
  30. for(j=9;j<=11;j++)
  31. digitalWrite(j,LOW);
  32. digitalWrite(dp,HIGH);
  33. digitalWrite(c,HIGH);
  34. digitalWrite(f,HIGH);
  35. }
  36. //显示数字3
  37. void digital_3()
  38. {
  39. unsigned char j;
  40. digitalWrite(g,LOW);
  41. digitalWrite(d,LOW);
  42. for(j=5;j<=7;j++)
  43. digitalWrite(j,LOW);
  44. digitalWrite(dp,HIGH);
  45. digitalWrite(f,HIGH);
  46. digitalWrite(e,HIGH);
  47. }
  48. //显示数字4
  49. void digital_4()
  50. {
  51. digitalWrite(c,LOW);
  52. digitalWrite(b,LOW);
  53. digitalWrite(f,LOW);
  54. digitalWrite(g,LOW);
  55. digitalWrite(dp,HIGH);
  56. digitalWrite(a,HIGH);
  57. digitalWrite(e,HIGH);
  58. digitalWrite(d,HIGH);
  59. } //显示数字5
  60. void digital_5()
  61. {
  62. unsigned char j;
  63. for(j=7;j<=9;j++)
  64. digitalWrite(j,LOW);
  65. digitalWrite(c,LOW);
  66. digitalWrite(d,LOW);
  67. digitalWrite(dp,HIGH);
  68. digitalWrite(b,HIGH);
  69. digitalWrite(e,HIGH);
  70. }
  71. //显示数字6
  72. void digital_6()
  73. {
  74. unsigned char j;
  75. for(j=7;j<=11;j++)
  76. digitalWrite(j,LOW);
  77. digitalWrite(c,LOW);
  78. digitalWrite(dp,HIGH);
  79. digitalWrite(b,HIGH);
  80. }
  81. //显示数字7
  82. void digital_7()
  83. {
  84. unsigned char j;
  85. for(j=5;j<=7;j++)
  86. digitalWrite(j,LOW);
  87. digitalWrite(dp,HIGH);
  88. for(j=8;j<=11;j++)
  89. digitalWrite(j,HIGH);
  90. }
  91. //显示数字8
  92. void digital_8()
  93. {
  94. unsigned char j;
  95. for(j=5;j<=11;j++)
  96. digitalWrite(j,LOW);
  97. digitalWrite(dp,HIGH);
  98. }
  99. //显示数字9
  100. void digital_9()
  101. {
  102. unsigned char j;
  103. for(j=5;j<=9;j++)
  104. digitalWrite(j,LOW);
  105. digitalWrite(e,HIGH);
  106. digitalWrite(dp,HIGH);
  107. }
  108. void setup() {
  109. int i;//定义发量
  110. for(i=4;i<=11;i++)
  111. pinMode(i,OUTPUT); //设置4~11引脚为输出模式
  112. }
  113. void loop()
  114. {
  115. while(1)
  116. {
  117. digital_1();//数字1
  118. delay(1000);//延时2s
  119. digital_2(); //数字2
  120. delay(1000); //延时2s
  121. digital_3(); //数字3
  122. delay(1000); //延时2s
  123. digital_4(); //数字4
  124. delay(1000); //延时2s
  125. digital_5(); //数字5
  126. delay(1000);//延时2s
  127. digital_6(); //数字6
  128. delay(1000); //延时2s
  129. digital_7(); //数字7
  130. delay(1000); //延时2s
  131. digital_8(); //数字8
  132. delay(1000);//延时2s
  133. digital_9(); //数字9
  134. delay(1000);//延时2s
  135. }
  136. }
复制代码

将程序上传到UNO控制板中,可以看到数码管依次显示数字1~9!

程序有点繁琐,下面我们提供另一种显示程序,简化版:

  1. /*
  2. 数码管显示
  3. 数码管连续循环显示0~9
  4. */

  5. byte DIGITAL_DISPLAY[10][8] = { //设置0-9数字所对应数组
  6. { 1,0,0,0,0,1,0,0 }, // = 0
  7. { 1,0,0,1,1,1,1,1 }, // = 1
  8. { 1,1,0,0,1,0,0,0 }, // = 2
  9. { 1,0,0,0,1,0,1,0 }, // = 3
  10. { 1,0,0,1,0,0,1,1 }, // = 4
  11. { 1,0,1,0,0,0,1,0 }, // = 5
  12. { 1,0,1,0,0,0,0,0 }, // = 6
  13. { 1,0,0,0,1,1,1,1 }, // = 7
  14. { 1,0,0,0,0,0,0,0 }, // = 8
  15. { 1,0,0,0,0,0,1,0 } // = 9
  16. };

  17. void setup() { //设定4-11号数字端口为输出
  18. for(int i=4;i<=11;i++){
  19. pinMode(i, OUTPUT);
  20. }
  21. }

  22. void loop() {
  23. //0-9数字显示
  24. for (int k = 0; k < 10; k++) {
  25. int pin = 4;
  26. for (int s = 0; s < 8; s++)
  27. {
  28. digitalWrite(pin, DIGITAL_DISPLAY[k][s]);
  29. pin++;
  30. }
  31. delay(1000);
  32. }
  33. }
复制代码

这个程序相对上面那个很简单了,它通过定义一个数组,来控制数码管每个led的亮灭来显示数字!同样将它上传到控制板中,看看效果吧!


作者: ziwei590    时间: 2018-6-1 07:40
牛叉的教程,我喜欢,这种基础扎实的干货
作者: tiantianyouyou    时间: 2019-5-1 20:42
Arduino入门教程—基础实验篇九 数码管显示实验
作者: lucq7896    时间: 2019-7-16 08:44
对新手很有用




欢迎光临 YFROBOT创客社区 (http://yfrobot.com.cn/) Powered by Discuz! X3.1