找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2101|回復(fù): 5
打印 上一主題 下一主題
收起左側(cè)

小白求問!單片機(jī)電子時(shí)鐘程序沒有循環(huán),經(jīng)過第一次按鍵之后按鍵就失靈了

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:560108 發(fā)表于 2019-6-13 19:51 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
實(shí)現(xiàn)該代碼之后發(fā)現(xiàn)沒有循環(huán),經(jīng)過第一次按鍵之后按鍵就失靈了

單片機(jī)源程序如下:
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #include<absacc.h>
  4. sbitkgnxz=P3^5; //功能選擇鍵,按一次設(shè)定時(shí)間,按兩次設(shè)定鬧鐘時(shí)間,按三次又顯示時(shí)間表  
  5. sbit kmin=P3^6;//調(diào)整分
  6. sbitkhour=P3^7;//調(diào)整時(shí)
  7. sbit bear=P1^0;//蜂鳴器控制口
  8. unsigned charsecshi=0,secge=0,minshi=0,minge=0,hourshi=0,hourge=0,flag=0,//flag是按鍵的計(jì)數(shù)
  9.               secshi1=0,secge1=0,minshi1=0,minge1=0,hourshi1=0,hourge1=0;//定義存儲(chǔ)時(shí)間和鬧鐘時(shí)分秒的個(gè)位和十位
  10. unsigned intnum=0,sec=0,min=0,hour=0,sec1=30,min1=0,hour1=1, num1=0;//定義時(shí)間和鬧鐘的時(shí)分秒
  11. unsigned char codetable[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//數(shù)碼管段控口
  12. voidkeyscan();//鍵盤掃描函數(shù)
  13. voiddisplay();//時(shí)鐘顯示函數(shù)
  14. voiddisplay1();//鬧鐘顯示函數(shù)
  15. voidclock();//鬧鐘函數(shù)即蜂鳴器函數(shù)
  16. /***延時(shí)函數(shù)****/
  17. void delay(unsigned char z)
  18. {unsigned char x,y;
  19. for(x=z;x>0;x--)
  20.   for(y=255;y>0;y--);
  21. }
  22. /***中斷函數(shù)****/
  23. void time0() interrupt 1
  24. {num++;
  25. TH0=(65536-50000)/256;
  26. TL0=(65536-50000)%256;
  27. if(num==20)
  28.   {num=0;
  29.    sec++;
  30.    if(sec==60)
  31.     {sec=0;
  32.      min++;
  33.      if(min==60)
  34.        {min=0;
  35.         hour++;
  36.         if(hour==24)
  37.           {hour=0;
  38.            }
  39.         }
  40.      }
  41. display(); }
  42. }
  43. /******時(shí)鐘顯示函數(shù)******/
  44. void display()
  45. {
  46. secge=sec%10;
  47. secshi=sec/10;
  48. minge=min%10;
  49. minshi=min/10;
  50. hourge=hour%10;
  51. hourshi=hour/10;
  52. P2=0xfe;
  53. P0=table[secge];
  54. delay(5);
  55. P2=0xfd;
  56. P0=table[secshi];
  57. delay(5);
  58. P2=0xfb;
  59. P0=0x40;
  60. delay(5);
  61. P2=0xf7;
  62. P0=table[minge];
  63. delay(5);
  64. P2=0xef;
  65. P0=table[minshi];
  66. delay(5);
  67. P2=0xdf;
  68. P0=0x40;
  69. delay(5);
  70. P2=0xbf;
  71. P0=table[hourge];
  72. delay(5);
  73. P2=0x7f;
  74. P0=table[hourshi];
  75. delay(5);
  76. }
  77. /*****鬧鐘顯示函數(shù)****/
  78. void display1()
  79. {
  80. secge1=sec1%10;
  81. secshi1=sec1/10;
  82. minge1=min1%10;
  83. minshi1=min1/10;
  84. hourge1=hour1%10;
  85. hourshi1=hour1/10;
  86. P2=0xfe;
  87. P0=table[secge1];
  88. delay(10);
  89. P2=0xfd;
  90. P0=table[secshi1];
  91. delay(15);
  92. P2=0xfb;
  93. P0=0x40;
  94. delay(15);
  95. P2=0xf7;
  96. P0=table[minge1];
  97. delay(15);
  98. P2=0xef;
  99. P0=table[minshi1];
  100. delay(15);
  101. P2=0xdf;
  102. P0=0x40;
  103. delay(15);
  104. P2=0xbf;
  105. P0=table[hourge1];
  106. delay(15);
  107. P2=0x7f;
  108. P0=table[hourshi1];
  109. delay(15);
  110. }
  111. /*****鍵盤掃描*********/
  112. void keyscan()
  113. {if(kgnxz==0)     //功能選擇鍵是否按下
  114.    {  delay(10);//延時(shí)消抖            
  115.          if(kgnxz==0)//再次判斷鍵是否按下           
  116.            {flag++;}       //計(jì)數(shù),功能選擇鍵按鍵次數(shù)加一      
  117.            while(!kgnxz);} //釋放鍵  
  118.   if(flag==1)//功能選擇鍵
  119.    {
  120. if(kmin==0)
  121.    {delay(10);
  122.     if(kmin==0)
  123.       {min++;
  124.        if(min>=60)
  125.        min=0;
  126.        }
  127. while(kmin==0)
  128. display();
  129.     }
  130. if(khour==0)
  131.    {delay(10);
  132.     if(khour==0)
  133.       {hour++;
  134.        if(hour==24)
  135.        hour=0;
  136.        }
  137. while(khour==0)
  138. display();
  139.   }
  140. }
  141. if(flag==2)//鬧鐘調(diào)整

  142.            if(kmin==0)
  143.         {delay(5);
  144.           if(kmin==0)
  145.             {min1++;
  146.             if(min1==60)
  147.                min1=0;}
  148.           while(!kmin)
  149.                      {display1();}
  150.                    }
  151.       if(khour==0)
  152.         {delay(5);
  153.            if(khour==0)
  154.             {hour1++;
  155.            if(hour1==24)
  156.               hour1=0;}
  157.             while(!khour)
  158.             {display1();}

  159.                            } }
  160. /*****蜂鳴器*********/
  161. void clock()
  162.   {    unsigned int i;
  163.       for(i=1000;i>0;i--)
  164.        {bear=1;
  165.                   P1=0xfe;
  166.                   delay(10);
  167.                   bear=0;
  168.                   P1=0xff;
  169.                   delay(10);}}
  170. /*****主函數(shù)*********/
  171. main()
  172. {TMOD=0x01;
  173. TH0=(65536-50000)/256;
  174. TL0=(65536-50000)%256;
  175. EA=1;ET0=1;TR0=1;
  176. while(1)
  177. {      
  178. keyscan();display();
  179. if(flag==1) {keyscan(); display();}
  180. if(flag==2) {keyscan(); display1();}
  181. if(flag==3) {display();}
  182. if((hour==hour1)&&(min==min1)&&(sec==sec1))
  183.   {clock();}//鬧鐘設(shè)定時(shí)間與時(shí)鐘時(shí)間相等,調(diào)用蜂鳴器函數(shù)
  184. }
  185. }
復(fù)制代碼



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

使用道具 舉報(bào)

來自 5#
ID:517466 發(fā)表于 2019-6-15 00:17 | 只看該作者
你的顯示處理是有問題的。問題點(diǎn)在于顯示完一個(gè)數(shù)碼管之后,筆段數(shù)據(jù)保持原狀,點(diǎn)亮下一位數(shù)碼管,結(jié)果數(shù)據(jù)會(huì)被串過去顯示,雖然時(shí)間很短。在下一個(gè)數(shù)碼管點(diǎn)亮之前,P0輸出的筆段全部熄滅。然后點(diǎn)亮下一個(gè)數(shù)碼管,輸出筆段數(shù)據(jù)。另外在調(diào)整定是時(shí)間過程中,由于中斷中調(diào)用display()的原因,也會(huì)導(dǎo)致顯示混亂。所以中斷處理中要么去除顯示調(diào)用,要么根據(jù)flag有區(qū)別地調(diào)用display()或者display1().后面附上我做的修改,含proteus仿真文件和51的keil c工程.程序里使用的共陰數(shù)碼管,所有數(shù)據(jù)做了和0xFF的異或后輸出。

時(shí)鐘.zip

71.35 KB, 下載次數(shù): 11

回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:123289 發(fā)表于 2019-6-14 08:46 | 只看該作者
畫出框圖
回復(fù)

使用道具 舉報(bào)

板凳
ID:332444 發(fā)表于 2019-6-14 11:36 | 只看該作者
設(shè)一個(gè)變量置于中斷中當(dāng)調(diào)整按鈕按下則標(biāo)記并開始計(jì)時(shí)規(guī)定在一定時(shí)間范圍后復(fù)原調(diào)整計(jì)數(shù)
回復(fù)

使用道具 舉報(bào)

地板
ID:332444 發(fā)表于 2019-6-14 11:39 | 只看該作者
或另給一個(gè)按鈕用于控制開始調(diào)整和結(jié)束調(diào)整
回復(fù)

使用道具 舉報(bào)

6#
ID:560108 發(fā)表于 2019-6-18 17:42 | 只看該作者
suncat0504 發(fā)表于 2019-6-15 00:17
你的顯示處理是有問題的。問題點(diǎn)在于顯示完一個(gè)數(shù)碼管之后,筆段數(shù)據(jù)保持原狀,點(diǎn)亮下一位數(shù)碼管,結(jié)果數(shù)據(jù) ...

你好,謝謝你的代碼,我已經(jīng)拿去試驗(yàn)了,但是發(fā)現(xiàn)你的代碼會(huì)造成數(shù)碼管顯示不了
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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