找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

自制了一个用数码管显示的单片机时钟,有点小问题,希望解答

查看数: 3961 | 评论数: 10 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2021-3-27 11:54

正文摘要:

各位大神好,本人做了一个数码管显示的时钟,但是现在有点小问题最后有仿真图,下面一张图片显示效果,下面有仿真图,protues8.6版本的,和开发板上的电路图是一样的 预实现功能: 时钟24小时显示,按下K1,时钟 ...

回复

ID:89515 发表于 2021-3-28 08:51
mengzhixinheng 发表于 2021-3-28 08:26
刚才没看程序,根据你的描述做出了判断。现在看了一下发现你的程序根本无法实现按键功能。程序处于等待状 ...

抱歉,没想到你把按键程序独立写成了一个循环函数。那么按键功能自然可以实现了,既然显示程序用了中断延时,就把按键程序也用中断延时就可以解决你的问题了。
ID:89515 发表于 2021-3-28 08:26
mengzhixinheng 发表于 2021-3-28 07:42
就是显示没有得到试试刷新嘛!你想一下怎么解决按下按键,立刻刷新程序的问题就行了。

刚才没看程序,根据你的描述做出了判断。现在看了一下发现你的程序根本无法实现按键功能。程序处于等待状态,如果不是因为显示函数放在中断中,显示功能都无法实现,太糟糕了。我不知道你为何等待,如果你非要这样写,那就把按键函数也放在中断中,这样至少可以达到你想要的目的,虽然这样并不好!!!
ID:89515 发表于 2021-3-28 07:42
就是显示没有得到试试刷新嘛!你想一下怎么解决按下按键,立刻刷新程序的问题就行了。
ID:213173 发表于 2021-3-27 17:36
这个示例可能对你有所帮助
数码管时钟长短按调整点闪烁 闹钟38译码器 仿真.zip (126.38 KB, 下载次数: 9)

