找回密码
 立即注册

QQ登录

只需一步,快速开始

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

超级省电的时钟制作 最省电时可达3mA [修正BUG]

[复制链接]
跳转到指定楼层
楼主
ID:127496 发表于 2016-6-21 01:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近终于有时间发图片了:
样子:


显示月份:


省电模式:


背面走线图


数码管底部暗藏IC:













  1. /***********************************************************************

  2. 作者:TZR

  3. 版本:CK3148 (ver2.0)

  4. 功能:  1 显示时间

  5.     2 显示日期

  6.     3 计算年份

  7.     4 闹钟功能

  8.     5 超小体积设计(电池最大……)

  9.     6 整点报时

  10.     7(重点改进点)超省电设计,正常工作电流在9~12mA之间,最省电时电流可达3mA!闹钟鸣响时电流在15mA~18mA左右。

  11.     8.增加省电模式,模式下耗电<3.3mA,数码管不显示,走时仍然继续,闹钟,整点报时仍然运行。(闹钟会中断省电模式)

  12. 日志:V1:实现走时功能,程序整体不稳定,闹钟和整点报时功能不正常。

  13.    V1.2:修正闹钟和整点报时BUG,修正出现“0月0日的”BUG,修正年份显

  14.   V2:改进了程序,作品变得相当省电,耗电量相比之前下降一半,最省电时可达3mA.

  15.   V2.2:增加省电模式。修正程序稳定性差,整点报时不兼容“省电模式”的问题。



  16. 省电原理:LED显示屏低频闪烁,闪烁期间单片机进入空闲模式,使用定时器中断唤醒单片机,并产生时钟。

  17. ***************************************************************************/


  18. #include <stc12c2052ad.h>
  19. unsigned char hour;
  20. unsigned char min;
  21. unsigned char sec;
  22. unsigned char st;
  23. unsigned char t;
  24. unsigned char alh;
  25. unsigned char alm;
  26. unsigned char yearH;
  27. unsigned char yearL;
  28. unsigned char month;
  29. unsigned char beepc;
  30. unsigned char day;
  31. unsigned char mo;
  32. unsigned bm[12]={1,0,1,0,1,0,1,1,0,1,0,1};
  33. bit am;
  34. sbit mode=P1^7;
  35. sbit chan=P1^6;
  36. sbit beep=P3^7;
  37. sbit v4=P1^5;
  38. sbit c=P1^4;
  39. sbit b=P1^3;
  40. sbit v3=P1^2;
  41. sbit v2=P1^1;
  42. sbit d=P1^0;
  43. sbit e=P3^0;
  44. sbit f=P3^1;
  45. sbit h=P3^2;
  46. sbit g=P3^3;
  47. sbit a=P3^4;
  48. sbit v1=P3^5;
  49. #define close v1=0;v2=0;v3=0;v4=0;
  50. #define led0 a=1;b=1;c=1;d=1;e=1;f=1;g=1;h=1;
  51. #define num0 a=1;b=0;c=0;d=0;e=0;f=0;g=0;
  52. #define num1 a=1;b=1;c=1;e=1;f=1;d=0;g=0;
  53. #define num2 f=0;e=0;d=0;c=0;a=0;
  54. #define num3 g=0;f=0;d=0;c=0;a=0;
  55. #define num4 g=0;d=0;b=0;a=0;
  56. #define num5 g=0;f=0;c=0;b=0;a=0;
  57. #define num6 c=0;b=0;e=0;f=0;g=0;a=0;
  58. #define num7 c=0;d=0;g=0;
  59. #define num8 a=0;b=0;c=0;d=0;e=0;f=0;g=0;
  60. #define num9 a=0;b=0;c=0;d=0;f=0;g=0;
  61. //CLKS0=1;
  62. void delay (unsigned int a){
  63.   unsigned int i;
  64.   while(--a >= 0){
  65.     for(i = 0; i < 300; i++);
  66.   }
  67. }
  68. void paint(unsigned char i){
  69. if(i==0){num0;}
  70. if(i==1){num1;}
  71. if(i==2){num2;}
  72. if(i==3){num3;}
  73. if(i==4){num4;}
  74. if(i==5){num5;}
  75. if(i==6){num6;}
  76. if(i==7){num7;}
  77. if(i==8){num8;}
  78. if(i==9){num9;}
  79. }
  80. void main (void){
  81. P3M0=0x00;
  82. P3M1=0x80;
  83. mode=0;
  84. beep=0;
  85. beepc=0;
  86. chan=0;
  87. mo=0;
  88. EA=1;
  89. ET0=1;
  90. st=0;
  91. close;
  92. led0;
  93. hour=11;
  94. min=59;
  95. alh=12;
  96. alm=00;
  97. sec=59;
  98. TH0=0x00;
  99. TL0=0x00;
  100. TR0=1;
  101. t=1;
  102. am=1;
  103. yearH=20;
  104. yearL=11;
  105. month=4;
  106. day=23;
  107. while(1){
  108.   if(mo==0){
  109.    if(mode==1){
  110.     delay(20);
  111.     if(mode==1){
  112.      mo++;
  113.     }
  114.     while(mode==1);
  115.    }
  116.    if(chan==1){
  117.     delay(20);
  118.     if(chan==1){
  119.      beep=0;
  120.      beepc=0;
  121.      while(chan==1);
  122.     }
  123.    }
  124.    if(sec%10==8 || sec%10==9){
  125.     led0;
  126.     paint(day%10);//0001
  127.     close;
  128.     v1=1;
  129.     delay(t);
  130.     led0;
  131.     paint(day/10);//0010
  132.     close;
  133.     v2=1;
  134.     delay(t);
  135.     led0;
  136.     paint(month%10);//0100
  137.     h=0;
  138.     close;
  139.     v3=1;
  140.     delay(t);
  141.     led0;
  142.     paint(month/10);//1000
  143.     close;
  144.     v4=1;
  145.     delay(t);
  146.    }else{
  147.     led0;
  148.     paint(min%10);//0001
  149.     close;
  150.     v1=1;
  151.     delay(t);
  152.     led0;
  153.     paint(min/10);//0010
  154.     close;
  155.     v2=1;
  156.     delay(t);
  157.     led0;
  158.     paint(hour%10);//0100
  159.     h=sec%2;
  160.     close;
  161.     v3=1;
  162.     delay(t);
  163.     led0;
  164.     paint(hour/10);//1000
  165.     close;
  166.     v4=1;
  167.     delay(t);
  168.    }
  169.   }else if(mo==1){
  170.    if(st<50){
  171.     led0;
  172.     paint(hour/10);//1000
  173.     close;
  174.     v4=1;
  175.     delay(t);
  176.    }
  177.    if(chan==1){
  178.     delay(20);
  179.     if(chan==1){
  180.      hour+=10;
  181.      if(hour>23){
  182.       hour=0;
  183.      }
  184.      while(chan==1);
  185.     }
  186.    }
  187.    if(mode==1){
  188.     delay(20);
  189.     if(mode==1){
  190.      mo++;
  191.     }
  192.     while(mode==1);
  193.    }
  194.   }else if(mo==2){
  195.    if(st<50){
  196.     led0;
  197.     paint(hour%10);//1000
  198.     close;
  199.     v3=1;
  200.     delay(t);
  201.    }
  202.    if(chan==1){
  203.     delay(20);
  204.     if(chan==1){
  205.      hour+=1;
  206.      if(hour%10==0){
  207.       hour-=10;
  208.      }
  209.      while(chan==1);
  210.     }
  211.    }
  212.    if(mode==1){
  213.     delay(20);
  214.     if(mode==1){
  215.      mo++;
  216.     }
  217.     while(mode==1);
  218.    }
  219.   }else if(mo==3){
  220.    if(st<50){
  221.     led0;
  222.     paint(min/10);//1000
  223.     close;
  224.     v2=1;
  225.     delay(t);
  226.    }
  227.    if(chan==1){
  228.     delay(20);
  229.     if(chan==1){
  230.      min+=10;
  231.      if(min>59){
  232.       min=0;
  233.      }
  234.      while(chan==1);
  235.     }
  236.    }
  237.    if(mode==1){
  238.     delay(20);
  239.     if(mode==1){
  240.      mo++;
  241.     }
  242.     while(mode==1);
  243.    }
  244.   }else if(mo==4){
  245.    if(st<50){
  246.     led0;
  247.     paint(min%10);//1000
  248.     close;
  249.     v1=1;
  250.     delay(t);
  251.    }
  252.    if(chan==1){
  253.     delay(20);
  254.     if(chan==1){
  255.      min+=1;
  256.      if(min%10==0){
  257.       min-=10;
  258.      }
  259.      while(chan==1);
  260.     }
  261.    }
  262.    if(mode==1){
  263.     delay(20);
  264.     if(mode==1){
  265.      mo++;
  266.     }
  267.     while(mode==1);
  268.    }
  269.   }else if(mo==5){
  270.    if(st<50){
  271.     led0;
  272.     paint(month/10);//1000
  273.     close;
  274.     v2=1;
  275.     delay(t);
  276.     led0;
  277.     paint(month%10);//1000
  278.     close;
  279.     v1=1;
  280.     delay(t);
  281.    }
  282.    if(chan==1){
  283.     delay(20);
  284.     if(chan==1){
  285.      month+=1;
  286.      if(month==13){
  287.       month=1;
  288.      }
  289.      while(chan==1);
  290.     }
  291.    }
  292.    if(mode==1){
  293.     delay(20);
  294.     if(mode==1){
  295.      mo++;
  296.     }
  297.     while(mode==1);
  298.    }
  299.   }else if(mo==6){
  300.    if(st<50){
  301.     led0;
  302.     paint(day/10);//1000
  303.     close;
  304.     v2=1;
  305.     delay(t);
  306.     led0;
  307.     paint(day%10);//1000
  308.     close;
  309.     v1=1;
  310.     delay(t);
  311.    }
  312.    if(chan==1){
  313.     delay(20);
  314.     if(chan==1){
  315.      day+=1;
  316.      if(day==32){
  317.       day=1;
  318.      }
  319.      while(chan==1);
  320.     }
  321.    }
  322.    if(mode==1){
  323.     delay(20);
  324.     if(mode==1){
  325.      mo++;
  326.     }
  327.     while(mode==1);
  328.    }
  329.   }else if(mo==7){
  330.    if(st<50){
  331.     led0;
  332.     paint(yearL%10);//0001
  333.     close;
  334.     v1=1;
  335.     delay(t);
  336.     led0;
  337.     paint(yearL/10);//0010
  338.     close;
  339.     v2=1;
  340.     delay(t);
  341.     led0;
  342.     paint(yearH%10);//0100
  343.     h=0;
  344.     close;
  345.     v3=1;
  346.     delay(t);
  347.     led0;
  348.     paint(yearH/10);//1000
  349.     close;
  350.     v4=1;
  351.     delay(t);
  352.    }
  353.    if(chan==1){
  354.     delay(20);
  355.     if(chan==1){
  356.      yearL+=1;
  357.      if(yearL>=30){
  358.       yearL=11;
  359.      }
  360.      while(chan==1);
  361.     }
  362.    }
  363.    if(mode==1){
  364.     delay(20);
  365.     if(mode==1){
  366.      mo++;
  367.     }
  368.     while(mode==1);
  369.    }
  370.   }else if(mo==8){
  371.    if(st<50){
  372.     led0;
  373.     paint(alh/10);//1000
  374.     close;
  375.     v4=1;
  376.     delay(t);
  377.     led0;
  378.     paint(alh%10);//1000
  379.     close;
  380.     v3=1;
  381.     delay(t);
  382.    }
  383.    if(chan==1){
  384.     delay(20);
  385.     if(chan==1){
  386.      alh+=1;
  387.      if(alh>23){
  388.       alh=0;
  389.      }
  390.      while(chan==1);
  391.     }
  392.    }
  393.    if(mode==1){
  394.     delay(20);
  395.     if(mode==1){
  396.      mo++;
  397.     }
  398.     while(mode==1);
  399.    }
  400.   }else if(mo==9){
  401.    if(st<50){
  402.     led0;
  403.     paint(alm/10);//1000
  404.     close;
  405.     v2=1;
  406.     delay(t);
  407.     led0;
  408.     paint(alm%10);//1000
  409.     close;
  410.     v1=1;
  411.     delay(t);
  412.    }
  413.    if(chan==1){
  414.     delay(20);
  415.     if(chan==1){
  416.      alm+=1;
  417.      am=1;
  418.      if(alm>=60){
  419.       alm=0;
  420.      }
  421.      while(chan==1);
  422.     }
  423.    }
  424.    if(mode==1){
  425.     delay(20);
  426.     if(mode==1){
  427.      mo=0;
  428.     }
  429.     while(mode==1);
  430.    }
  431.   }
  432. }
  433. }
  434. void t0 (void) interrupt 1 {
  435. st++;
  436. if(st>99){
  437.   st=0;
  438.   sec++;
  439.   if(beep==1){
  440.    beepc--;
  441.    if(beepc<=0){
  442.     beep=0;
  443.    }
  444.   }
  445. }
  446. if(sec>59){
  447.    sec=0;
  448.    min++;
  449.    if(min==alm && hour==alh && am==1){
  450.     beep=1;
  451.     beepc=50;
  452.    }
  453.   }
  454.   if(min>59){
  455.    min=0;
  456.    hour++;
  457.    beep=1;//整点报时
  458.    beepc=1;
  459.   }
  460.   if(hour>23){
  461.    hour=0;
  462.    day++;
  463.    if(month==2){
  464.     if(yearL%4==0){
  465.      if(day==30){
  466.       day=0;
  467.       month++;
  468.      }
  469.     }else{
  470.      if(day==29){
  471.       day=0;
  472.       month++;
  473.      }
  474.     }
  475.    }else if(bm[month]==0){
  476.     if(day==31){
  477.      day=0;
  478.      month++;
  479.      if(month==13){
  480.       month=1;
  481.       yearL++;
  482.      }
  483.     }
  484.    }else if(bm[month]==1){
  485.     if(day==32){
  486.      day=0;
  487.      month++;
  488.      if(month==13){
  489.       month=1;
  490.       yearL++;
  491.      }
  492.     }
  493.    }
  494.   }
  495. TH0=0x6c;/*7a9c*/
  496. TL0=0xc2;
  497. }
复制代码



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

使用道具 举报

沙发
ID:67984 发表于 2016-6-22 09:33 | 只看该作者
能把原理图发上了么
回复

使用道具 举报

板凳
ID:116662 发表于 2016-8-5 11:53 | 只看该作者
谢谢分享
回复

使用道具 举报

地板
ID:476271 发表于 2019-7-25 09:44 | 只看该作者
能把原理图发上了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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