当前位置:   article > 正文

51单片机 动态、静态数码管显示_51单片机数码管动态显示

51单片机数码管动态显示

1.数码管在51上的显示及介绍:

 

 数码管又称作LED数码管,是一种简单、廉价的显示器,是由多个发光二极管封装在一起组成的“8”字型器件;

上面的共阴极连接;下边的共阳极连接;也就是发光二级管的阳极连接在一起,发光二级管的阴极连接在一起;

数码管的引脚连接方式;

 一位数码管:

注意:8个引脚对应A B C D E F G DP;分别对应数字“8”的7个位置,所以想要使数码管显示出自己想要的数字,只需让对应位置的灯亮即可;

 共阳极是低电平0亮;共阴极是高电平1亮;

四位一体数码管:

类似于我们51单片机上的数码管(4个放在一起的);

 四位一体的数码管12个引脚;上边的连接方式叫共阴极连接;下边的连接方式叫共阳极连接;

共阴极是高电平1不亮;低电平0亮;(只是四位中让哪个亮,选择其中一个之后在按照1位的高电平1亮,低电平0不亮去设置)

注意:在同一时刻,只能有一个数码管被点亮,即使有多个被点亮,也只显示同一个一位指令;

2.数码管第三个位置显示为6:

 首先注意:给到位的输出信号一定是高位对高位;也就是说右边给到信号是1011110 从上到下对应的引脚是一次升高的,转换到LED输出接口P0时,一定是从下往上,高位对应到高位;

第三个灯是LED6(灯的序号排序是从右往左的 8 7 6 5 4 3 2 1)LED 6对应的是74HC138译码器的Y5接口,5转换成二进制位是101;连接芯片的译码器上有P22、P23、P24三个输出接口,来输出二进制位信号;

想让数码管显示出相应的数字,需要按照a b c d e f g dp来控制高低电位;高位对高位;LED显示6;所以是a b c d e f g dp=1 0 1 1 1 1 1 0;高位对高位=0 1 1 1 1 1 0 1;转换成十六进制位输出=0x7D;

  1. #include <REGX52.H>
  2. #include <INTRINS.H>
  3. void main()
  4. {
  5. P2_4=1;
  6. P2_3=0;
  7. P2_2=1;
  8. P0=0x7D;
  9. while(1)
  10. {
  11. }
  12. }

根据原理图可得:74HC138译码器连接8个LED引脚,有3个输出接口,分别是P2_2;  P2_3 ; P2_4;分别接译码器的Y引脚的二进制数,例如:LED6接到译码器上对应Y5;5转换成二进制数为101;分别接到三个输出接口P2_2;  P2_3 ; P2_4上,P0对应动态数码管的输出接口,要按照a b c d e f g dp来控制高低电位;高位对高位;LED显示6;所以是a b c d e f g dp=1 0 1 1 1 1 1 0;高位对高位=0 1 1 1 1 1 0 1;转换成十六进制位输出=0x7D;

3. 使用子函数优化程序代码: 

 原理:首先定义子函数,进行传参,Nixie第一个参数是地址(第几个数码管的位置,从左往右)(原理图上的LED0/1/2/3/4/5/6/7在51单片机上体现是从右往左的),第二个是数字(数码管上显示的数字大小);

switch语句选择8个位置,每个位置上对应译码器的输出二进制数;切记用break截止,否则将连续执行;

用数组定义:0-9的数字,也就是在数码管上显示出来的数字大小;a b c d e f g dp对应高电位亮,最后转成十六进制位输出;P0直接调用;

  1. #include <REGX52.H>
  2. #include <INTRINS.H>
  3. unsigned char NixieTable[]={0x3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F};
  4. void Nixie(unsigned char Location,Number)
  5. {
  6. switch(Location)
  7. {
  8. case 1:P2_4=1;P2_3=1;P2_2=1;break;
  9. case 2:P2_4=1;P2_3=1;P2_2=0;break;
  10. case 3:P2_4=1;P2_3=0;P2_2=1;break;
  11. case 4:P2_4=1;P2_3=0;P2_2=0;break;
  12. case 5:P2_4=0;P2_3=1;P2_2=1;break;
  13. case 6:P2_4=0;P2_3=1;P2_2=0;break;
  14. case 7:P2_4=0;P2_3=0;P2_2=1;break;
  15. case 8:P2_4=0;P2_3=0;P2_2=0;break;
  16. }
  17. P0=NixieTable[Number];
  18. }
  19. void main()
  20. {
  21. Nixie(4,1);
  22. while(1)
  23. {
  24. }
  25. }

4.动态数码管显示:

动态数码管的显示为:使用循环while()让第一个位置显示1,第二个位置显示2;以此类推;

其中如果延迟函数Delay的延迟时间过短,可能会出现消影的现象------循环太快可能导致的数码管数字乱位的现象;

  1. #include <REGX52.H>
  2. #include <INTRINS.H>
  3. void Delay(unsigned int xms)
  4. {
  5. unsigned char i,j;
  6. while(xms)
  7. {
  8. i=2;
  9. j=239;
  10. do
  11. {
  12. while(--j);
  13. }
  14. while(--i);
  15. xms--;
  16. }
  17. }
  18. unsigned char NixieTable[]={0x3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F};
  19. void Nixie(unsigned char Location,Number)
  20. {
  21. switch(Location)
  22. {
  23. case 1:P2_4=1;P2_3=1;P2_2=1;break;
  24. case 2:P2_4=1;P2_3=1;P2_2=0;break;
  25. case 3:P2_4=1;P2_3=0;P2_2=1;break;
  26. case 4:P2_4=1;P2_3=0;P2_2=0;break;
  27. case 5:P2_4=0;P2_3=1;P2_2=1;break;
  28. case 6:P2_4=0;P2_3=1;P2_2=0;break;
  29. case 7:P2_4=0;P2_3=0;P2_2=1;break;
  30. case 8:P2_4=0;P2_3=0;P2_2=0;break;
  31. }
  32. P0=NixieTable[Number];
  33. // Delay(1);//消影,循环太快会使数码管乱位的现象
  34. // P0=0x00;
  35. }
  36. void main()
  37. {
  38. while(1)
  39. {
  40. Delay(200);
  41. Nixie(1 ,1);
  42. Delay(200);
  43. Nixie(2 ,2);
  44. Delay(200);
  45. Nixie(3 ,3);
  46. Delay(200);
  47. Nixie(4 ,4);
  48. Delay(200);
  49. Nixie(5 ,5);
  50. Delay(200);
  51. Nixie(6 ,6);
  52. Delay(200);
  53. Nixie(7 ,7);
  54. Delay(200);
  55. Nixie(8 ,8);
  56. Delay(200);
  57. }
  58. }

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

闽ICP备14008679号