找回密码
 立即注册

QQ登录

只需一步,快速开始

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

不到100行代码,51单片机32位数码管动态扫描显示

[复制链接]
ID:730135 发表于 2021-7-10 22:03 | 显示全部楼层 |阅读模式
51单片机使用573锁存器,32位数码管动态显示,时间仿真显示
51单片机到底能带动多少位数码管呢?

本次演示proteus版本为8.6
51hei.gif

单片机源程序如下:
  1. #include "AT89X52.H"

  2. /* */

  3. code unsigned char reg_code[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  4. code unsigned char reg_code1[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};   //阴码  (共阴的数码管的段码)


  5. #define DELAY_N 1000


  6. unsigned char time[3] = {12,34,50};

  7. void show_time(void);
  8. void get_time(void);


  9. void main(void)
  10. {
  11.         unsigned short j;
  12.                
  13.         P2 = 0;
  14.         
  15.         P1_0 = 1;
  16.         P1_1 = 1;
  17.         P1_2 = 1;
  18.         
  19.         
  20.         P0 = reg_code1[1];
  21.         
  22.         
  23.         while(1)
  24.         {
  25.                 show_time();        

  26.                 get_time();    //获取时间        
  27.         }
  28.         
  29. }


  30. void show_time(void)
  31. {
  32.         char i;
  33.         unsigned short j;
  34.         
  35.         unsigned char buf[8]={10,10,10,10,10,10,10,10};
  36.         unsigned char buf1[8]={1,2,3,4,5,6,7,8};
  37.         unsigned char buf2[8]={3,2,1,4,5,6,3,2};
  38.         
  39.         
  40.         
  41.         buf[0] = time[0]/10;
  42.         buf[1] = time[0]%10;   //除以10,得到余数
  43.         buf[3] = time[1]/10;
  44.         buf[4] = time[1]%10;
  45.         buf[6] = time[2]/10;
  46.         buf[7] = time[2]%10;
  47.         
  48.         for (i=0;i<8;i++)
  49.         {
  50.                 P2 = i<<2;
  51.         
  52.                 P1_0 = 1;   //让P0的数据通过573
  53.                 P0 = reg_code1[buf[i]];
  54.                 P1_0 = 0;    //锁住这个数据,P0无法通过573

  55.                 //for(j=0;j<60000;j++);

  56.                
  57.                
  58.                 P1_1 = 1;
  59.                 P0 = reg_code1[buf1[i]];
  60.                 P1_1 = 0;    //锁住这个数据

  61.         //        for(j=0;j<60000;j++);
  62.                
  63.                 P1_2 = 1;
  64.                 P0 = reg_code1[buf2[i]];
  65.                 P1_2 = 0;    //锁住这个数据

  66.                
  67.                 for(j=0;j<200;j++);
  68.                 P0 = 0;   //熄灭所有的段
  69.                                 
  70.         }
  71. }



  72. //获得时间
  73. void get_time(void)
  74. {
  75.         static unsigned char j;
  76.         
  77.         if(j++>50)
  78.         {
  79.                 j = 0;
  80.                 time[2]++;  //秒
  81.                 if(time[2] > 59)
  82.                 {
  83.                         time[2] = 0;
  84.                         time[1] ++;
  85.                         if(time[1] > 59)
  86.                         {
  87.                                 time[1] = 0;
  88.                                 time[0] ++;
  89.                                 if(time[0] > 23)
  90.                                 {
  91.                                         time[0] = 0;
  92.                                 }
  93.                         }
  94.                 }
  95.                
  96.         }
  97.         
  98. }
复制代码
51hei.png
仿真代码51hei下载地址:
5.32个数码管显示51-test.rar (99.17 KB, 下载次数: 24)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:730135 发表于 2021-7-11 08:49 | 显示全部楼层
https://www.bilibili.com/video/BV1ph411Y7Hj?p=14,b站有全部的视频讲解,欢迎大家指教。
回复

使用道具 举报

ID:57657 发表于 2021-7-11 10:54 | 显示全部楼层
能带动多少个取决于功率,10000位都可以。
回复

使用道具 举报

ID:97554 发表于 2021-7-11 16:30 | 显示全部楼层
不用说51,上世纪90年代接触的KTV包房设备的点歌器,Intel的8031处理器,配合373锁存,显示30个数码管,20个按键,串口数据发送接收……
回复

使用道具 举报

ID:886808 发表于 2021-9-14 19:30 来自手机 | 显示全部楼层
npn 发表于 2021-7-11 10:54
能带动多少个取决于功率,10000位都可以。

看到你说的点歌器,我联想到当年用过的8031为主控芯片的程控电话。每天处理的电话无穷尽……。
同意你的观点,支持!!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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