这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 自制多功能无数字led时钟!开源代码

共1条 1/1 1 跳转至

自制多功能无数字led时钟!开源代码

高工
2013-10-15 10:30:18     打赏

看到某宝上有无数字手表,就想着仿制一个。
我做的这个包含了时钟和灯光两种模式。时钟可以对时, 灯光分为呼吸灯、9LED游侠灯和爆闪灯三种,均可调速。
电路不是很复杂,因为是初学单片机,编程序搞得我好几天没睡好觉。。。。。。最后还是从网上找来各个程序,修改定义和变量,去除多余部分。。。七拼八凑的搞在了一起


做的时候没有详细拍照,所以照片不多。大家将就一下




自制的排阻




高亮的led打磨成雾状的。告诉你个窍门,用电钻夹住led的底部,在粗砂纸上打磨,很快就变成雾状了。


12M晶振


背面走线。。。很乱。。。


加了电池以后




我用的stc89c52rc,3v时就不工作了,所以不加保护板应该也不会过放。。。
最后完成图
左边按键长按是切换主模式(即时钟和灯光),短按是切换个主模式下的子模式(时钟下是对时子模式,灯光下是呼吸、游侠和爆闪三种效果)
右边按键对时模式下是每按一下,对应的时间加一,灯光模式下是切换各种灯光效果的三种速度。
由于蓝色led数量是9个。写游侠灯的程序时困扰了我很长时间。最后还是在论坛里找到了解决方案


下面上原理图和视频

