找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3398|回復(fù): 10
收起左側(cè)

自制了一個(gè)用數(shù)碼管顯示的單片機(jī)時(shí)鐘,有點(diǎn)小問題,希望解答

[復(fù)制鏈接]
ID:876099 發(fā)表于 2021-3-27 11:54 | 顯示全部樓層 |閱讀模式
各位大神好,本人做了一個(gè)數(shù)碼管顯示的時(shí)鐘,但是現(xiàn)在有點(diǎn)小問題最后有仿真圖,下面一張圖片顯示效果,下面有仿真圖,protues8.6版本的,和開發(fā)板上的電路圖是一樣的

預(yù)實(shí)現(xiàn)功能:
時(shí)鐘24小時(shí)顯示,按下K1,時(shí)鐘會暫停,在時(shí)鐘暫停的情況下,按下K2,可以調(diào)整小時(shí),按下K3,可以調(diào)整分鐘,按下K4,秒鐘直接清零。


現(xiàn)實(shí)現(xiàn)效果:按下k1后只能顯示一個(gè)數(shù)碼管當(dāng)先狀況(大概意思就是只能顯示一個(gè)數(shù)碼管的當(dāng)先狀況,其他的數(shù)碼管全是熄滅狀態(tài)),其他的按鍵均可以實(shí)現(xiàn)功能,但是看不到時(shí)鐘,分鐘加的過程,也看不到秒針清零的過程,但是可以實(shí)現(xiàn)調(diào)整時(shí)分秒的功能
不知道我的描述是否有哪里不清楚,希望各位大神能幫我解答
IMG_20210327_112146.jpg

電路圖.zip (34.7 KB, 下載次數(shù): 6)


下面是單片機(jī)程序:
  1. #include <REGX51.H>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. uint i,j,sec,sec1=0,sec2=0;
  5. sbit k1=P3^1;
  6. sbit k2=P3^0;
  7. sbit k3=P3^2;
  8. sbit k4=P3^3;
  9. sbit BZ=P1^5;//為了不讓開發(fā)板的蜂鳴器響所以設(shè)置了一下,可以不用管BZ
  10. uchar code table[]={0x3F,0x06,0x5B,0x4F,0x66,
  11.                     0x6d,0x7D,0x07,0x7F,0x6F,};
  12. void display();
  13. void button();
  14. void init();
  15. void button_int();
  16. void delay(uint t)
  17. {
  18. while(t--);
  19. }
  20. void main()
  21. {
  22. P3=0x0f;
  23. init();

  24. }
  25. void button()
  26. {
  27. while(1)
  28. {
  29. if(P3!=0x0f)
  30. {
  31.   delay(10000);
  32.   if(P3!=0x0f)
  33.   {
  34.    button_int();
  35.    while(P3!=0x0f);
  36.   }
  37.   }
  38. }
  39. }

  40. void button_int()
  41. {
  42. if(P3==0x0d)
  43. {TR0=~TR0;}
  44. if(TR0==0)
  45. {
  46. if(P3==0x0e)
  47. {sec2++;
  48.   if(sec2==24)
  49.   {sec2=0;}}
  50. if(P3==0x0b)
  51. {sec1++;
  52.   if(sec1==60)
  53.   {sec1=0;}}
  54. if(P3==0x07)
  55. {sec=0;}
  56. }
  57. }

  58. void T0_time()interrupt 1
  59. {
  60. TH0=0xfc;
  61. TL0=0x67;
  62. i++;
  63. if(i>=1000)
  64. {
  65.   i=0;
  66.   sec++;
  67.   if(sec==60)
  68.   {
  69.    sec=0;
  70.    sec1++;
  71.    if(sec1==60)
  72.    {
  73.            sec1=0;
  74.         sec2++;
  75.         if(sec2==24)
  76.         {
  77.          sec2=0;
  78.         }
  79.    }
  80.   }
  81. }
  82.   P0=0x00;
  83.   display();
  84. }

  85. void init()
  86. {
  87. BZ=0;
  88. TMOD=0X01;
  89. TH0=0xfc;
  90. TL0=0x67;
  91. ET0=1;
  92. EA=1;
  93. TR0=1;
  94. button();
  95. while(1);
  96. }
  97. void display()
  98. {
  99.    switch(j)
  100.   {
  101.    case 0:P2=0x00;j++;P0=table[sec%10];break;
  102.    case 1:P2=0x04;j++;P0=table[sec/10%10];break;
  103.    case 2:P2=0x08;j++;P0=0x40;break;
  104.    case 3:P2=0x0c;j++;P0=table[sec1%10];break;
  105.    case 4:P2=0x10;j++;P0=table[sec1/10%10];break;
  106.    case 5:P2=0x14;j++;P0=0x40;break;
  107.    case 6:P2=0x18;j++;P0=table[sec2%10];break;
  108.    case 7:P2=0x1c;j=0;P0=table[sec2/10%10];break;
  109.    default:break;
  110.   }
復(fù)制代碼


回復(fù)

使用道具 舉報(bào)

ID:207421 發(fā)表于 2021-3-27 15:54 | 顯示全部樓層
1. 按鍵把定時(shí)器0都關(guān)閉了,數(shù)碼管無法顯示。
2. 最好加一個(gè)定時(shí)器刷新數(shù)碼管。
代碼太亂,我也只能隨意改改了:
  • #include <REG51.H>
  • #define uchar unsigned char
  • #define uint unsigned int
  • uint i,j,sec,sec1=0,sec2=0;
  • sbit k1=P3^1;//停止或啟動定時(shí)器
  • sbit k2=P3^0;//小時(shí)
  • sbit k3=P3^2;//分
  • sbit k4=P3^3;//秒
  • sbit BZ=P1^5;//為了不讓開發(fā)板的蜂鳴器響所以設(shè)置了一下,可以不用管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;
  •                 }
  •         }
  • }



