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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2249|回復: 9
收起左側

關于51單片機的定時/計數器的疑惑,大佬們解決下菜鳥的疑惑

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

單片機源程序如下:
  1. /*****定時器0與外部中斷1制作計時器:夠60秒則進為分,夠60分則進位時*****/
  2. /*當按下k1鍵計時器開始工作,當按下k4鍵,定時器停止,再按一次k4,繼續定省
  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};//位選數組:數碼管第一個到最后一個
  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,主函數中的數碼管函數開始執行,定時器開始工作
  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//外部中斷函數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//外部中斷函數,按下k4,定時器停止工作,再次按下k4繼續工作
  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//定時器中斷函數每一秒s加1,夠60s則s變為0,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. }

復制代碼


回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

ID:332444 發表于 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,主函數中的數碼管函數開始執行,定時器開始工作
  9.                 if(key2==0)
  10.                 {
  11.                         while(1)
  12.                         {
  13.                                 shuma();
  14.                         }
  15.                 }
  16.           while(!key2);
  17. }
  18. }
復制代碼

這樣的代碼邏輯只有按住這個按鍵,釋放按鍵,再按住按鍵,再釋放按鍵,才能實現動態顯示。
回復

使用道具 舉報

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

使用道具 舉報

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

他不應該是外部中斷1打斷定時/計數器1,然后外部中斷0打斷外部中斷1,外部中斷0完了就返回外部中斷1,然后外部中斷0完了,推出去?
回復

使用道具 舉報

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

你說的這個改了,謝謝
回復

使用道具 舉報

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

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

使用道具 舉報

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

原來如此,謝謝大佬
回復

使用道具 舉報

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产毛片久久久久久久久春天 | 99精品免费久久久久久日本 | 99精品视频免费观看 | 久久久精品一区二区 | 亚洲天堂久久 | 一本一道久久a久久精品蜜桃 | 久久久久www | 国产成人精品一区二区三区四区 | 黑人精品欧美一区二区蜜桃 | 一区二区三区四区不卡 | 亚洲精品免费视频 | 性高朝久久久久久久3小时 av一区二区三区四区 | 欧美不卡一区二区三区 | 亚洲成人国产精品 | 仙人掌旅馆在线观看 | 欧美中文一区 | www.9191 | 中文字幕一区二区视频 | 波多野结衣一区二区 | 波多野结衣在线观看一区二区三区 | 成人精品一区二区三区中文字幕 | 国产中文视频 | 国产精品毛片无码 | 在线观看深夜视频 | www.99热 | 日本视频免费 | 日日操夜夜操天天操 | 国产91综合 | 国产免费视频 | 日本精品视频在线观看 | 欧美偷偷操 | av网站在线免费观看 | 黄一区二区三区 | 91中文字幕在线 | 成人av鲁丝片一区二区小说 | 欧美一级二级在线观看 | 国产最好的av国产大片 | 久在线 | 天堂一区二区三区 | 综合自拍| 日韩欧美国产综合 |