下面公开源代码,写的比较乱。要是哪位大侠能给精简一下就好了。
代码比较长,但都是些初级的函数。。。原理图和源代码我都开源了。

  1. #include <reg52.H>
  2. #include<INTRINS.H>
  3. //行
  4. sbit H1=P1^2;
  5. sbit H2=P0^0;
  6. sbit H3=P0^1;
  7. sbit H4=P0^2;
  8. sbit H5=P0^3;
  9. sbit H6=P0^4;
  10. sbit H7=P0^5;
  11. sbit H8=P0^6;
  12. sbit H9=P0^7;
  13. sbit H10=P1^1;
  14. sbit H11=P1^0;
  15. //列
  16. sbit L1=P1^3;
  17. sbit L2=P1^4;
  18. sbit L3=P1^5;
  19. sbit L4=P1^6;
  20. //按键
  21. sbit K1=P3^7;
  22. sbit K2=P2^0;
  23. //变量
  24. unsigned char ms10=0;ss=0;mm=0;mmyu=0;hh=0;hhyu=0;[color=#ff0000]hhjs=0;[/color]a=0;i=0;     //定义参数
  25. unsigned char mode=0;clock=0;light=0;           //模式
  26. unsigned int CYCLE=600;PWM_LOW=0;t=350;s=30000; //定义周期并赋值
  27. #define W1 L1=0,L2=1,L3=1,L4=1   //列扫描
  28. #define W2 L1=1,L2=0,L3=1,L4=1    
  29. #define W3 L1=1,L2=1,L3=0,L4=1    
  30. #define W4 L1=1,L2=1,L3=1,L4=0    
  31. #define W0 L1=0,L2=0,L3=0,L4=0
  32. void delay(unsigned int b)    //延时函数
  33. {
  34. while(--b);
  35. }
  36. void InitTimer0()    //定时器0初始化
  37. {
  38.     TMOD=0x01;
  39.     TH0=(65536-10000)/256;
  40.     TL0=(65536-10000)%256;
  41.     EA=1;
  42.     ET0=1;
  43.     TR0=1;
  44. }
  45. /********************************************///时钟列显示
  46. showL1()
  47. {
  48.     P1=0;P0=0;     //第一列显示
  49.     W1;
  50.     hhyu=hh%10;
  51.     if(hh>9){H10=1;}
  52.     if(hh>19){H11=1;}
  53.     if(hhyu>0) {H1=1;}
  54.     if(hhyu>1) {H2=1;}
  55.     if(hhyu>2) {H3=1;}
  56.     if(hhyu>3) {H4=1;}
  57.     if(hhyu>4) {H5=1;}
  58.     if(hhyu>5) {H6=1;}
  59.     if(hhyu>6) {H7=1;}
  60.     if(hhyu>7) {H8=1;}
  61.     if(hhyu>8) {H9=1;}
  62. }
  63. showL2()
  64. {
  65.     P1=0;P0=0;     //第二列显示
  66.     W2;
  67.     if(mm>49) {H10=1;}
  68. }
  69. showL3()
  70. {
  71.     P1=0;P0=0;     //第三列显示
  72.     W3;
  73.     if(mm>29) {H10=1;}
  74.     if(mm>39) {H11=1;}
  75. }
  76. showL4()
  77. {
  78.     P1=0;P0=0;     //第四列显示
  79.     W4;
  80.     mmyu=mm%10;
  81.     if(mm>9) {H10=1;}
  82.     if(mm>19) {H11=1;}
  83.     if(mmyu>0) {H1=1;}
  84.     if(mmyu>1) {H2=1;}
  85.     if(mmyu>2) {H3=1;}
  86.     if(mmyu>3) {H4=1;}
  87.     if(mmyu>4) {H5=1;}
  88.     if(mmyu>5) {H6=1;}
  89.     if(mmyu>6) {H7=1;}
  90.     if(mmyu>7) {H8=1;}
  91.     if(mmyu>8) {H9=1;}
  92. }
  93. /*****************************************///呼吸灯显示
  94. showHX()
  95. {
  96.     L1=0;L2=0;L3=0;L4=0;
  97.     H10=1;H11=1;H1=0;P0=0x00;
  98.     for(PWM_LOW=1;PWM_LOW<CYCLE;PWM_LOW++)//PWM_LOW表示低
  99.     {//电平时间,这个循环中低电平时长从1累加到CYCLE(周期)的值,即600次
  100.     
  101.       H10=0;H11=0; H1=1;P0=0xff;//点亮LED
  102.        delay(PWM_LOW);//延时长度,600次循环中从1加至599
  103.       H10=1;H11=1;H1=0;P0=0x00;//熄灭LED
  104.        delay(CYCLE-PWM_LOW);//延时长度,600次循环中从599减至1
  105.     
  106.     }
  107.     H10=0;H11=0;H1=1;P0=0xff;
  108.     for(PWM_LOW=CYCLE-1;PWM_LOW>0;PWM_LOW--)
  109.     {//与逐渐变亮相反的过程
  110.     
  111.       H10=0;H11=0;H1=1;P0=0xff;
  112.        delay(PWM_LOW);
  113.       H10=1;H11=1;H1=0;P0=0x00;
  114.        delay(CYCLE-PWM_LOW);
  115.     }
  116. }
  117. /*****************************************///以下为9灯游侠灯显示部分
  118. yxyy()  //走马拖尾右移函数
  119. {
  120.      P0=0x80;H1=0;
  121.      delay(5000);
  122.      P0=0x40;
  123.      if(H9==0)
  124.      {
  125.             for(a=0;a<t;a++)    //调节点亮时间
  126.             {
  127.             H9=1;
  128.             for(i=0;i<15;i++);  //调节亮度高低
  129.             H9=0;
  130.             for(i=0;i<50;i++);
  131.             }
  132.      }
  133.      P0=0x20;
  134.     if(H8==0)
  135.      {
  136.             for(a=0;a<t;a++)    //调节点亮时间
  137.             {
  138.             H8=1;
  139.             for(i=0;i<15;i++);  //调节亮度高低
  140.             H9=1;
  141.             for(i=0;i<1;i++);  //调节亮度高低
  142.             H8=0;
  143.             H9=0;
  144.             for(i=0;i<50;i++);
  145.             }
  146.         }
  147.      P0=0x10;
  148.     if(H7==0)
  149.      {
  150.             for(a=0;a<t;a++)    //调节点亮时间
  151.             {
  152.             H7=1;
  153.             for(i=0;i<15;i++);  //调节亮度高低
  154.             H8=1;
  155.             for(i=0;i<1;i++);  //调节亮度高低
  156.             H7=0;
  157.             H8=0;
  158.             for(i=0;i<50;i++);
  159.             }
  160.         }
  161.      P0=0x08;
  162.     if(H6==0)
  163.      {
  164.             for(a=0;a<t;a++)    //调节点亮时间
  165.             {
  166.             H6=1;
  167.             for(i=0;i<15;i++);  //调节亮度高低
  168.             H7=1;
  169.             for(i=0;i<1;i++);  //调节亮度高低
  170.             H6=0;
  171.             H7=0;
  172.             for(i=0;i<50;i++);
  173.             }
  174.         }
  175.      P0=0x04;
  176.      if(H5==0)
  177.      {
  178.             for(a=0;a<t;a++)    //调节点亮时间
  179.             {
  180.             H5=1;
  181.             for(i=0;i<15;i++);  //调节亮度高低
  182.             H6=1;
  183.             for(i=0;i<1;i++);  //调节亮度高低
  184.             H5=0;
  185.             H6=0;
  186.             for(i=0;i<50;i++);
  187.             }
  188.         }
  189.      P0=0x02;
  190.      if(H4==0)
  191.      {
  192.             for(a=0;a<t;a++)    //调节点亮时间
  193.             {
  194.             H4=1;
  195.             for(i=0;i<15;i++);  //调节亮度高低
  196.             H5=1;
  197.             for(i=0;i<1;i++);  //调节亮度高低
  198.             H4=0;
  199.             H5=0;
  200.             for(i=0;i <50;i++);
  201.             }
  202.         }
  203.      P0=0x01;
  204.      if(H3==0)
  205.      {
  206.             for(a=0;a<t;a++)    //调节点亮时间
  207.             {
  208.             H3=1;
  209.             for(i=0;i<15;i++);  //调节亮度高低
  210.             H4=1;
  211.             for(i=0;i<1;i++);  //调节亮度高低
  212.             H3=0;
  213.             H4=0;
  214.             for(i=0;i<50;i++);
  215.             }
  216.         }
  217.      P0=0x00;H1=1;
  218.      if(H2==0)
  219.      {
  220.             for(a=0;a<t;a++)    //调节点亮时间
  221.             {
  222.             H2=1;
  223.             for(i=0;i<15;i++);  //调节亮度高低
  224.             H3=1;
  225.             for(i=0;i<1;i++);  //调节亮度高低
  226.             H2=0;
  227.             H3=0;
  228.             for(i=0;i<50;i++);
  229.             }
  230.         }
  231.     P0=0x00;H1=0;
  232. }
  233. /****************************************************************************/
  234. yxzy()  //左移函数
  235. {
  236.      P0=0x00;H1=1;
  237.      delay(5000);
  238.      P0=0x01;H1=0;
  239.      if(H1==0)
  240.      {
  241.             for(a=0;a<t;a++)    //调节点亮时间
  242.             {
  243.             H1=1;
  244.             for(i=0;i<10;i++);  //调节亮度高低
  245.             H1=0;
  246.             for(i=0;i<50;i++);
  247.             }
  248.     }
  249.     P0=0x02;H1=0;
  250.      if(H2==0)
  251.      {
  252.             for(a=0;a<t;a++)    //调节点亮时间
  253.             {
  254.             H2=1;
  255.             for(i=0;i<15;i++);  //调节亮度高低
  256.             H1=1;
  257.             for(i=0;i<1;i++);  //调节亮度高低
  258.             H2=0;
  259.             H1=0;
  260.             for(i=0;i<50;i++);
  261.             }
  262.     }        
  263.      P0=0x04;H1=0;
  264.      if(H3==0)
  265.      {
  266.             for(a=0;a<t;a++)    //调节点亮时间
  267.             {
  268.             H3=1;
  269.             for(i=0;i<15;i++);  //调节亮度高低
  270.             H2=1;
  271.             for(i=0;i<1;i++);  //调节亮度高低
  272.             H3=0;
  273.             H2=0;
  274.             for(i=0;i<50;i++);
  275.             }
  276.         }
  277.      P0=0x08;
  278.      if(H4==0)
  279.      {
  280.             for(a=0;a<t;a++)    //调节点亮时间
  281.             {
  282.             H4=1;
  283.             for(i = 0; i < 15; i++);  //调节亮度高低
  284.             H3=1;
  285.             for(i=0;i<1;i++);  //调节亮度高低
  286.             H4=0;
  287.             H3=0;
  288.             for(i=0;i<50;i++);
  289.             }
  290.         }
  291.      P0=0x10;
  292.      if(H5==0)
  293.      {
  294.             for(a=0;a<t;a++)    //调节点亮时间
  295.             {
  296.             H5=1;
  297.             for(i=0;i<15;i++);  //调节亮度高低
  298.             H4=1;
  299.             for(i=0;i<1;i++);  //调节亮度高低
  300.             H5=0;
  301.             H4=0;
  302.             for(i=0;i<50;i++);
  303.             }
  304.         }
  305.      P0=0x20;
  306.      if(H6==0)
  307.      {
  308.             for(a=0;a<t;a++)    //调节点亮时间
  309.             {
  310.             H6=1;
  311.             for(i=0;i<15;i++);  //调节亮度高低
  312.             H5=1;
  313.             for(i=0;i<1;i++);  //调节亮度高低
  314.             H6=0;
  315.             H5=0;
  316.             for(i=0;i<50;i++);
  317.             }
  318.         }
  319.      P0=0x40;
  320.      if(H7==0)
  321.      {
  322.             for(a=0;a<t;a++)    //调节点亮时间
  323.             {
  324.             H7=1;
  325.             for(i=0;i<15;i++);  //调节亮度高低
  326.             H6=1;
  327.             for(i=0;i<1;i++);  //调节亮度高低
  328.             H7=0;
  329.             H6=0;
  330.             for(i=0;i<50;i++);
  331.             }
  332.         }
  333.      P0=0x80;
  334.      if(H8==0)
  335.      {
  336.             for(a=0;a<t;a++)    //调节点亮时间
  337.             {
  338.             H8=1;
  339.             for(i=0;i<15;i++);  //调节亮度高低
  340.             H7=1;
  341.             for(i=0;i<1;i++);  //调节亮度高低
  342.             H8=0;
  343.             H7=0;
  344.             for(i=0;i<50;i++);
  345.             }
  346.         }
  347.      P0=0x00;
  348. }
  349. /*************************************************************************///主函数
  350. void main()
  351. {
  352.    InitTimer0();
  353.    while(1)
  354.      {
  355.      /*****************************************************///时钟模式
  356.         if(mode==0)        
  357.         {
  358.             ////////////////////////////////////////正常时钟模式
  359.              if(clock==0)    
  360.             {
  361.                 showL1();
  362.                 delay(300);
  363.             
  364.                 showL2();
  365.                 if(ms10<50) {H11=1;}  //秒灯闪烁
  366.                 delay(300);
  367.         
  368.                 showL3();
  369.                 delay(300);
  370.         
  371.                 showL4();
  372.                 delay(300);
  373.             }
  374.             ////////////////////////////////////////小时对时模式
  375.             if(clock==1)    
  376.             {
  377.                 showL1();    
  378.                 if(ms10>49) {L1=1;}    //闪烁显示第一列
  379.                 delay(300);
  380.             }
  381.             ////////////////////////////////////////分钟对时模式
  382.             if(clock==2)    
  383.             {
  384.                 showL2();    
  385.                 if(ms10>49) {L2=1;}    //闪烁显示第二列
  386.                 delay(300);
  387.         
  388.                 showL3();    
  389.                 if(ms10>49) {L3=1;}    //闪烁显示第三列
  390.                 delay(300);
  391.         
  392.                 showL4();    
  393.                 if(ms10>49) {L4=1;}    //闪烁显示第四列
  394.                 delay(300);    
  395.             }
  396.          }
  397.         /***************************************************///灯光模式
  398.         if(mode==1)        
  399.         {
  400.             //////////////////////////////////////呼吸灯模式
  401.             if(light==0)    
  402.             {
  403.                 showHX();
  404.             }
  405.             //////////////////////////////////////游侠灯模式
  406.             if(light==1)    
  407.             {
  408.                 L1=0;L4=0;H10=0;H11=0;
  409.                 yxyy(); //游侠右移
  410.                 P0=0x00;H1=0;
  411.                 yxzy(); //游侠左移
  412.                 P0=0x00;H1=0;
  413.             }
  414.             ///////////////////////////////////////闪灯模式
  415.             if(light==2)    
  416.             {
  417.                 P0=0xff;P1=0xff;
  418.                 delay(s);
  419.                 W0;
  420.                 delay(s);
  421.                 
  422.             }
  423.         }
  424.         /**************************************/
  425.           if(!K1)                    //模式切换键
  426.         {
  427.             delay(3000);
  428.             if(!K1)  //K1消抖
  429.               {    a=0;
  430.                 while(!K1)        //K1按下后开始累加a,直到松开K1
  431.                 {
  432.                     a++;
  433.                     delay(1000);
  434.                 }
  435.                 if(a>59)
  436.                 {
  437.                     mode++;        //长按切换主模式(时钟模式和灯光模式)
  438.                     if(mode>1)
  439.                     {mode=0;}                    
  440.                 }
  441.                 if(a<60)            //短按切换各主模式下的子模式
  442.                 {
  443.                     if(mode==0)
  444.                     {
  445.                           clock++;
  446.                            if(clock>2)
  447.                         {clock=0;}
  448.                     }
  449.                     if(mode==1)
  450.                     {
  451.                         light++;
  452.                         if(light>2)
  453.                         {light=0;}
  454.                     }
  455.                 }
  456.             }
  457.           }
  458.         /****************************************/
  459.          if(!K2)                    //clock1和clock2对时
  460.         {
  461.             delay(3000);
  462.             if(!K2)  //K2消抖
  463.               {
  464.                 if(mode==0)
  465.                 {
  466.                        if(clock==0)
  467.                        {}
  468.                        if(clock==1)        //调小时
  469.                        {hh++;
  470.                            if(hh>23)
  471.                            {hh=0;}
  472.                     delay(26000);        //延时以确定短按一次
  473.                        }
  474.                        if(clock==2)        //调分钟
  475.                        {mm++;ss=0;ms10=0;
  476.                            if(mm>59)
  477.                            {mm=0;}
  478.                        delay(26000);        //延时以确定短按一次
  479.                        }
  480.                   }
  481.                 if(mode==1)
  482.                 {
  483.                     ////////////////////////////呼吸灯三级调速
  484.                     if(light==0)
  485.                     {CYCLE=CYCLE-150;
  486.                         if(CYCLE<300)
  487.                         {CYCLE=600;}
  488.                     delay(26000);
  489.                     }
  490.                     ////////////////////////////游侠灯三级调速
  491.                     if(light==1)
  492.                     {t=t-125;
  493.                         if(t<100)
  494.                         {t=350;}
  495.                     delay(26000);
  496.                     }
  497.                     ////////////////////////////闪灯三级调速
  498.                     if(light==2)
  499.                     {s=s-10000;
  500.                         if(s<10000)
  501.                         {s=30000;}
  502.                     delay(26000);
  503.                     }
  504.                 }
  505.             }
  506.         }
  507.      }
  508. }
  509. void Timer0Interrupt() interrupt 1 //计时中断
  510. {
  511.     TH0=(65536-9990)/256;
  512.     TL0=(65536-9990)%256;
  513.     ms10++;
  514.     if(ms10>99)
  515.     {ms10=0;ss++;}
  516.     if(ss>59)
  517.     {ss=0;mm++;}
  518.     if(mm>59)
  519.     {mm=0;hh++;hhjs++;}
  520.     if(hh>23)
  521.     {hh=0;}
  522.     if(hhjs>4){ss++;hhjs=0;}//////////////校时程序,每4小时加快1s(只适用于我的单片机,即使同一电路板,不同的单片机此数值也可能不同。)
  523. }

多定义一个变量“hhjs=0”,在hh++后面加一个hhjs++,代码最后一个“}”前加入if(hhjs>4){ss++;hhjs=0;}//////////////校时程序,每4小时加快1s(只适用于我的单片机,即使同一电路板,不同的单片机此数值也可能不同。)




关键词: 自制     多功能     无数字     时钟     源代码     模式     时间     d    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]