找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 12620|回复: 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 单片机教程网

快速回复 返回顶部 返回列表