找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

關(guān)于51單片機的定時/計數(shù)器的疑惑,大佬們解決下菜鳥的疑惑

[復(fù)制鏈接]
ID:653298 發(fā)表于 2020-7-22 10:41 | 顯示全部樓層 |閱讀模式
就是下面的程序,我感覺是我不按k1,定時器應(yīng)該也工作吧。這樣的話通電后在隔一段時間再按k1,不是應(yīng)該s不為0嗎?
為什么隔了一段時間這個s還是。

單片機源程序如下:
  1. /*****定時器0與外部中斷1制作計時器:夠60秒則進為分,夠60分則進位時*****/
  2. /*當按下k1鍵計時器開始工作,當按下k4鍵,定時器停止,再按一次k4,繼續(xù)定省
  3. 當按下k3,定時器歸0;再次按下k4,定時器開始定時。*/
  4. #include"reg52.h"
  5. typedef unsigned int u16;
  6. typedef unsigned char u8;
  7. sbit key1=P3^3;
  8. sbit key2=P3^1;
  9. sbit key0=P3^2;
  10. u16 s=0;u16 m=0;u16 h=0;
  11. u16 i,c;
  12. u16 code weixuan[8]={0xe3,0xe7,0xeb,0xef,0xf3,0xf7,0xfb,0xff};//位選數(shù)組:數(shù)碼管第一個到最后一個
  13. u16 code smgduan[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};//顯示0—9最后有一個顯示-
  14.                      //0  ,  1  , 2,  3,   4,    5,   6,   7,   8,   9,   —
  15. void delay_ms(u16 j)
  16. {
  17.         while(j--)
  18.         {
  19.                 u16 b;
  20.                 for(b=0;b<125;b++);
  21.         }
  22. }
  23. void time1()
  24. {
  25.         TMOD|=0x10;
  26.         TH1=0xFC; //給定時器賦初值定時1ms
  27.         TL1=0x18;
  28.         ET1=1;
  29.         TR1=1;
  30.         EA=1;
  31. }
  32. void zhongduan1()
  33. {
  34.         IT1=1;
  35.   EX1=1;
  36.   EA=1;
  37. }
  38. void zhongduan0()
  39. {
  40.         IT0=1;
  41.   EX0=1;
  42.   EA=1;
  43. }
  44. void shuma()
  45. {
  46.         u16 a;
  47.         for(a=1;a<9;a++)
  48.         {
  49.                 switch(a)
  50.                 {
  51.                         case(1):P2=weixuan[0];P0=smgduan[s%10];break;
  52.                         case(2):P2=weixuan[1];P0=smgduan[s/10];break;
  53.                         case(3):P2=weixuan[2];P0=smgduan[10];break;
  54.                         case(4):P2=weixuan[3];P0=smgduan[m%10];break;
  55.                         case(5):P2=weixuan[4];P0=smgduan[m/10];break;
  56.                         case(6):P2=weixuan[5];P0=smgduan[10];break;
  57.                         case(7):P2=weixuan[6];P0=smgduan[h%10];break;
  58.                         case(8):P2=weixuan[7];P0=smgduan[h/10];break;
  59.                 }
  60.                 delay_ms(1);
  61.                 P0=0x00;
  62.         }
  63. }
  64. void main()
  65. {
  66.         time1();
  67.         zhongduan1();
  68.         zhongduan0();
  69.         if(key2==0)delay_ms(6);//按下k1,主函數(shù)中的數(shù)碼管函數(shù)開始執(zhí)行,定時器開始工作
  70.         {
  71.                 if(key2==0)
  72.                 {
  73.                         while(1)
  74.                         {
  75.                                 shuma();
  76.                         }
  77.                 }
  78.           while(!key2);
  79. }
  80. }
  81.         
  82. void waibu0()interrupt 0//外部中斷函數(shù)0,按下k3,s,m,h都歸0;
  83. {
  84.         if(key0==0)
  85.         {
  86.                 delay_ms(6);
  87.                 if(key0==0)
  88.                 {
  89.                         s=0;m=0;h=0;
  90.                 }
  91.         }while(!key1);
  92. }
  93. void waibu()interrupt 2//外部中斷函數(shù),按下k4,定時器停止工作,再次按下k4繼續(xù)工作
  94. {
  95.         if(key1==0)
  96.         {
  97.                 delay_ms(6);
  98.                 if(key1==0)
  99.                 {
  100.                         TR1=~TR1;
  101.                 }
  102.         }while(!key1);
  103. }
  104. void time1_()interrupt 3//定時器中斷函數(shù)每一秒s加1,夠60s則s變?yōu)?,m加1;
  105. {
  106.         TH1=0xFC; //給定時器再次賦初值
  107.         TL1=0x18;
  108.         i++;
  109.         if(i==1000)
  110.         {
  111.                 i=0;
  112.                 s++;
  113.                 if(s==60){m++;s=0;}
  114.                 if(m==60){h++;m=0;}
  115.         }
  116. }