ID:332444 发表于 2021-3-27 16:50
ID:876099 发表于 2021-3-27 16:49
lwh999995 发表于 2021-3-27 16:00
  • #include //代码有点乱,我也只能随意改改
  • #define uchar unsigned char
  • #define uint unsign ...

  • 其实可以直接说一下怎么改程序的
    ID:876099 发表于 2021-3-27 16:41
    munuc_w 发表于 2021-3-27 16:30
    应该是在调整时钟的函数中没有更新屏显,注意:是调整后数据的显示刷新。

    能不能提示一下怎么修改呢谢谢,因为最近一直在改这个
    ID:752974 发表于 2021-3-27 16:30
    应该是在调整时钟的函数中没有更新屏显,注意:是调整后数据的显示刷新。
    ID:207421 发表于 2021-3-27 16:00
    • #include <REG51.H>//代码有点乱,我也只能随意改改
    • #define uchar unsigned char
    • #define uint unsigned int
    • uint i,j,sec,sec1=0,sec2=0;
    • sbit k1=P3^1;//停止或启动定时器
    • sbit k2=P3^0;//小时
    • sbit k3=P3^2;//分
    • sbit k4=P3^3;//秒
    • sbit BZ=P1^5;//为了不让开发板的蜂鸣器响所以设置了一下,可以不用管BZ
    • uchar code table[]={0x3F,0x06,0x5B,0x4F,0x66,0x6d,0x7D,0x07,0x7F,0x6F};
    • void display();
    • void button();
    • void init();
    • void button_int();
    • unsigned char num = 0;
    • void delay(uint t)
    • {
    •         while(t--);
    • }
    • void main()
    • {
    •         P3=0x0f;//0000 1111
    •         init();
    •         while(1)
    •         {
    •                
    •                 display();
    •                 if(P3!=0x0f)
    •                 {
    •                         delay(1000);
    •                         if(P3!=0x0f)
    •                         {
    •                                 button_int();
    •                                 display();
    •                                 while(P3!=0x0f);
    •                         }
    •                 }
    •                 delay(100);
    •                 P0=0x00;
    •         }
    • }
    • //a=10,b=11,c=12,d=13,e=14,f=15
    • void button_int()
    • {
    •         if(P3==0x0d)//0000 1101 - P3^1 - K1
    •         {
    •                 num = 2;
    •                 TR0=~TR0;
    •         }
    •         if(TR0==0)
    •         {
    •                 if(P3==0x0e)//0000 1110  - P3^0 - K2 - num = 2 - set sec2
    •                 {
    •                         num = 2;
    •                         sec2++;
    •                         if(sec2==24)
    •                         {
    •                                 sec2=0;
    •                         }
    •                 }
    •                 if(P3==0x0b)//0000 1011  - P3^2 - K3 - num = 3 - set sec1
    •                 {
    •                         num = 3;
    •                         sec1++;
    •                         if(sec1==60)
    •                         {
    •                                 sec1=0;
    •                         }
    •                 }
    •                 if(P3==0x07)//0000 0111  - P3^3 - K4 - num = 4 - set sec
    •                 {
    •                         num = 4;
    •                         sec=0;
    •                 }
    •         }
    • }
    • void T0_time()interrupt 1
    • {
    •         TH0=0xfc;
    •         TL0=0x67;
    •         i++;
    •         if(i>=1000)
    •         {
    •                 i=0;
    •                 sec++;
    •                 if(sec==60)
    •                 {
    •                         sec=0;
    •                         sec1++;
    •                         if(sec1==60)
    •                         {
    •                                 sec1=0;
    •                                 sec2++;
    •                                 if(sec2==24)
    •                                 {
    •                                         sec2=0;
    •                                 }
    •                         }
    •                 }
    •         }
    • }
    • void init()
    • {
    •         BZ=0;
    •         TMOD=0x01;
    •         TH0=0xfc;
    •         TL0=0x67;
    •         ET0=1;
    •         EA=1;
    •         TR0=1;
    • }
    • void display()
    • {
    •         if(TR0==0)
    •         {
    •                 if(num==4)//P3^3 - K4 - num = 4 - set sec
    •                 {
    •                         P2=0x00;P0=table[sec%10];delay(500);
    •                         P2=0x04;P0=table[sec/10%10];
    •                 }
    •                 if(num==3)//P3^2 - K3 - num = 3 - set sec1
    •                 {
    •                         P2=0x0c;P0=table[sec1%10];delay(500);
    •                         P2=0x10;P0=table[sec1/10%10];
    •                 }
    •                 if(num==2)//P3^0 - K2 - num = 2 - set sec2
    •                 {
    •                         P2=0x18;P0=table[sec2%10];delay(500);
    •                         P2=0x1c;P0=table[sec2/10%10];
    •                 }
    •         }else{
    •                 num = 0;
    •                 switch(j)
    •                 {
    •                         case 0:P2=0x00;j++;P0=table[sec%10];break;
    •                         case 1:P2=0x04;j++;P0=table[sec/10%10];break;
    •                         case 2:P2=0x08;j++;P0=0x40;break;
    •                         case 3:P2=0x0c;j++;P0=table[sec1%10];break;
    •                         case 4:P2=0x10;j++;P0=table[sec1/10%10];break;
    •                         case 5:P2=0x14;j++;P0=0x40;break;
    •                         case 6:P2=0x18;j++;P0=table[sec2%10];break;
    •                         case 7:P2=0x1c;j=0;P0=table[sec2/10%10];break;
    •                         default:break;
    •                 }
    •         }
    • }




    评分

    参与人数 1黑币 +20 收起 理由
    admin + 20 回帖助人的奖励!

    查看全部评分

    ID:207421 发表于 2021-3-27 15:54
    1. 按键把定时器0都关闭了,数码管无法显示。
    2. 最好加一个定时器刷新数码管。
    代码太乱,我也只能随意改改了:
    • #include <REG51.H>
    • #define uchar unsigned char
    • #define uint unsigned int
    • uint i,j,sec,sec1=0,sec2=0;
    • sbit k1=P3^1;//停止或启动定时器
    • sbit k2=P3^0;//小时
    • sbit k3=P3^2;//分
    • sbit k4=P3^3;//秒
    • sbit BZ=P1^5;//为了不让开发板的蜂鸣器响所以设置了一下,可以不用管BZ
    • uchar code table[]={0x3F,0x06,0x5B,0x4F,0x66,0x6d,0x7D,0x07,0x7F,0x6F};
    • void display();
    • void button();
    • void init();
    • void button_int();
    • unsigned char num = 0;
    • void delay(uint t)
    • {
    •         while(t--);
    • }
    • void main()
    • {
    •         P3=0x0f;//0000 1111
    •         init();
    •         while(1)
    •         {
    •                
    •                 display();
    •                 if(P3!=0x0f)
    •                 {
    •                         delay(1000);
    •                         if(P3!=0x0f)
    •                         {
    •                                 button_int();
    •                                 display();
    •                                 while(P3!=0x0f);
    •                         }
    •                 }
    •                 delay(100);
    •                 P0=0x00;
    •         }
    • }
    • //a=10,b=11,c=12,d=13,e=14,f=15
    • void button_int()
    • {
    •         if(P3==0x0d)//0000 1101 - P3^1 - K1
    •         {
    •                 num = 2;
    •                 TR0=~TR0;
    •         }
    •         if(TR0==0)
    •         {
    •                 if(P3==0x0e)//0000 1110  - P3^0 - K2 - num = 2 - set sec2
    •                 {
    •                         num = 2;
    •                         sec2++;
    •                         if(sec2==24)
    •                         {
    •                                 sec2=0;
    •                         }
    •                 }
    •                 if(P3==0x0b)//0000 1011  - P3^2 - K3 - num = 3 - set sec1
    •                 {
    •                         num = 3;
    •                         sec1++;
    •                         if(sec1==60)
    •                         {
    •                                 sec1=0;
    •                         }
    •                 }
    •                 if(P3==0x07)//0000 0111  - P3^3 - K4 - num = 4 - set sec
    •                 {
    •                         num = 4;
    •                         sec=0;
    •                 }
    •         }
    • }
    • void T0_time()interrupt 1
    • {
    •         TH0=0xfc;
    •         TL0=0x67;
    •         i++;
    •         if(i>=1000)
    •         {
    •                 i=0;
    •                 sec++;
    •                 if(sec==60)
    •                 {
    •                         sec=0;
    •                         sec1++;
    •                         if(sec1==60)
    •                         {
    •                                 sec1=0;
    •                                 sec2++;
    •                                 if(sec2==24)
    •                                 {
    •                                         sec2=0;
    •                                 }
    •                         }
    •                 }
    •         }
    • }
    • void init()
    • {
    •         BZ=0;
    •         TMOD=0x01;
    •         TH0=0xfc;
    •         TL0=0x67;
    •         ET0=1;
    •         EA=1;
    •         TR0=1;
    • }
    • void display()
    • {
    •         if(TR0==0)
    •         {
    •                 if(num==4)//P3^3 - K4 - num = 4 - set sec
    •                 {
    •                         P2=0x00;P0=table[sec%10];delay(500);
    •                         P2=0x04;P0=table[sec/10%10];
    •                 }
    •                 if(num==3)//P3^2 - K3 - num = 3 - set sec1
    •                 {
    •                         P2=0x0c;P0=table[sec1%10];delay(500);
    •                         P2=0x10;P0=table[sec1/10%10];
    •                 }
    •                 if(num==2)//P3^0 - K2 - num = 2 - set sec2
    •                 {
    •                         P2=0x18;P0=table[sec2%10];delay(500);
    •                         P2=0x1c;P0=table[sec2/10%10];
    •                 }
    •         }else{
    •                 num = 0;
    •                 switch(j)
    •                 {
    •                         case 0:P2=0x00;j++;P0=table[sec%10];break;
    •                         case 1:P2=0x04;j++;P0=table[sec/10%10];break;
    •                         case 2:P2=0x08;j++;P0=0x40;break;
    •                         case 3:P2=0x0c;j++;P0=table[sec1%10];break;
    •                         case 4:P2=0x10;j++;P0=table[sec1/10%10];break;
    •                         case 5:P2=0x14;j++;P0=0x40;break;
    •                         case 6:P2=0x18;j++;P0=table[sec2%10];break;
    •                         case 7:P2=0x1c;j=0;P0=table[sec2/10%10];break;
    •                         default:break;
    •                 }
    •         }
    • }



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

    Powered by 单片机教程网

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