• 51单片机STC89C52RC——3.1 数码管静态展示


    目的

    让数码管在指定位置显示指定数字

    一,STC单片机模块

    二,数码管 

    2.1 数码管位置

    2.2 生活中用到的数目管

    红绿灯

    LED数码管在生活中随处可见,洗衣机、电饭煲、热水器、微波炉、冰箱、这些最基本的家用电器上基本都用到了这种7段LED数码管(LED灯的个数)。

    2.3 数码管的分类


    按显示段数分:分为七段、八段、九段、十四段和十六段


    七段:七段数码管由7个LED构成

    八段:八段数码管比七段多了一个小数点

    九段:九段数码管由9个LED构成

    十四段:十四段数码管由14个LED构成
    十六段:十六段数码管由16个LED构成

    按显示位数分:分为1位、2位、3位及多位数码管(大于1位),

    我们的板子上是8段4位。

     2.4 数码管电路图

    单个数码管的电路图设计如下


    内部接线图如下两种

    第一种:共阴极(8个LED的负极接一起)

    第二种:共阳极(8个LED的正极接一起)

    可以看到,这个‘8’有A、B、C、D、E、F、G和DP8个LED构成。我们在程序上只需要将对应位置的LED点亮就可以了。ABCDEFG‘DP’8个位置刚好对应上一个byte的8个Bit位。要注意这里是与byte的低位对齐。

    比如:

    数字‘0’就是A、B、C、D、E、F位置的LED亮起。0011 1111 ,十六进制0x3F;

    数字‘1’就是B、C 两个位置LED亮起。二进制0000 0110 ,十六进制0x06;

    数字‘2’就是A、B、G、E、D位置的LED亮起、

    ……

    以此类推,我们可以用HEX罗列出数码管能展示的所有可供我们认识的字符,要显示对应的字符,则P0值如下表

    数码管显示点亮位置的LED十六进制
    (P0值)
    二进制
    DPGFEDCBA
    0ABCDEF0x3F00111111
    1BC0x0600000110
    2ABGED0x5B01011011
    3ABCDG0x4F01001111
    4FGBC0x6601100110
    5AFGCD0x6D01101101
    6AFEDCG0x7D01111101
    7ABC0x0700000111
    8ABCDEFG0x7F01111111
    9GFABCD0x6F01101111
    AABCEFG0x7701110111
    CAFED0x3900111001
    EAFEDG0x7901111001
    FAFEG0x7101110001
    HBCEFG0x7601110110
    JBCDE0x1E00011110
    LFED0x3800111000
    pABGFE0x7301110011
    qABGFC0x6701100111
    UBCDEF0x3E00111110
    .'DP'0x8010000000
    bFEGDC0x7C01111100
    dBCDEG0x5E01011110
    uCDE0x1C00011100

    这里我们在程序中用两个数组表示;

    1. /*数码管可显示值*/
    2. unsigned int ShuMaGuan_EnableDisplayValue[]={0,1,2,3,4,5,6,7,8,9,
    3. 'A','C','E','F','H','J','L','P','q','U','.','b','d','u'};
    4. /*数码管显示值对应的HEX*/
    5. unsigned int ShuMaGuan_EnableDisplayHEX[]={
    6. 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,
    7. 0x77,0x39,0x79,0x71,0x76,0x1E,0x38,0x73,0x67,0x3E,0x80,0x7C,0x5E,0x1C};
    1. /**
    2. * 函 数:获取可显值对应的HEX
    3. * 参 数:数码管显示的值
    4. * 返 回 值:数码管显示时对应的HEX
    5. */
    6. unsigned int ShuMaGuan_GetEnableDisplayValueOfHEX(unsigned int Value)
    7. {
    8. unsigned int index=0;
    9. for(index=0;index<24;index++)//遍历显示值的数组
    10. {
    11. if(ShuMaGuan_EnableDisplayValue[index]==Value)//找到对应值的索引
    12. {
    13. break;
    14. }
    15. }
    16. return ShuMaGuan_EnableDisplayHEX[index];
    17. }
    18. /**
    19. * 函 数:设置数码管要显示的值
    20. * 参 数:显示值
    21. * 返 回 值:无
    22. */
    23. void ShuMaGuan_SetDisplayValue(unsigned int Value)
    24. {
    25. /*将要显示的值 复制给P0*/
    26. P0=ShuMaGuan_GetEnableDisplayValueOfHEX(Value);
    27. }


    数码管中的8个LED的一端已经通过上面P0设置成功,另一端我们也要设置接通LED才会连接到电路中导通。所以我们还需要了解74HC138译码器。

    2.5 74HC138 译码器        

    译码器的作用:简单理解就是尽量让程序设置少的针脚通断去控制逻辑电路通断和数据传输

    假如在这里不用译码器,我们全部用单一导线和开关将LED的两端与电源正负极接通。那么线路就比较多,引脚也较多,我们程序中要控制的就增加。

    在74HC138译码器上,有三个引脚P22、P23、P24,每个引脚都可以有通断(0、1)那么我们用三位的二进制就可以满足8个位置上通断。

    CBA
    P24P23P22
    LED1111
    LED2110
    LED3101
    LED4100
    LED5011
    LED6010
    LED7001
    LED8000

    我们程序想让那个位置上的LED亮起,就设置对应值就导通了!

    1. /**
    2. * 函 数:设置要显示的数码管 位置
    3. * 参 数:位置(左起1-8)
    4. * 返 回 值:无
    5. */
    6. void ShuMaGuan_SetDisplayLocation(unsigned int Location)
    7. {
    8. switch(Location) //位码输出
    9. {
    10. case 1:P2_4=1;P2_3=1;P2_2=1;break;
    11. case 2:P2_4=1;P2_3=1;P2_2=0;break;
    12. case 3:P2_4=1;P2_3=0;P2_2=1;break;
    13. case 4:P2_4=1;P2_3=0;P2_2=0;break;
    14. case 5:P2_4=0;P2_3=1;P2_2=1;break;
    15. case 6:P2_4=0;P2_3=1;P2_2=0;break;
    16. case 7:P2_4=0;P2_3=0;P2_2=1;break;
    17. case 8:P2_4=0;P2_3=0;P2_2=0;break;
    18. }
    19. }

    有了上面两步,我们在主函数就只需要设置在数码管的哪个位置显示什么值就好。

    1. /**
    2. * 函 数:数码管展示
    3. * 参 数:Location 显示的位置,Value 显示的值
    4. * 返 回 值:无
    5. */
    6. void ShuMaGuan_Display(unsigned int Location,unsigned int Value)
    7. {
    8. /*显示位置*/
    9. ShuMaGuan_SetDisplayLocation(Location);
    10. /*显示值*/
    11. ShuMaGuan_SetDisplayValue(Value);
    12. }

    三,创建Keil项目

    详细参考:51单片机STC89C52RC——创建Keil项目-CSDN博客

    四,代码 

    main.c 如下 

    1. #include
    2. #include "ShuMaGuan.h"
    3. /**
    4. * 函 数:主函数
    5. * 参 数:无
    6. * 返 回 值:无
    7. */
    8. void main()
    9. {
    10. /*在数码管的第一个位置显示2*/
    11. ShuMaGuan_Display(1,2);
    12. while(1)
    13. {
    14. }
    15. }

    ShuMaGuan.h如下

    1. #ifndef __SHUMAGUAN_H_
    2. #defind __SHUMAGUAN_H_
    3. void ShuMaGuan_Display(unsigned int Location,unsigned int Value);
    4. #endif

    ShuMaGuan.c如下

    1. #include
    2. /*数码管可显示值*/
    3. unsigned int ShuMaGuan_EnableDisplayValue[]={0,1,2,3,4,5,6,7,8,9,
    4. 'A','C','E','F','H','J','L','P','q','U','.','b','d','u'};
    5. /*数码管显示值对应的HEX*/
    6. unsigned int ShuMaGuan_EnableDisplayHEX[]={
    7. 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,
    8. 0x77,0x39,0x79,0x71,0x76,0x1E,0x38,0x73,0x67,0x3E,0x80,0x7C,0x5E,0x1C};
    9. /**
    10. * 函 数:获取可显值对应的HEX
    11. * 参 数:数码管显示的值
    12. * 返 回 值:数码管显示时对应的HEX
    13. */
    14. unsigned int ShuMaGuan_GetEnableDisplayValueOfHEX(unsigned int Value)
    15. {
    16. unsigned int index=0;
    17. for(index=0;index<24;index++)//遍历显示值的数组
    18. {
    19. if(ShuMaGuan_EnableDisplayValue[index]==Value)//找到对应值的索引
    20. {
    21. break;
    22. }
    23. }
    24. return ShuMaGuan_EnableDisplayHEX[index];
    25. }
    26. /**
    27. * 函 数:设置数码管要显示的值
    28. * 参 数:显示值
    29. * 返 回 值:无
    30. */
    31. void ShuMaGuan_SetDisplayValue(unsigned int Value)
    32. {
    33. /*将要显示的值 复制给P0*/
    34. P0=ShuMaGuan_GetEnableDisplayValueOfHEX(Value);
    35. }
    36. /**
    37. * 函 数:设置要显示的数码管 位置
    38. * 参 数:位置(左起1-8)
    39. * 返 回 值:无
    40. */
    41. void ShuMaGuan_SetDisplayLocation(unsigned int Location)
    42. {
    43. switch(Location) //位码输出
    44. {
    45. case 1:P2_4=1;P2_3=1;P2_2=1;break;
    46. case 2:P2_4=1;P2_3=1;P2_2=0;break;
    47. case 3:P2_4=1;P2_3=0;P2_2=1;break;
    48. case 4:P2_4=1;P2_3=0;P2_2=0;break;
    49. case 5:P2_4=0;P2_3=1;P2_2=1;break;
    50. case 6:P2_4=0;P2_3=1;P2_2=0;break;
    51. case 7:P2_4=0;P2_3=0;P2_2=1;break;
    52. case 8:P2_4=0;P2_3=0;P2_2=0;break;
    53. }
    54. }
    55. /**
    56. * 函 数:数码管展示
    57. * 参 数:Location 显示的位置,Value 显示的值
    58. * 返 回 值:无
    59. */
    60. void ShuMaGuan_Display(unsigned int Location,unsigned int Value)
    61. {
    62. /*显示位置*/
    63. ShuMaGuan_SetDisplayLocation(Location);
    64. /*显示值*/
    65. ShuMaGuan_SetDisplayValue(Value);
    66. }

    五,代码编译、下载到51单片机

    代码编译请参考

    51单片机STC89C52RC——代码编译-CSDN博客

    代码下载请参考

    《51单片机STC89C52RC——STCAI-ISP代码下载-CSDN博客

    六,效果

  • 相关阅读:
    FastAPI 学习之路(五十)WebSockets(六)聊天室完善
    TiDB 工具适用场景
    LeetCode 周赛上分之旅 #33 摩尔投票派上用场
    使用 Java 操作 Redis
    python 练习--更新
    NativeScaler()与loss_scaler【loss.backward()和 optimizer.step()】
    娄底疾控中心实验室设计理念说明
    WebSocket实现聊天功能
    使用vue-cli搭建spa项目
    【大数据模型】让chatgpt为开发增速(开发专用提示词)
  • 原文地址:https://blog.csdn.net/oopxiajun2011/article/details/139752914