回復(fù)

使用道具 舉報(bào)

ID:207421 發(fā)表于 2021-3-27 16:00 | 顯示全部樓層
  • #include <REG51.H>//代碼有點(diǎn)亂,我也只能隨意改改
  • #define uchar unsigned char
  • #define uint unsigned int
  • uint i,j,sec,sec1=0,sec2=0;
  • sbit k1=P3^1;//停止或啟動定時(shí)器
  • sbit k2=P3^0;//小時(shí)
  • sbit k3=P3^2;//分
  • sbit k4=P3^3;//秒
  • sbit BZ=P1^5;//為了不讓開發(fā)板的蜂鳴器響所以設(shè)置了一下,可以不用管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;
  •                 }
  •         }
  • }




評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復(fù)

使用道具 舉報(bào)

ID:752974 發(fā)表于 2021-3-27 16:30 | 顯示全部樓層
應(yīng)該是在調(diào)整時(shí)鐘的函數(shù)中沒有更新屏顯,注意:是調(diào)整后數(shù)據(jù)的顯示刷新。
回復(fù)

使用道具 舉報(bào)

ID:876099 發(fā)表于 2021-3-27 16:41 | 顯示全部樓層
munuc_w 發(fā)表于 2021-3-27 16:30
應(yīng)該是在調(diào)整時(shí)鐘的函數(shù)中沒有更新屏顯,注意:是調(diào)整后數(shù)據(jù)的顯示刷新。

能不能提示一下怎么修改呢謝謝,因?yàn)樽罱恢痹诟倪@個(gè)
回復(fù)

使用道具 舉報(bào)

ID:876099 發(fā)表于 2021-3-27 16:49 | 顯示全部樓層
lwh999995 發(fā)表于 2021-3-27 16:00
  • #include //代碼有點(diǎn)亂,我也只能隨意改改
  • #define uchar unsigned char
  • #define uint unsign ...

  • 其實(shí)可以直接說一下怎么改程序的
    回復(fù)

    使用道具 舉報(bào)

    ID:332444 發(fā)表于 2021-3-27 16:50 | 顯示全部樓層
    回復(fù)

    使用道具 舉報(bào)

    ID:213173 發(fā)表于 2021-3-27 17:36 | 顯示全部樓層
    這個(gè)示例可能對你有所幫助
    數(shù)碼管時(shí)鐘長短按調(diào)整點(diǎn)閃爍 鬧鐘38譯碼器 仿真.zip (126.38 KB, 下載次數(shù): 9)

    回復(fù)

    使用道具 舉報(bào)

    ID:89515 發(fā)表于 2021-3-28 07:42 來自手機(jī) | 顯示全部樓層
    就是顯示沒有得到試試刷新嘛!你想一下怎么解決按下按鍵,立刻刷新程序的問題就行了。
    回復(fù)

    使用道具 舉報(bào)

    ID:89515 發(fā)表于 2021-3-28 08:26 來自手機(jī) | 顯示全部樓層
    mengzhixinheng 發(fā)表于 2021-3-28 07:42
    就是顯示沒有得到試試刷新嘛!你想一下怎么解決按下按鍵,立刻刷新程序的問題就行了。

    剛才沒看程序,根據(jù)你的描述做出了判斷,F(xiàn)在看了一下發(fā)現(xiàn)你的程序根本無法實(shí)現(xiàn)按鍵功能。程序處于等待狀態(tài),如果不是因?yàn)轱@示函數(shù)放在中斷中,顯示功能都無法實(shí)現(xiàn),太糟糕了。我不知道你為何等待,如果你非要這樣寫,那就把按鍵函數(shù)也放在中斷中,這樣至少可以達(dá)到你想要的目的,雖然這樣并不好!!
    回復(fù)

    使用道具 舉報(bào)

    ID:89515 發(fā)表于 2021-3-28 08:51 來自手機(jī) | 顯示全部樓層
    mengzhixinheng 發(fā)表于 2021-3-28 08:26
    剛才沒看程序,根據(jù)你的描述做出了判斷,F(xiàn)在看了一下發(fā)現(xiàn)你的程序根本無法實(shí)現(xiàn)按鍵功能。程序處于等待狀 ...

    抱歉,沒想到你把按鍵程序獨(dú)立寫成了一個(gè)循環(huán)函數(shù)。那么按鍵功能自然可以實(shí)現(xiàn)了,既然顯示程序用了中斷延時(shí),就把按鍵程序也用中斷延時(shí)就可以解決你的問題了。
    回復(fù)

    使用道具 舉報(bào)

    您需要登錄后才可以回帖 登錄 | 立即注冊

    本版積分規(guī)則

    手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

    Powered by 單片機(jī)教程網(wǎng)

    快速回復(fù) 返回頂部 返回列表