找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9919|回复: 2
收起左侧

洞洞板制作51单片机六位数码管时钟

[复制链接]
ID:170147 发表于 2017-3-31 20:54 | 显示全部楼层 |阅读模式
这次发帖也是因为刚借助51黑电子论坛里的资料完成一件洞洞板制作的作品。所以也想来赚点黑币,我不是大神,只是个小白。附带吧内大神资料,
0.png 0.png 0.png 0.png
   程序名称:六位数码管时钟表
编译器:Keil uVision 4
程序功能:上电后,程序按初始时间开始时钟演示,时间显示按24小时制。
    时间调整:按A键,显示加1,按B键,显示减1,按C键,清零
MCU:AT89C51
晶振:11.0592M
外围部件:
键盘:4按键A、B、C、D分别接在P1.0、P1.1、P1.2和P1.3上,低电平有效
     A、B、C键分别控制时、分、秒的选择,D键铵下进行时间调整。
显示:4位共阴极LED,P0口送显示数据,P1口低四位位选
内部资源:
使用定时计数器1中断,用于定时及显示
警告:
1. 按键未加防抖动程序
2. 此程序经过编译并通过Proteus仿真,未通过实物检验。
作者:花落水流红,空寂萧然山——萧然
完成日期:/6/11
============================================================================*/
  1. #include <reg51.h>   //包含必要头文件
  2. //定义按键
  3. sbit HourAdjust = P1^0;   //时调整选择键
  4. sbit MinuteAdjust = P1^1;  //分调整选择键
  5. sbit SecondAdjust = P1^2;  //秒选择选择键
  6. sbit Adjust = P1^3;    //调整键  
  7. //定义标志位
  8. bit SecondFlag = 0;    //秒标志   
  9. bit FlashFlag = 0;    //秒闪标志
  10. bit Second10Flag = 0;   //10秒标志
  11. bit HourAdjustFlag = 0;   //时调整标志,A键按下置1,10秒后清0
  12. bit MinuteAdjustFlag = 0;   //分调整标志,A键按下置1,10秒后清0  
  13. bit SecondAdjustFlag = 0;   //秒调整标志,A键按下置1,10秒后清0  

  14. unsigned char Led1,Led2,Led3,Led4,Led5,Led6;  //定义缓存
  15. int TimeCount,Second10Count;   //定义计数器
  16. unsigned char code LedTab[]=  //定义共阴极数码管表,0x00用于清除显示
  17.    {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
  18. void Delay100us(int Times);    //定义延时函数

  19. //*****************************定时器中断服务程序******************************r
  20. //程序功能:动态驱动数码管,同时完成定时功能。
  21. void timer() interrupt 3 using 2
  22. {
  23. TR1 = 0;
  24. TL1 = 0x13; TH1 = 0x2C; //重新赋值
  25. P0 = 0x00;    //显示小时
  26. P2 = 0xfe;
  27. P0 = LedTab[Led1];
  28. Delay100us(1);
  29. P0 = 0x00;
  30. P2 = 0xfd;
  31. if(FlashFlag)   //秒显(1秒显,1秒隐)分前小数点
  32.   P0 = LedTab[Led2] | 0x80;
  33. else
  34.   P0 = LedTab[Led2] & 0x7f;
  35. Delay100us(1);   
  36. P0 = 0x00;    //显示分
  37. P2 = 0xfb;
  38. P0 = LedTab[Led3];
  39. Delay100us(1);
  40. P0 = 0x00;
  41. P2 = 0xf7;
  42. if(FlashFlag)   //秒显秒前小数点
  43.   P0 = LedTab[Led4] | 0x80;
  44. else
  45.   P0 = LedTab[Led4] & 0x7f;
  46. Delay100us(1);
  47. P0 = 0x00;    //显示秒
  48. P2 = 0xef;
  49. P0 = LedTab[Led5];
  50. Delay100us(1);
  51. P0 = 0x00;
  52. P2 = 0xdf;
  53. P0 = LedTab[Led6];
  54. Delay100us(1);
  55. TR1 = 1;

  56. if(TimeCount < 100)  //秒计数器
  57.   TimeCount++;
  58. else
  59. {
  60.   TimeCount = 0x00;
  61.   SecondFlag = 1;  //置位秒标志
  62.   if(Second10Flag) //10秒计数器
  63.    if(Second10Count < 20)
  64.     Second10Count++;
  65.    else
  66.    {
  67.     Second10Count = 0x00;  //10秒计数器清0
  68.     Second10Flag = 0;   //清除10s标志
  69.     HourAdjustFlag = 0;   //清除调整标志位
  70.     MinuteAdjustFlag = 0;
  71.     SecondAdjustFlag = 0;
  72.    }
  73. }
  74. }
  75. //============================================================================
  76. main(void)
  77. {
  78. //初始化
  79. int Second = 30;  //初始化时间
  80. int Minute = 12;
  81. int Hour = 20;
  82. Led1 = 0x00;   //清除显存
  83. Led2 = 0x00;
  84. Led3 = 0x00;
  85. Led4 = 0x00;
  86. Led5 = 0x00;
  87. Led6 = 0x00;
  88. SecondFlag = 0;
  89. TimeCount = 0x00;
  90. //设置定时器中断
  91. TMOD = 0x10f;   //GATE=0             01010001
  92.        //C/T=0--定时/计数器1工作于定时方式
  93.        //M1=1;M0=0--选择工作模式1,构成最大定时器
  94.        //T0:在此程序不使用
  95. TL1 = 0x13; TH1 = 0x2C; //指定定时时间为50ms  65536-50/(11.0592/12)=11283=2C13h
  96. EA = 1;     //开总中断
  97. TF1 = 0;
  98. ET1 = 1;    //开定时器中断
  99. TR1 = 1;    //开始计时
  100. while(1)
  101. {
  102. //*****************************************************************************
  103. //对时间进行调整程序
  104.   if(SecondFlag)
  105.   {
  106.    if(Second%2 == 0)
  107.     FlashFlag = 1;
  108.    else
  109.     FlashFlag = 0;
  110.    if(Second < 59)
  111.     Second++;
  112.    else
  113.    {
  114.     if(Minute < 59)
  115.      Minute++;
  116.     else
  117.     {
  118.      if(Hour < 23)
  119.       Hour++;
  120.      else
  121.       Hour = 0;
  122.      Minute = 0;
  123.     }
  124.    Second = 0;
  125.    }  
  126.   SecondFlag = 0;  
  127.   }
  128. //-----------------------------------------------------------------------------
  129. //*****************************************************************************
  130. //时间调整程序
  131.   if(HourAdjustFlag)   //调整时程序
  132.    if(Second10Flag)
  133.     if(FlashFlag)  //时秒显
  134.     {
  135.      Led1 = 0x0a; //时隐
  136.      Led2 = 0x0a;
  137.     }
  138.     else
  139.     {
  140.      Led1 = Hour/10; //时显
  141.      Led2 = Hour%10;
  142.     }
  143.    else
  144.    {
  145.     Led1 = Hour/10;
  146.     Led2 = Hour%10;
  147.    }
  148.   else
  149.   {
  150.    Led1 = Hour/10;
  151.    Led2 = Hour%10;
  152.   }
  153.   if(MinuteAdjustFlag)  //调整分程序
  154.    if(Second10Flag)
  155.     if(FlashFlag)  //分秒显
  156.     {
  157.      Led3 = 0x0a;
  158.      Led4 = 0x0a;
  159.     }
  160.     else
  161.     {
  162.      Led3 = Minute/10;
  163.      Led4 = Minute%10;
  164.     }
  165.    else
  166.    {
  167.     Led3 = Minute/10;
  168.     Led4 = Minute%10;
  169.    }
  170.   else
  171.   {
  172.    Led3 = Minute/10;
  173.    Led4 = Minute%10;
  174.   }
  175.   if(SecondAdjustFlag)  //调整秒程序,控制秒显
  176.    if(Second10Flag)
  177.     if(FlashFlag)
  178.     {
  179.      Led5 = 0x0a;
  180.      Led6 = 0x0a;
  181.     }
  182.     else
  183.     {
  184.      Led5 = Second/10;
  185.      Led6 = Second%10;
  186.     }
  187.    else
  188.    {
  189.     Led5 = Second/10;
  190.     Led6 = Second%10;
  191.    }
  192.   else
  193.   {
  194.    Led5 = Second/10;
  195.    Led6 = Second%10;
  196.   }
  197.   
  198.   
  199.   if(!HourAdjust)    //时调整按键按下
  200.   {
  201.    while(!HourAdjust);  //等待松开
  202.    HourAdjustFlag = 1;  //置位时标志位
  203.    MinuteAdjustFlag = 0; //清除分标志位
  204.    SecondAdjustFlag = 0; //清除秒标志位
  205.    Second10Flag = 1;  //置位10秒标志位
  206.   }
  207.   if(!MinuteAdjust)   //分调整键按下
  208.   {
  209.    while(!MinuteAdjust);
  210.    MinuteAdjustFlag = 1;
  211.    HourAdjustFlag = 0;
  212.    SecondAdjustFlag = 0;
  213.    Second10Flag = 1;
  214.   }
  215.   if(!SecondAdjust)   //秒调整键按下
  216.   {
  217.    while(!SecondAdjust);
  218.    SecondAdjustFlag = 1;
  219.    HourAdjustFlag = 0;
  220.    MinuteAdjustFlag = 0;
  221.    Second10Flag = 1;
  222.   }
  223.   if(!Adjust)     //调整键按下
  224.   {
  225.    while(!Adjust);
  226.    if(HourAdjustFlag)  //调整时,加1
  227.     if(Hour < 23)
  228.     {
  229.      Hour++;
  230.      Second10Count = 0;
  231.     }
  232.     else
  233.      Hour = 0;
  234.    if(MinuteAdjustFlag) //调整分,加1
  235.     if(Minute < 59)
  236.     {
  237.      Minute++;
  238.      Second10Count = 0;
  239.     }
  240.     else    //调整秒,清零
  241.      Minute = 0;
  242.    if(SecondAdjustFlag)
  243.     Second = 0;
  244.   }
  245. }
  246. }
  247. //********************************延时程序************************************
  248. void Delay100us(int Times)
  249. {
  250. Times = Times * 100;
  251. while(Times--);
  252. }
复制代码

评分

参与人数 2黑币 +105 收起 理由
靠海 + 5 赞一个!
admin + 100 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:64913 发表于 2018-4-27 00:14 | 显示全部楼层
赞一个
回复

使用道具 举报

ID:242298 发表于 2019-1-25 02:29 | 显示全部楼层
好是好。就是 我的管子是时钟格式的,怎么弄呢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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