久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3574|回復: 10
打印 上一主題 下一主題
收起左側

自制了一個用數碼管顯示的單片機時鐘,有點小問題,希望解答

[復制鏈接]
跳轉到指定樓層
樓主
各位大神好,本人做了一個數碼管顯示的時鐘,但是現在有點小問題最后有仿真圖,下面一張圖片顯示效果,下面有仿真圖,protues8.6版本的,和開發板上的電路圖是一樣的

預實現功能:
時鐘24小時顯示,按下K1,時鐘會暫停,在時鐘暫停的情況下,按下K2,可以調整小時,按下K3,可以調整分鐘,按下K4,秒鐘直接清零。


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


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


下面是單片機程序:
  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;//為了不讓開發板的蜂鳴器響所以設置了一下,可以不用管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.   }
復制代碼


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
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 | 只看該作者
應該是在調整時鐘的函數中沒有更新屏顯,注意:是調整后數據的顯示刷新。
回復

使用道具 舉報

5#
ID:876099 發表于 2021-3-27 16:41 | 只看該作者
munuc_w 發表于 2021-3-27 16:30
應該是在調整時鐘的函數中沒有更新屏顯,注意:是調整后數據的顯示刷新。

能不能提示一下怎么修改呢謝謝,因為最近一直在改這個
回復

使用道具 舉報

6#
ID:876099 發表于 2021-3-27 16:49 | 只看該作者
lwh999995 發表于 2021-3-27 16:00
  • #include //代碼有點亂,我也只能隨意改改
  • #define uchar unsigned char
  • #define uint unsign ...

  • 其實可以直接說一下怎么改程序的
    回復

    使用道具 舉報

    7#
    ID:332444 發表于 2021-3-27 16:50 | 只看該作者
    回復

    使用道具 舉報

    8#
    ID:213173 發表于 2021-3-27 17:36 | 只看該作者
    這個示例可能對你有所幫助
    數碼管時鐘長短按調整點閃爍 鬧鐘38譯碼器 仿真.zip (126.38 KB, 下載次數: 9)

    回復

    使用道具 舉報

    9#
    ID:89515 發表于 2021-3-28 07:42 來自觸屏版 | 只看該作者
    就是顯示沒有得到試試刷新嘛!你想一下怎么解決按下按鍵,立刻刷新程序的問題就行了。
    回復

    使用道具 舉報

    10#
    ID:89515 發表于 2021-3-28 08:26 來自觸屏版 | 只看該作者
    mengzhixinheng 發表于 2021-3-28 07:42
    就是顯示沒有得到試試刷新嘛!你想一下怎么解決按下按鍵,立刻刷新程序的問題就行了。

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

    使用道具 舉報

    11#
    ID:89515 發表于 2021-3-28 08:51 來自觸屏版 | 只看該作者
    mengzhixinheng 發表于 2021-3-28 08:26
    剛才沒看程序,根據你的描述做出了判斷。現在看了一下發現你的程序根本無法實現按鍵功能。程序處于等待狀 ...

    抱歉,沒想到你把按鍵程序獨立寫成了一個循環函數。那么按鍵功能自然可以實現了,既然顯示程序用了中斷延時,就把按鍵程序也用中斷延時就可以解決你的問題了。
    回復

    使用道具 舉報

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

    本版積分規則

    小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

    Powered by 單片機教程網

    快速回復 返回頂部 返回列表
    主站蜘蛛池模板: 国产成人精品一区二区三 | 天天干天天爽 | 99久久免费观看 | 日干夜操 | 午夜国产一级片 | 欧美精品一区二区三区四区 在线 | 欧美日韩成人 | 97在线观看 | 97色在线视频 | 狠狠色综合欧美激情 | 免费毛片网站 | 91亚洲精选 | 精品视频久久久 | 玖玖视频网 | 亚洲精品在线免费看 | 2019天天操 | 欧美一级免费看 | 国产免费又黄又爽又刺激蜜月al | 久久尤物免费一区二区三区 | 亚洲福利网 | 日韩在线视频一区二区三区 | 欧美成人精品一区二区三区 | 亚洲永久字幕 | 干干干日日日 | 日日噜噜噜夜夜爽爽狠狠视频97 | 精品欧美乱码久久久久久 | 日本 欧美 国产 | 黑人巨大精品 | 成人在线电影在线观看 | 男人的天堂亚洲 | 日本成人在线免费视频 | 日韩av在线一区二区三区 | 亚洲国产精品99久久久久久久久 | 免费看黄色国产 | 国产在线视频一区二区董小宛性色 | 在线观看国产视频 | 丁香综合 | 中文字幕亚洲免费 | 久久精品这里 | 亚洲精品日韩在线 | 一级女毛片 |