復(fù)制代碼


回復(fù)

使用道具 舉報

ID:451718 發(fā)表于 2020-7-22 16:07 | 顯示全部樓層
k3 和 key0 是什么關(guān)系?  k4 和 key1 是什么關(guān)系?  k2和key0 又是什么關(guān)系?  感覺你這個程序,硬件和定義的端口好混亂啊。 外部中斷觸發(fā)以后,如何回現(xiàn)場?  你這個框架,怎么感覺一直在中斷里面跑?  程序早就跑飛了吧
回復(fù)

使用道具 舉報

ID:332444 發(fā)表于 2020-7-22 16:13 | 顯示全部樓層
主函數(shù),控制顯示代碼邏輯問題。
回復(fù)

使用道具 舉報

ID:332444 發(fā)表于 2020-7-22 16:15 | 顯示全部樓層
本帖最后由 xianfajushi 于 2020-7-22 16:20 編輯

糾正一下:
  1. void main()
  2. {
  3.         time1();
  4.         zhongduan1();
  5.         zhongduan0();
  6.         if(key2==0)
  7.         {
  8. delay_ms(6);//按下k1,主函數(shù)中的數(shù)碼管函數(shù)開始執(zhí)行,定時器開始工作
  9.                 if(key2==0)
  10.                 {
  11.                         while(1)
  12.                         {
  13.                                 shuma();
  14.                         }
  15.                 }
  16.           while(!key2);
  17. }
  18. }
復(fù)制代碼

這樣的代碼邏輯只有按住這個按鍵,釋放按鍵,再按住按鍵,再釋放按鍵,才能實現(xiàn)動態(tài)顯示。
回復(fù)

使用道具 舉報

ID:332444 發(fā)表于 2020-7-22 16:22 | 顯示全部樓層
也就是key2按一下顯示更新一下。
回復(fù)

使用道具 舉報

ID:653298 發(fā)表于 2020-7-22 16:31 | 顯示全部樓層
robinsonlin 發(fā)表于 2020-7-22 16:07
k3 和 key0 是什么關(guān)系?  k4 和 key1 是什么關(guān)系?  k2和key0 又是什么關(guān)系?  感覺你這個程序,硬件和定 ...

他不應(yīng)該是外部中斷1打斷定時/計數(shù)器1,然后外部中斷0打斷外部中斷1,外部中斷0完了就返回外部中斷1,然后外部中斷0完了,推出去?
回復(fù)

使用道具 舉報

ID:653298 發(fā)表于 2020-7-22 16:34 | 顯示全部樓層
xianfajushi 發(fā)表于 2020-7-22 16:22
也就是key2按一下顯示更新一下。

你說的這個改了,謝謝
回復(fù)

使用道具 舉報

ID:451718 發(fā)表于 2020-7-22 17:26 | 顯示全部樓層
fengbaobaohaha 發(fā)表于 2020-7-22 16:31
他不應(yīng)該是外部中斷1打斷定時/計數(shù)器1,然后外部中斷0打斷外部中斷1,外部中斷0完了就返回外部中斷1,然 ...

你這樣做,架構(gòu)是不科學的,以后想擴展都沒有辦法。 理論上是可以實現(xiàn)你想要的功能,但是,實際電路中如果有干擾,跑飛的幾率是非常高的,可靠性很低。 而且,程序讀起來很燒腦。  你今天做的邏輯架構(gòu),過段時間再看的時候,又要去讀半天才理解。
回復(fù)

使用道具 舉報

ID:653298 發(fā)表于 2020-7-22 18:34 | 顯示全部樓層
robinsonlin 發(fā)表于 2020-7-22 17:26
你這樣做,架構(gòu)是不科學的,以后想擴展都沒有辦法。 理論上是可以實現(xiàn)你想要的功能,但是,實際電路中如 ...

原來如此,謝謝大佬
回復(fù)

使用道具 舉報

ID:797247 發(fā)表于 2020-7-23 20:15 | 顯示全部樓層
邏輯不太對
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

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