找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2845|回复: 10
收起左侧

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

[复制链接]
ID:876099 发表于 2021-3-27 11:54 | 显示全部楼层 |阅读模式
各位大神好,本人做了一个数码管显示的时钟,但是现在有点小问题最后有仿真图,下面一张图片显示效果,下面有仿真图,protues8.6版本的,和开发板上的电路图是一样的

预实现功能:
时钟24小时显示,按下K1,时钟会暂停,在时钟暂停的情况下,按下K2,可以调整小时,按下K3,可以调整分钟,按下K4,秒钟直接清零。


现实现效果:按下k1后只能显示一个数码管当先状况(大概意思就是只能显示一个数码管的当先状况,其他的数码管全是熄灭状态),其他的按键均可以实现功能,但是看不到时钟,分钟加的过程,也看不到秒针清零的过程,但是可以实现调整时分秒的功能
不知道我的描述是否有哪里不清楚,希望各位大神能帮我解答
IMG_20210327_112146.jpg

电路图.zip (34.7 KB, 下载次数: 6)
回复

使用道具 举报

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;
  •                 }
  •         }
  • }



回复

使用道具 举报

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:752974 发表于 2021-3-27 16:30 | 显示全部楼层
应该是在调整时钟的函数中没有更新屏显,注意:是调整后数据的显示刷新。
回复

使用道具 举报

ID:876099 发表于 2021-3-27 16:41 | 显示全部楼层
munuc_w 发表于 2021-3-27 16:30
应该是在调整时钟的函数中没有更新屏显,注意:是调整后数据的显示刷新。

能不能提示一下怎么修改呢谢谢,因为最近一直在改这个
回复

使用道具 举报

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

  • 其实可以直接说一下怎么改程序的
    回复

    使用道具 举报

    ID:332444 发表于 2021-3-27 16:50 | 显示全部楼层
    回复

    使用道具 举报

    ID:213173 发表于 2021-3-27 17:36 | 显示全部楼层
    这个示例可能对你有所帮助
    数码管时钟长短按调整点闪烁 闹钟38译码器 仿真.zip (126.38 KB, 下载次数: 9)
    回复

    使用道具 举报

    ID:89515 发表于 2021-3-28 07:42 来自手机 | 显示全部楼层
    就是显示没有得到试试刷新嘛!你想一下怎么解决按下按键,立刻刷新程序的问题就行了。
    回复

    使用道具 举报

    ID:89515 发表于 2021-3-28 08:26 来自手机 | 显示全部楼层
    mengzhixinheng 发表于 2021-3-28 07:42
    就是显示没有得到试试刷新嘛!你想一下怎么解决按下按键,立刻刷新程序的问题就行了。

    刚才没看程序,根据你的描述做出了判断。现在看了一下发现你的程序根本无法实现按键功能。程序处于等待状态,如果不是因为显示函数放在中断中,显示功能都无法实现,太糟糕了。我不知道你为何等待,如果你非要这样写,那就把按键函数也放在中断中,这样至少可以达到你想要的目的,虽然这样并不好!!!
    回复

    使用道具 举报

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

    抱歉,没想到你把按键程序独立写成了一个循环函数。那么按键功能自然可以实现了,既然显示程序用了中断延时,就把按键程序也用中断延时就可以解决你的问题了。
    回复

    使用道具 举报

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

    本版积分规则

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

    Powered by 单片机教程网

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