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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

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

[復制鏈接]
跳轉到指定樓層
樓主
六位數碼管顯示時分秒,通過四個按鍵進行時間的控制。按下"調時"按鍵,時間顯示停止;按下"選擇時分秒"按鍵,數碼管上方的發光二極管會點亮,對應著選中的要修改的時間是小時、分鐘還是秒;按下"按下增加"按鍵,選中的時間將會增加;按下"完成"按鍵,時間繼續顯示。

已通過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};//共陽數碼管數字碼
  5. char tab_dp[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x70,0x10};//共陽數碼管數字碼(帶小數點)

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

  9. sbit time_change=P3^0;  //P3^0為“調時”按鍵
  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;  //按下“選擇時分秒”按鍵的次數
  16. int flag;    //定義“調時”按鍵的標志位
  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. //--------------------------------延時子函數------------------------------------
  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. //-------------------------------顯示子函數---------------------------------------
  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;    //循環掃描
  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. //----------------------------調時子程序-------------------------------
  105. void time_modify()
  106. {
  107.      if(time_change==0)    //如果“調時”按鍵按下
  108.   {
  109.    delay(5);      //延時去抖
  110.    if(time_change==0)
  111.    {
  112.     flag=1;     //標志位置1
  113.     while(flag)    //當標志位為1時才能進行時間調整
  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;   //按下的次數增加
  131.        if(choose_n==4)  //如果次數達到4次
  132.        {
  133.         choose_n=1;  //次數清零
  134.        }
  135.        if(choose_n==1)  //如果次數為1,秒指示燈亮
  136.        {
  137.             LIGHT=0x03;
  138.        }
  139.        else if(choose_n==2) //如果次數為2,分指示燈亮
  140.        {
  141.         LIGHT=0x0c;
  142.        }
  143.        else if(choose_n==3)  //如果次數為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)  //分支結構,根據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. }
復制代碼


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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 免费看国产精品视频 | 欧美精品一区在线发布 | 99精品久久99久久久久 | 国产99久久精品一区二区永久免费 | 色婷婷精品久久二区二区蜜臂av | 中文字幕视频在线观看免费 | 91精品国产色综合久久不卡98 | 日韩在线精品 | 日韩不卡一二区 | 国产91一区二区三区 | 国产区在线观看 | 欧美精品一区二区三区四区 在线 | 成人午夜看片 | 久久亚洲一区二区 | 精品一区二区三区视频在线观看 | 亚洲精品一区二区在线观看 | 中文字幕第二区 | 欧美激情黄色 | 自拍在线 | 久久久久无码国产精品一区 | 午夜精品三区 | 中文字幕色站 | 伊人免费观看视频 | 亚洲国产精品一区二区三区 | 欧美日韩在线一区二区三区 | 人干人人 | av手机在线免费观看 | 81精品国产乱码久久久久久 | 草草视频在线免费观看 | 中文字幕av亚洲精品一部二部 | 欧美一级α片 | 欧美在线视频免费 | 成人小视频在线观看 | 亚洲成人精品一区二区 | 黄色网址在线播放 | 国产区在线观看 | 精品九九九 | 国产精品美女久久久久aⅴ国产馆 | 玖玖玖在线 | 国产精品欧美一区二区 | 日韩伦理一区二区三区 |