找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機C編程(六、定時器時鐘顯示時分秒)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:217812 發(fā)表于 2017-7-7 09:44 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
六位數(shù)碼管顯示時分秒,通過四個按鍵進行時間的控制。按下"調(diào)時"按鍵,時間顯示停止;按下"選擇時分秒"按鍵,數(shù)碼管上方的發(fā)光二極管會點亮,對應(yīng)著選中的要修改的時間是小時、分鐘還是秒;按下"按下增加"按鍵,選中的時間將會增加;按下"完成"按鍵,時間繼續(xù)顯示。

已通過proteus仿真,電路圖如下所示,希望大家多多指點,積極留言:


  1. //編程:jumpmysoul

  2. #include<reg52.h>
  3. #define ulong unsigned long
  4. char tab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共陽數(shù)碼管數(shù)字碼
  5. char tab_dp[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x70,0x10};//共陽數(shù)碼管數(shù)字碼(帶小數(shù)點)

  6. #define LED P0     //P0為數(shù)碼管的段選
  7. #define LIGHT P1   //P1為時分秒位的指示燈
  8. #define WS P2   //P2為數(shù)碼管的位選

  9. sbit time_change=P3^0;  //P3^0為“調(diào)時”按鍵
  10. sbit time_choose=P3^1;  //P3^1為“選擇時分秒”按鍵
  11. sbit time_inc=P3^2;   //P3^2為“增加”按鍵
  12. sbit time_ok=P3^3;   //P3^3為“完成”按鍵

  13. ulong t;
  14. ulong sec,min,hour,sec_ge,sec_shi,min_ge,min_shi,hour_ge,hour_shi; //定義秒,分,時,秒的個位,十位,分的個位,十位,時的個位,十位
  15. int choose_n;  //按下“選擇時分秒”按鍵的次數(shù)
  16. int flag;    //定義“調(diào)時”按鍵的標志位
  17. //---------------------------------------------------------------------
  18. void init();
  19. void display();
  20. void delay(int);
  21. void time_modify();
  22. //---------------------------------------------------------------------
  23. void main()
  24. {
  25. init();
  26. while(1)
  27. {
  28.   TR0=1;
  29.   display();
  30.   time_modify();
  31. }
  32. }
  33. //---------------------------------------------------------------------
  34. void init()
  35. {
  36. WS=t=LIGHT=choose_n=0;
  37. sec_ge=sec_shi,min_ge,min_shi,hour_ge,hour_shi=sec=min=hour=flag=0;
  38. TMOD=0x01;        //定義定時器0工作與方式1
  39. TH0=(65536-5536)/256;     //定時器賦初值
  40. TL0=(65536-5536)%256;
  41. EA=1;    //開總中斷和T0中斷
  42. ET0=1;
  43. }
  44. //--------------------------------延時子函數(shù)------------------------------------
  45. void delay(int x)
  46. {
  47.     int i,j;
  48.     for(i=x;i>0l;i--)
  49.      for(j=255;j>0;j--);
  50. }
  51. //-------------------------------顯示子函數(shù)---------------------------------------
  52. void display()
  53. {
  54. int i=0;

  55. if(TF0==1)    //如果定時器溢出
  56. {
  57.   TF0=0;    //清中斷標志位
  58.   t++;
  59.   if(t==10)
  60.   {
  61.    t=0;
  62.    sec++;    //秒加1
  63.    if(sec==60)   //如果秒為60,則清零,分加1
  64.    {
  65.     sec=0;
  66.     min++;
  67.    }
  68.    if(min==60)    //如果分為60,則清零,時加1
  69.    {
  70.     min=0;
  71.     hour++;
  72.    }
  73.    if(hour==24)    //如果時為24,則清零
  74.    {
  75.     hour=0;
  76.    }
  77.    }
  78. }
  79. sec_ge=sec%10;    //秒的個位和十位
  80. sec_shi=sec/10;
  81. min_ge=min%10;    //分的個位和十位
  82. min_shi=min/10;
  83. hour_ge=hour%10;   //時的個位和十位
  84. hour_shi=hour/10;

  85. WS=0x20;    //循環(huán)掃描
  86. LED=tab[sec_ge];
  87. delay(1);

  88. WS=0x10;
  89. LED=tab[sec_shi];
  90. delay(1);

  91. WS=0x08;
  92. LED=tab_dp[min_ge];
  93. delay(1);

  94. WS=0x04;
  95. LED=tab[min_shi];
  96. delay(1);

  97. WS=0x02;
  98. LED=tab_dp[hour_ge];
  99. delay(1);

  100. WS=0x01;
  101. LED=tab[hour_shi];
  102. delay(1);
  103. }
  104. //----------------------------調(diào)時子程序-------------------------------
  105. void time_modify()
  106. {
  107.      if(time_change==0)    //如果“調(diào)時”按鍵按下
  108.   {
  109.    delay(5);      //延時去抖
  110.    if(time_change==0)
  111.    {
  112.     flag=1;     //標志位置1
  113.     while(flag)    //當標志位為1時才能進行時間調(diào)整
  114.     {
  115.      TR0=0;   //定時器停止
  116.      display();   //顯示停止時的時間
  117.      if(time_ok==0)   //如果“完成”按鍵按下
  118.      {
  119.          delay(15);    //延時去抖
  120.       if(time_ok==0)
  121.       {
  122.        flag=0;   //標志位清零
  123.       }
  124.      }
  125.      if(time_choose==0)   //如果“時分秒選擇”按鍵按下
  126.      {
  127.       delay(30);   //延時去抖
  128.       if(time_choose==0)
  129.       {
  130.        ++choose_n;   //按下的次數(shù)增加
  131.        if(choose_n==4)  //如果次數(shù)達到4次
  132.        {
  133.         choose_n=1;  //次數(shù)清零
  134.        }
  135.        if(choose_n==1)  //如果次數(shù)為1,秒指示燈亮
  136.        {
  137.             LIGHT=0x03;
  138.        }
  139.        else if(choose_n==2) //如果次數(shù)為2,分指示燈亮
  140.        {
  141.         LIGHT=0x0c;
  142.        }
  143.        else if(choose_n==3)  //如果次數(shù)為3,時指示燈亮
  144.        {
  145.         LIGHT=0x30;
  146.        }
  147.        }
  148.      }
  149.      if(time_inc==0)      //如果“增加”按鍵按下
  150.      {
  151.       delay(30);     //延時去抖
  152.       if(time_inc==0)
  153.       {
  154.        switch(choose_n)  //分支結(jié)構(gòu),根據(jù)choose_n的值來判斷哪一位加1
  155.        {
  156.         case 1:    //如果choose_n為1,秒加1,到60清零
  157.         {
  158.          sec++;
  159.          if(sec==60)
  160.          sec=0;
  161.          break;
  162.         }
  163.         case 2:      //如果choose_n為2,分加1,到60清零
  164.         {
  165.          min++;
  166.          if(min==60)
  167.          min=0;
  168.          break;
  169.         }
  170.         case 3:     //如果choose_n為3,時加1,到24清零
  171.         {
  172.          hour++;
  173.          if(hour==24)
  174.          hour=0;
  175.          break;
  176.         }
  177.         default:break;
  178.        }
  179.       }
  180.      }
  181.     }
  182.    }
  183.     }
  184. }
復(fù)制代碼


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

使用道具 舉報

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

本版積分規(guī)則

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

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

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