当前位置:   article > 正文

51单片机———数码管显示_51单片机 数码管显示

51单片机 数码管显示

一、数码管介绍

1、数码管分类:

  静态数码管(单个,一位)  和 动态数码管(联排,2位、4位、8位)

   开发板上数码管位置如图所示:

可以看到数码管就是显示器件,用来显示数字

2、数码管定义

    是由多个发光二极管封装在一起形成“8”字形的器件

3、共阳极和共阴极数码管

   一个数码管内部的8个LED独立驱动的。如果8个LED的一端接在一起接到VCC上(负极分别接到单片机的不同引脚),这种接法就叫共阳极

反之如果8个LED一端接在一起接到GND(正极就分别接到单片机的不同引脚)就叫共阴极

两种接法都可以驱动数码管显示,但是一个是给予低电平才能亮,一个是给予高电平才能亮。总而言之,原理都一样,不管那一端默认接的是正极还是负极,只要通过程序控制另一端是低电平还是高电平(给0还是给1),使其电路完整就能点亮LED,进而获得自己想要的数字。

二、静态数码管:

1、根据原理图可知:

静态数码管一端默认为VCC(也就是高电平),所以要使静态数码管显示数字,只需要在其另一端(也就是J8引脚处给予低电平即可),同样可以看到,J8的8个引脚分别对应“8”字形的8个LED二极管(a、b、c、d、e、f、g、dp) ,所以也就是通过给予低电平来决定哪个LED灯亮进而显示出想要的数字

2、静态数码管编程示例

要想显示数字0则需要除了g和dp以外的二极管发光,所以需要给予g和dp高电平,给予其他低电平(低电平给0 高电平给1),如下:

通过杜邦线将J8与P0一一对应连接:

注意:因为P0_7至P0_0是高位到低位,所以应该是从P0_7开始读起,也就是1100 0000,转化为十六进制为0xC0

代码如下:

  1. #include <REGX52.H>
  2. void main()
  3. {
  4. while(1)
  5. {
  6. P0 = 0xC0; //1100 0000
  7. }
  8. }

所以想要获得什么数字,只需要修改并查询所对应的十六进制是什么即可;

3、动态数字闪烁

如果想要得到动态的数字闪烁,只需要在循环中增加程序和延时功能即可,程序如下:

  1. #include <REGX52.H>
  2. void Delay(unsigned char xms)
  3. {
  4. unsigned char i, j;
  5. while(xms--)
  6. {
  7. i = 2;
  8. j = 239;
  9. do
  10. {
  11. while (--j);
  12. } while (--i);
  13. }
  14. }
  15. void main()
  16. {
  17. while(1)
  18. {
  19. P0 = 0xC0; //显示0
  20. Delay(200);
  21. P0 = 0xF9; //显示1
  22. Delay(200);
  23. P0 = 0xA4; //显示2
  24. Delay(200);
  25. P0 = 0xB0 ; //显示3
  26. Delay(200);
  27. }
  28. }

三、动态数码管

1、原理图:

根据对静态数码管的解释,再看动态数码管就会简单简单一些,可以清楚递看到二者的区别,虽然说静态数码管驱动简单直接,且好编程,但是它每一个LED灯都需要一个端口,所以这才有了动态数码管,可以看到动态数码管8个a位LED灯全部接在一个引脚上(此板J6给1则亮,J1给0则亮)

2、动态数码管端口

数码管有2端:COM端和段码端

COM(共极)接单片机一个IO口,多个联排数码管的COM共同接一个IO端

静态和动态数码管本质区别是:静态数码管中只要给了段码数码管就一定工作(显示只取决于段码端),动态数码管中段码端给了段码值后还需要COM端配合才能点亮数码管。

简单来说:J1操控的是8个“8”字形,相当于总开关;而J6操控的是每一个“8”字形里面的LED灯亮灭情况,需要二者配合才能成功点亮某一个位置8并且显示数字。

3、动态数码管编程示例

想要在第二个位置显示数字0:

连线如下:两组杜邦线,一组连接J1和P0端 ,一组连接J6和P1端

程序如下

  1. #include <REGX52.H>
  2. void main()
  3. {
  4. while(1)
  5. {
  6. P0 = 0xBF; //1011 1111
  7. P1 = 0x3F; //0011 1111
  8. }
  9. }

供参考:0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F   分别是0-9的表示(针对P1端)

 0x7F; 0xBF; 0xDF; 0xEF; 0xF7; 0xFB; 0xFD; 0xFE 分别是1-8的表示,决定第几个8字形亮(针对P0端)

4、动态数码管静态显示

新的问题来了,如果我想要指定某个位置的8显示某个数字,我就得重新再对重新进行修改,未免过于麻烦,所以想到使用数组和switch-case,将上面的参考数据全部装起来。

程序如下:

  1. #include <REGX52.H>
  2. int Number[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
  3. void Nixie(unsigned char Location,number)
  4. {
  5. switch (Location)
  6. { case 1 : P0 = 0x7F;break;
  7. case 2 : P0 = 0xBF;break;
  8. case 3 : P0 = 0xDF;break;
  9. case 4 : P0 = 0xEF;break;
  10. case 5 : P0 = 0xF7;break;
  11. case 6 : P0 = 0xFB;break;
  12. case 7 : P0 = 0xFD;break;
  13. case 8 : P0 = 0xFE;break;
  14. }
  15. P1=Number[number];
  16. }
  17. void main()
  18. {
  19. Nixie(2,0); //只需要改变这里的两个数即可获得第几个位置显示什么数字,这表示第2个位置显示0)
  20. while(1)
  21. {
  22. }
  23. }

5、动态数码管动态显示

在以上基础,又如何实现流动的数字呢?只需要在循环当中增贴即可:

  1. #include <REGX52.H>
  2. int Number[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
  3. void Delay(unsigned char xms)
  4. {
  5. unsigned char i, j;
  6. while(xms--)
  7. {
  8. i = 2;
  9. j = 239;
  10. do
  11. {
  12. while (--j);
  13. } while (--i);
  14. }
  15. }
  16. void Nixie(unsigned char Location,number)
  17. {
  18. switch (Location)
  19. { case 1 : P0 = 0x7F;break;
  20. case 2 : P0 = 0xBF;break;
  21. case 3 : P0 = 0xDF;break;
  22. case 4 : P0 = 0xEF;break;
  23. case 5 : P0 = 0xF7;break;
  24. case 6 : P0 = 0xFB;break;
  25. case 7 : P0 = 0xFD;break;
  26. case 8 : P0 = 0xFE;break;
  27. }
  28. P1=Number[number];
  29. }
  30. void main()
  31. {
  32. while(1)
  33. {
  34. Nixie(1,1);
  35. Delay(200);
  36. Nixie(2,2);
  37. Delay(200);
  38. Nixie(3,3);
  39. Delay(200);
  40. Nixie(4,4);
  41. Delay(200);
  42. Nixie(5,5);
  43. Delay(200);
  44. Nixie(6,6);
  45. Delay(200);
  46. Nixie(7,7);
  47. Delay(200);
  48. Nixie(8,8);
  49. Delay(200);
  50. }
  51. }

效果如下:

WeChat_20240218172716

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/408773
推荐阅读
相关标签
  

闽ICP备14008679号