找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机控制数码管动态显示 弄了好几天都达不到想要的效果

[复制链接]
ID:1061677 发表于 2023-1-28 17:40 | 显示全部楼层 |阅读模式
弄了好几天都达不到想要的效果,所以想在这里向大家取取经。
任务:使用51单片机控制6位数码管实时显示时钟,例如:当前时间位17:30:25,数码管则显示173025。
我设置的初始时间是12:34:56。
但最后初始显示的是5个6,然后是5个7,5个8……我觉得应该是动态显示那一部分写的有问题,但是不知道该如何改,跪求大家指教!
顺便说一下,数码管是共阳极数码管,P1口接的是段码,P2口接的是位选码。(位选码我不知道自己连的对不对)
51hei.gif
单片机源程序如下:
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. unsigned char count=0;
  4. unsigned char miao=56,min=34,hour=12;
  5. void delay(unsigned int i)
  6. {
  7.         unsigned int k;
  8.         for(k=0;k<i;k++);
  9. }
  10. void delay1s()
  11. {
  12.         unsigned char i;
  13.         for(i=0;i<20;i++)
  14.         {
  15.                 TH1=(65536-50000)/256;
  16.                 TL1=(65536-50000)%256;
  17.                 TR1=1;
  18.                 while(!TF1);
  19.                 TF1=0;
  20.         }
  21. }
  22. void disp(unsigned char x,unsigned char y,unsigned char z)
  23. {
  24.         unsigned int j;
  25.         unsigned char led[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  26.         for(j=0;j<6;j++)
  27.         {
  28.                 P1=0xff;
  29.                 P2=_crol_(0xfe,j);
  30.                 switch(j)
  31.                 {
  32.                         case 0:P1=led[x/10];break;
  33.                         case 1:P1=led[x%10];break;
  34.                         case 2:P1=led[y/10];break;
  35.                         case 3:P1=led[y%10];break;
  36.                         case 4:P1=led[z/10];break;
  37.                         case 5:P1=led[z%10];break;
  38.                         default:break;
  39.                 }
  40.                 delay(100);
  41.         }
  42. }
  43. void main()
  44. {
  45.         TMOD=0x10;
  46.         TH1=(65536-50000)/256;
  47.         TL1=(65536-50000)%256;
  48.         ET1=1;
  49.         EA=1;
  50.         TR1=1;
  51.         while(1)
  52.         {
  53.                 disp(hour,min,miao);
  54.                 delay1s();
  55.                 miao++;
  56.                 if(miao==60)
  57.                 {
  58.                         miao=0;
  59.                         min++;
  60.                         if(min==60)
  61.                         {
  62.                                 min=0;
  63.                                 hour++;
  64.                                 if(hour==24)
  65.                                 hour=0;
  66.                         }
  67.                 }
  68.         }
  69. }
复制代码

源程序 原理图.zip

107.36 KB, 下载次数: 3

回复

使用道具 举报

ID:213173 发表于 2023-1-28 20:27 | 显示全部楼层
无标题.jpg

  1. #include<reg51.h>
  2. #include<intrins.h>
  3. unsigned char led[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  4. unsigned int  count=0;
  5. unsigned char miao=56,min=34,hour=12;
  6. /*
  7. void delay(unsigned int i)
  8. {
  9.         unsigned int k;
  10.         for(k=0;k<i;k++);
  11. }
  12. void delay1s()
  13. {
  14.         unsigned char i;
  15.         for(i=0;i<20;i++)
  16.         {
  17.                 TH1=(65536-50000)/256;
  18.                 TL1=(65536-50000)%256;
  19.                 TR1=1;
  20.                 while(!TF1);
  21.                 TF1=0;
  22.         }
  23. }*/
  24. void disp()
  25. {
  26.         static unsigned char j;
  27.         P1=0xff;
  28.         P2&=0xc0;
  29.         P2|=0x01<<j;
  30.         switch(j)
  31.         {
  32.                 case 0:P1=led[hour/10];break;
  33.                 case 1:P1=led[hour%10]&0x7f;break;
  34.                 case 2:P1=led[min/10];break;
  35.                 case 3:P1=led[min%10]&0x7f;break;
  36.                 case 4:P1=led[miao/10];break;
  37.                 case 5:P1=led[miao%10];break;
  38.                 default:break;
  39.         }
  40.         j=++j%6;
  41. }
  42. void main()
  43. {
  44.         TMOD=0x10;
  45.         TH1=(65536-1000)/256;
  46.         TL1=(65536-1000)%256;
  47.         TF1=0;
  48. //        ET1=1;
  49. //        EA=1;
  50.         TR1=1;
  51.         while(1)
  52.         {
  53.                 if(TF1)
  54.                 {
  55.                         TF1=0;
  56.                         TH1=(65536-1000)/256;
  57.                         TL1=(65536-1000)%256;
  58.                         count++;
  59.                         if(count>=1000)
  60.                         {
  61.                                 count=0;
  62.                                 miao++;
  63.                         }
  64.                         if(miao>=60)
  65.                         {
  66.                                 miao=0;
  67.                                 min++;
  68.                         }
  69.                         if(min>=60)
  70.                         {
  71.                                 min=0;
  72.                                 hour++;
  73.                         }       
  74.                         if(hour>=24)
  75.                                 hour=0;
  76.                         disp();
  77.                 }
  78.         }
  79. }
复制代码



回复

使用道具 举报

ID:824490 发表于 2023-1-29 00:47 | 显示全部楼层
while(1)
{
单片机送段码1;位选 1;延时;(消隐;)//显示 第一个数字
单片机送段码2;位选 2;延时;(消隐;)//显示 第二个数字
单片机送段码3;位选 3;延时;(消隐;)//显示 第三个数字
单片机送段码4;位选 4;延时;(消隐;)//显示 第四个数字
单片机送段码5;位选 5;延时;(消隐;)//显示 第五个数字
单片机送段码6;位选 6;延时;(消隐;)//显示 第六个数字
}
回复

使用道具 举报

ID:1061677 发表于 2023-1-29 13:23 | 显示全部楼层
名字不是重点 发表于 2023-1-29 00:47
while(1)
{
单片机送段码1;位选 1;延时;(消隐;)//显示 第一个数字

谢谢,终于明白动态显示怎么操作了。
真的非常感谢!!!
回复

使用道具 举报

ID:1061677 发表于 2023-1-29 13:34 | 显示全部楼层

谢谢,太谢谢了,我知道我哪有问题了。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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