找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3632|回复: 0
打印 上一主题 下一主题
收起左侧

带时间自校准功能单片机电子钟电路与源码

[复制链接]
跳转到指定楼层
楼主
带时间自校准功能电子钟



单片机源程序如下:
  1. //电子钟控制程序


  2. //---------------------------------------------------------------------------
  3. #include <AT89X51.H>

  4. #include "程序.h"


  5. //---------------------------------------------------------------------------
  6. //主控
  7. void main()
  8. {
  9.         ChuShiHua(); //初始化
  10.         for (;;)
  11.         {
  12.                 if (P1_0 == 0)
  13.                         SheShi(0); //设时
  14.                 if (P1_1 == 0)
  15.                         SheFen(0); //设分
  16.                 if (P1_2 == 0)
  17.                         SheMiao(0); //设秒
  18.                 P1_7 = INT0; //校准指示灯
  19.         }
  20. }


  21. //---------------------------------------------------------------------------
  22. //初始化
  23. void ChuShiHua()
  24. {
  25.         shi = fen = miao = 0; //时、分、秒
  26.         PX0 = 1; //INT0高优先级
  27.         IT0 = 1; //INT0边沿触发
  28.         TMOD = 2; //TIMER0方式2(8位自动重新装入计数器)
  29.         TH0 = TL0 = 56; //TIMER0计数周期0.1ms
  30.         IE = 0x83; //开中断
  31.         TR0 = 1; //开TIMER0
  32. }


  33. //---------------------------------------------------------------------------
  34. //设时
  35. //入口:次数,P1.0变成0时第0次、100ms后第1次
  36. void SheShi(const char ci_shu)
  37. {
  38.         static bit yaj = 0; //已按键
  39.         if (ci_shu == 0)
  40.                 yaj = 1;
  41.         else
  42.         {
  43.                 if (yaj == 1 && P1_0 == 0)
  44.                 {
  45.                         shi++;
  46.                         if (shi >= 24)
  47.                                 shi = 0;
  48.                         P1_0 = 1;
  49.                 }
  50.                 yaj = 0;
  51.         }
  52. }


  53. //---------------------------------------------------------------------------
  54. //设分
  55. //入口:次数,P1.1变成0时第0次、100ms后第1次
  56. void SheFen(const char ci_shu)
  57. {
  58.         static bit yaj = 0; //已按键
  59.         if (ci_shu == 0)
  60.                 yaj = 1;
  61.         else
  62.         {
  63.                 if (yaj == 1 && P1_1 == 0)
  64.                 {
  65.                         fen++;
  66.                         if (fen >= 60)
  67.                                 fen = 0;
  68.                         P1_1 = 1;
  69.                 }
  70.                 yaj = 0;
  71.         }
  72. }


  73. //---------------------------------------------------------------------------
  74. //设秒
  75. //入口:次数,P1.2变成0时第0次、100ms后第1次
  76. void SheMiao(const char ci_shu)
  77. {
  78.         static bit yaj = 0; //已按键
  79.         if (ci_shu == 0)
  80.                 yaj = 1;
  81.         else
  82.         {
  83.                 if (yaj == 1 && P1_2 == 0)
  84.                 {
  85.                         miao++;
  86.                         if (miao >= 24)
  87.                                 miao = 0;
  88.                         P1_2 = 1;
  89.                 }
  90.                 yaj = 0;
  91.         }
  92. }


  93. //---------------------------------------------------------------------------
  94. //扫描显示
  95. void SaoMiaoXianShi()
  96. {
  97.         static char xian_shi_wei = 0; //显示位
  98.         if (++xian_shi_wei > 5)
  99.                 xian_shi_wei = 0;
  100.         P0 = 0; //全关了
  101.         P2 = LED[xian_shi_wei];
  102.         switch (xian_shi_wei) //开下一个
  103.         {
  104.         case 0:
  105.                 P0_0 = 1;
  106.                 break;
  107.         case 1:
  108.                 P0_1 = 1;
  109.                 break;
  110.         case 2:
  111.                 P0_2 = 1;
  112.                 break;
  113.         case 3:
  114.                 P0_3 = 1;
  115.                 break;
  116.         case 4:
  117.                 P0_4 = 1;
  118.                 break;
  119.         case 5:
  120.                 P0_5 = 1;
  121.         }
  122. }


  123. //---------------------------------------------------------------------------
  124. //计时
  125. void JiShi() interrupt 1 //TIMER0
  126. {
  127.         static char di_da0_1 = 0, di_da10 = 0, di_da100 = 0; //滴答
  128.         if (++di_da0_1 >= 100)
  129.         {
  130.                 SaoMiaoXianShi(); //扫描显示
  131.                 di_da0_1 = 0;
  132.                 if (++di_da10 >= 10)
  133.                 {
  134.                         SheShi(1); //设时
  135.                         SheFen(1); //设分
  136.                         SheMiao(1); //设秒
  137.                         di_da10 = 0;
  138.                         if (++di_da100 >= 10)
  139.                         {
  140.                                 if (++miao >= 60) //秒
  141.                                 {
  142.                                         miao = 0;
  143.                                         if (++fen >= 60) //分
  144.                                         {
  145.                                                 fen = 0;
  146.                                                 if (++shi >= 24) //时
  147.                                                         shi = 0;
  148.                                         }
  149.                                 }
  150.                                 di_da100 = 0;
  151.                         }
  152.                 }
  153.         }
  154. }


  155. ……………………

  156. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
电路.rar (989.9 KB, 下载次数: 17)
程序.rar (7.08 KB, 下载次数: 14)






分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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