找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4357|回复: 4
收起左侧

51单片机动态数码管驱动源程序

[复制链接]
ID:523178 发表于 2020-3-29 18:37 | 显示全部楼层 |阅读模式
我使用的板子上有8个动态数码管。可以根据自己的动态数码管个数修改。动态数码管和静态数码管的区别是:动态数码管多了个位选。我使用板子上有一个74HC138芯片,叫做3-8译码器,使用该芯片控制动态数码管位选。下面简单介绍一下这个芯片:该芯片A0~A2是输入口,Y0~Y7是输出口,输入输出受E1,E2,E3控制,E1、E2要接地,E3接VCC才可以正常输出。大家可以自行在网上搜索该芯片的真值表来进行编程。使用该芯片驱动动态数码管有两个好处:
1. 大大节约单片机的I/O口,尤其是51单片机。
2. 增强对动态数码管的驱动能力,显示更清楚。(相比直接用8个I/O口驱动)
段选接了74HC245芯片,该芯片非常简单,总结一句话就是:I/O口输出高电平,它的输出端就输出高电平。

我分别用了两种方法实现了动态数码管的显示,下面直接上代码。

单片机源程序如下:
  1. #include "reg52.h"

  2. typedef unsigned char u8;
  3. typedef unsigned int u16;
  4. /* 对三线-八线译码器的三个输入引脚定义 */
  5. sbit LSA = P2^2;
  6. sbit LSB = P2^3;
  7. sbit LSC = P2^4;
  8. /* 用数组储存0~F的值,共阴码表 */
  9. //u8 code smgduan[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,
  10. //                                                0x7c,0x39,0x5e,0x79,0x71};   
  11. /* 定义一个1314-520 数码 */
  12. u8 code smgduan[8] = {0x06,0x4f,0x06,0x66,0x40,0x6d,0x5b,0x3f};

  13. /* 声明一个直接控制数码管位的函数 */
  14. //void direct_control();  

  15. /* 延时函数 */
  16. void delay(u16 i)
  17. {
  18.           while(i--);
  19. }

  20. /* 定义八个数码管显示器的位选函数 ,扫描数码管 */
  21. void Digdisplay()
  22. {
  23.         u8 i;
  24.         for(i = 0; i < 8; i++)
  25.         {
  26.                  switch(i)
  27.                 {
  28.                
  29.                          case (0):
  30.                                         LSA = 0; LSB = 0; LSC = 0; break;           // 000
  31.                         case (1):                                                                          
  32.                                         LSA = 1; LSB = 0; LSC = 0; break;           // 001
  33.                         case (2):                                                                          
  34.                                         LSA = 0; LSB = 1; LSC = 0; break;           // 010
  35.                         case (3):                                                                          
  36.                                         LSA = 1; LSB = 1; LSC = 0; break;           // 011
  37.                         case (4):
  38.                                         LSA = 0; LSB = 0; LSC = 1; break;           // 100
  39.                         case (5):
  40.                                         LSA = 1; LSB = 0; LSC = 1; break;           // 101
  41.                         case (6):
  42.                                         LSA = 0; LSB = 1; LSC = 1; break;           // 110
  43.                         case (7):
  44.                                         LSA = 1; LSB = 1; LSC = 1; break;           // 111
  45.                 }
  46.                 P0 = smgduan[i];
  47.                 delay(100);                     //改变参数的值能实现滚动显示。最大为65535,否则会溢出。
  48.                 P0 = 0x00;           //清空数码管,以防止出现重影。
  49.         }
  50. }

  51. void main(void)
  52. {
  53.         
  54.          while(1)
  55.         {
  56.                 Digdisplay();
  57. //                direct_control();
  58.         }
  59. }

  60. /* 直接控制数码管位 函数的定义 */
  61. /*void direct_control()
  62. {
  63.         u8 i;
  64.          for(i = 0; i < 8; i++)
  65.         {
  66.                  switch(i)
  67.                 {
  68.                          case (0): P1 = 0xfe; break;
  69.                         case (1): P1 = 0xfd; break;
  70.                         case (2): P1 = 0xfb; break;
  71.                         case (3): P1 = 0xf7; break;
  72.                         case (4): P1 = 0xef; break;
  73.                         case (5): P1 = 0xdf; break;
  74.                         case (6): P1 = 0xbf; break;
  75.                         case (7): P1 = 0x7f; break;          //直接控制8位数码管,不使用3-8译码器
  76.                 }
  77.                 P0 = smgduan[i];
  78.                 delay(100);
  79.                 P0 = 0x00;
  80.         }
  81. } */
复制代码

所有资料51hei提供下载:
DT_S_M_G.zip (19.43 KB, 下载次数: 10)

3线-8线译码器逻辑图

3线-8线译码器逻辑图
回复

使用道具 举报

ID:294296 发表于 2020-3-29 22:12 | 显示全部楼层
没猜错楼主的板子是普中HC6800开发板!
回复

使用道具 举报

ID:523178 发表于 2020-3-29 23:10 | 显示全部楼层
钟志伟 发表于 2020-3-29 22:12
没猜错楼主的板子是普中HC6800开发板!

哈哈,一点也没错。
回复

使用道具 举报

ID:619259 发表于 2020-3-30 18:30 | 显示全部楼层
74HC138+74HC245并不能大大节约单片机的I/O口,试试74HC595或者TM1650吧
回复

使用道具 举报

ID:523178 发表于 2020-3-30 22:51 | 显示全部楼层
cy009 发表于 2020-3-30 18:30
74HC138+74HC245并不能大大节约单片机的I/O口,试试74HC595或者TM1650吧

好 我了解一下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表