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

[复制链接]
查看2 | 回复0 | 2021-7-11 23:46:39 | 显示全部楼层 |阅读模式
51单片机使用573锁存器,32位数码管动态显示,时间仿真显示
51单片机到底能带动多少位数码管呢?

本次演示proteus版本为8.6
1.jpg
部分源码:完整源码见附件
  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. }
复制代码
数码管显示源码和仿真文件.rar (99.17 KB, 售价: 1 工控币)

回复

使用道具 举报

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

本版积分规则