找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9350|回复: 15
收起左侧

自己做的带声控的心形流水灯 带按键,有视频

  [复制链接]
ID:223405 发表于 2017-7-30 17:12 | 显示全部楼层 |阅读模式
这个心形流水灯的小制作可以通过一个按键切换花样,有两种声控模式,单片机用的STC12C5A60S2.

下面是视频效果:http://v.youku.com/v_show/id_XMjUyNTkzNzE2OA==.html

下面是实物图:
0.png 0.png

Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)
0.png 0.png

0.png

声控心形流水灯单片机源程序如下:
  1. /*********************************************************************************************
  2. 程序名:心形流水灯   
  3. 编写人:刘金昊    
  4. 编写时间:2016年7月第一版,2017年2月第二版  
  5. 硬件支持:STC12C5A60S2                                                                   
  6. 说明:低电平点亮
  7. /*********************************************************************************************/
  8. #include <STC12C5A60S2.h>
  9. #include <intrins.h>
  10. #define key_t  50         //按键去抖延时时间设置
  11. sbit key=P3 ^ 3;         //花样切换按键定义
  12. unsigned char volatile a=1;//菜单标志位,用volatile声明防止编译器优化此变量,使其可在中断中改变
  13. sbit LED1=P0^0;
  14. sbit LED2=P0^1;
  15. sbit LED3=P0^2;
  16. sbit LED4=P0^3;
  17. sbit LED5=P0^4;
  18. sbit LED6=P0^5;
  19. sbit LED7=P0^6;
  20. sbit LED8=P0^7;
  21. sbit LED9=P2^7;
  22. sbit LED10=P2^6;
  23. sbit LED11=P2^5;
  24. sbit LED12=P2^4;
  25. sbit LED13=P2^3;
  26. sbit LED14=P2^2;
  27. sbit LED15=P2^1;
  28. sbit LED16=P2^0;
  29. sbit LED17=P4^0;
  30. sbit LED18=P4^1;
  31. sbit LED19=P4^2;
  32. sbit LED20=P4^3;
  33. sbit LED21=P4^4;
  34. sbit LED22=P4^5;
  35. sbit LED23=P4^6;
  36. sbit LED24=P4^7;
  37. /*********************************************************************************************/
  38. void delay (unsigned int a)           //毫秒级CPU延时函数,用于花样闪烁延时
  39. {
  40.         unsigned int i;
  41.         while( a-- != 0)
  42.         {
  43.                 for(i = 0; i < 600; i++);
  44.                 if(key==0)break;
  45.         }
  46. }
  47. /*********************************************************************************************/
  48. void key_delay (unsigned int a)           //按键去抖动延时函数
  49. {
  50.         unsigned int i;
  51.         while( a-- != 0)
  52.         {
  53.                 for(i = 0; i < 600; i++);
  54.         }
  55. }
  56. /*********************************************************************************************/
  57. void pwm_delay(unsigned int t)    //pwm专用延时函数
  58. {
  59.     unsigned int tt;
  60.     tt=10*t;
  61.     while(--tt);
  62. }
  63. /*********************************************************************************************/
  64. void INT1(void) interrupt 2 using 3   //INT1中断函数
  65. {
  66.         a++;
  67.                                 
  68.         if(a>13)
  69.         {
  70.         a=1;
  71.         }                                                
  72. }
  73. /*********************************************************************************************/               
  74. void m1(void)    //相邻两灯呼吸点亮
  75. {
  76.     unsigned int i;
  77.         unsigned char code led=0xaa,led1=0x55;   //led首位不亮,led1首位亮

  78.     for(i=1;i<400;i++)
  79.         {
  80.         if(key==0)break;
  81.         P2=0xff;
  82.         P0=0xff;
  83.         P4=0xff;
  84.     pwm_delay(i);
  85.           P2=led1;
  86.         P0=led;
  87.         P4=led;
  88.     pwm_delay(400-i);
  89.     }
  90.     P2=0xff;
  91.         P0=0xff;
  92.         P4=0xff;
  93.         for(i=399;i>0;i--)
  94.         {
  95.         if(key==0)break;
  96.         P2=0xff;
  97.     P0=0xff;
  98.         P4=0xff;
  99.     pwm_delay(i);
  100.         P2=led;
  101.         P0=led1;
  102.         P4=led1;
  103.     pwm_delay(400-i);
  104.     }
  105.         P2=led;
  106.         P0=led1;
  107.         P4=led1;
  108.     for(i=1;i<400;i++)
  109.         {
  110.         if(key==0)break;
  111.         P2=0xff;
  112.         P0=0xff;
  113.         P4=0xff;
  114.     pwm_delay(i);
  115.           P2=led;
  116.         P0=led1;
  117.         P4=led1;
  118.     pwm_delay(400-i);
  119.     }
  120.         P2=0xff;
  121.         P0=0xff;
  122.         P4=0xff;
  123.     for(i=399;i>0;i--)
  124.         {
  125.         if(key==0){key_delay(key_t);if(key==0){a++;break;}}
  126.         P2=0xff;
  127.         P0=0xff;
  128.         P4=0xff;
  129.     pwm_delay(i);
  130.         P2=led1;
  131.         P0=led;
  132.         P4=led;
  133.     pwm_delay(400-i);
  134.     }
  135.         P2=led1;
  136.         P0=led;
  137.         P4=led;         
  138. }
  139. /*********************************************************************************************/                        
  140. void m2(void)    //单个led顺时针旋转
  141. {                          
  142.      unsigned char code led[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};   //LED从低位往高位移
  143.          unsigned char code led1[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};  //LED从高位往低位移
  144.          unsigned char i;

  145.          for(i=0;i<=7;i++)
  146.          {
  147.          P0=led[i];
  148.          delay(50);
  149.          if(key==0)break;
  150.          }
  151.          P0=0xff;   
  152.          for(i=0;i<=7;i++)
  153.          {         
  154.          P2=led1[i];
  155.          delay(50);
  156.          if(key==0)break;
  157.          }
  158.          P2=0xff;         
  159.          for(i=0;i<=7;i++)
  160.          {
  161.          P4=led[i];
  162.          delay(50);
  163.          if(key==0){key_delay(key_t);if(key==0){a++;break;}}
  164.          }
  165.          P4=0xff;               
  166. }
  167. /*********************************************************************************************/
  168. void m3(void)    //相邻两灯交替点亮流水效果
  169. {        
  170.      unsigned char code led=0xaa,led1=0x55;   //led首位不亮,led1首位亮

  171.          P2=led;
  172.          P0=led1;
  173.          P4=led1;
  174.          delay(200);
  175.          P2=led1;
  176.          P0=led;
  177.          P4=led;
  178.          delay(200);
  179.          if(key==0){key_delay(key_t);if(key==0)a++;}
  180. }
  181. /*********************************************************************************************/               
  182. void m4(void)    //对称上下点亮熄灭
  183. {        
  184.      unsigned char i;
  185.      unsigned char code led[]={0xff,0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00},t=100;           //由低位向高位点亮
  186.      unsigned char code led1[]={0xff,0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x00};           //由高位向低位点亮
  187.      unsigned char code led2[]={0x3e,0x1c,0x08,0x00};         //LED9~16自上到下点亮
  188.      unsigned char code led3[]={0xf7,0xe3,0xc1,0x80,};         //LED9~16自下到上点亮

  189.      P4=0xff;
  190.      P2=0xff;
  191.      P0=0xff;

  192.      for(i=0;i<8;i++)
  193.      {
  194.      P0=led[i+1];
  195.      P4=led1[i];
  196.      delay(t);
  197.      if(key==0)break;
  198.      }
  199.      P2=0x7f;
  200.      P4=0x00;
  201.      delay(t);
  202.      for(i=0;i<4;i++)
  203.      {
  204.      P2=led2[i];
  205.      delay(t);
  206.      if(key==0)break;
  207.      }
  208.      for(i=0;i<8;i++)
  209.      {
  210.      P0=~led[i+1];
  211.      P4=~led1[i];
  212.      delay(t);
  213.      if(key==0)break;
  214.      }
  215.      P2=~0x7f;
  216.      P4=~0x00;
  217.      delay(t);
  218.      for(i=0;i<4;i++)
  219.      {
  220.      P2=~led2[i];
  221.      delay(t);
  222.      if(key==0)break;
  223.      }

  224.      for(i=0;i<4;i++)
  225.      {
  226.      P2=led3[i];
  227.      delay(t);
  228.      if(key==0)break;
  229.      }
  230.      P2=0x00;
  231.      P4=0xfe;
  232.      delay(t);
  233.      for(i=0;i<8;i++)
  234.      {
  235.      P0=led1[i+1];
  236.      P4=led[i+1];
  237.      delay(t);
  238.      if(key==0)break;
  239.      }
  240.      for(i=0;i<4;i++)
  241.      {
  242.      P2=~led3[i];
  243.      delay(t);
  244.      if(key==0)break;
  245.      }
  246.      P2=~0x00;
  247.      P4=~0xfe;
  248.      delay(t);
  249.      for(i=0;i<8;i++)
  250.      {
  251.      P0=~led1[i+1];
  252.      P4=~led[i+1];
  253.      delay(t);
  254.      if(key==0){key_delay(key_t);if(key==0){a++;break;}}
  255.      }        
  256. }
  257. /*********************************************************************************************/
  258. void m5(void)     //顺时针逐个点亮熄灭
  259. {
  260.       unsigned char code led[]={0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x0};   //LED由低位向高位点亮
  261.           unsigned char code led1[]={0x7f,0x3f,0x1f,0xf,0x7,0x3,0x1,0x0};   //LED由高位向低位点亮
  262.           unsigned char code led2[]={0x1,0x3,0x7,0xf,0x1f,0x3f,0x7f,0xff};   //LED由低位向高位熄灭
  263.           unsigned char code led3[]={0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff};   //LED由高位向低位熄灭
  264.           unsigned char code t=70;
  265.           unsigned char i;

  266.           for(i=0;i<=7;i++)
  267.           {
  268.           if(key==0)break;
  269.           P0=led[i];
  270.           delay(t);
  271.           }
  272.           for(i=0;i<=7;i++)
  273.           {
  274.           if(key==0)break;
  275.           P2=led1[i];
  276.           delay(t);
  277.           }         
  278.           for(i=0;i<=7;i++)
  279.           {
  280.           if(key==0)break;
  281.           P4=led[i];
  282.           delay(t);
  283.           }
  284.           delay(t);
  285.           for(i=0;i<=7;i++)
  286.           {
  287.           if(key==0)break;
  288.           P0=led2[i];
  289.           delay(t);
  290.           }
  291.           for(i=0;i<=7;i++)
  292.           {
  293.           if(key==0)break;
  294.           P2=led3[i];
  295.           delay(t);
  296.           }
  297.           for(i=0;i<=7;i++)
  298.           {
  299.           if(key==0){key_delay(key_t);if(key==0){a++;break;}}
  300.           P4=led2[i];
  301.           delay(t);
  302.           }
  303. }
  304. /*********************************************************************************************/
  305. void m6(void)      //整个心形呼吸灯闪烁
  306. {
  307.     unsigned int i;
  308.         P0=0xff;
  309.         P2=0xff;
  310.         P4=0xff;
  311.         delay(100);
  312.     for(i=1;i<500;i++)
  313.         {
  314.         if(key==0)break;
  315.     P0=0x0;
  316.         P2=0x0;
  317.         P4=0x0;
  318.     pwm_delay(i);
  319.         P0=0xff;
  320.         P2=0xff;
  321.         P4=0xff;
  322.     pwm_delay(500-i);
  323.     }
  324.     P0=0x0;
  325.         P2=0x0;
  326.         P4=0x0;
  327.         delay(50);
  328.     for(i=499;i>0;i--)
  329.         {
  330.         if(key==0){key_delay(key_t);if(key==0){a++;break;}}
  331.     P0=0x0;
  332.         P2=0x0;
  333.         P4=0x0;
  334.     pwm_delay(i);
  335.         P0=0xff;
  336.         P2=0xff;
  337.         P4=0xff;
  338.     pwm_delay(500-i);
  339.     }
  340. }
  341. /*********************************************************************************************/
  342. void m7(void)    //不规则点亮熄灭
  343. {
  344.      unsigned char code t=500;

  345.      P4=0xff;
  346.      P2=0xff;
  347.      P0=0xff;

  348.      LED18=0;
  349.      delay(t);
  350.      LED9=0;
  351.      delay(t);
  352.      LED11=0;
  353.      delay(t);
  354.      LED3=0;
  355.      delay(t);
  356.      LED17=0;
  357.      delay(t);
  358.      LED13=0;
  359.      delay(t);
  360.      LED20=0;
  361.      delay(t);
  362.      LED6=0;
  363.      delay(t);                                
  364.      LED15=0;
  365.      delay(t);
  366.      LED23=0;
  367.      delay(t);
  368.      LED1=0;
  369.      delay(t);
  370.      LED10=0;
  371.      delay(t);
  372.      LED2=0;
  373.      delay(t);
  374.      LED19=0;
  375.      delay(t);
  376.      LED4=0;
  377.      delay(t);                                          
  378.      LED21=0;
  379.      delay(t);
  380.      LED14=0;
  381.      delay(t);
  382.      LED8=0;
  383.      delay(t);
  384.      LED24=0;
  385.      delay(t);         
  386.      LED7=0;
  387.      delay(t);           
  388.      LED12=0;
  389.      delay(t);                  
  390.      LED5=0;
  391.      delay(t);
  392.      LED22=0;
  393.      delay(t);
  394.      LED16=0;
  395.      delay(1500);

  396.      LED14=1;
  397.      delay(t);
  398.      LED2=1;
  399.      delay(t);           
  400.      LED10=1;
  401.      delay(t);                                                
  402.      LED4=1;
  403.      delay(t);
  404.      LED5=1;
  405.      delay(t);         
  406.      LED16=1;
  407.      delay(t);                        
  408.      LED24=1;
  409.      delay(t);                                          
  410.      LED8=1;
  411.      delay(t);                                    
  412.      LED13=1;
  413.      delay(t);                                                                                          
  414.      LED21=1;
  415.      delay(t);
  416.      LED12=1;
  417.      delay(t);                                            
  418.      LED19=1;
  419.      delay(t);               
  420.      LED1=1;
  421.      delay(t);                           
  422.      LED23=1;
  423.      delay(t);                                                                        
  424.      LED9=1;
  425.      delay(t);                                          
  426.      LED18=1;
  427.      delay(t);                                                                          
  428.      LED7=1;
  429.      delay(t);
  430.      LED20=1;
  431.      delay(t);
  432.      LED15=1;
  433.      delay(t);
  434.      LED6=1;
  435.      delay(t);
  436.      LED22=1;
  437.      delay(t);
  438.      LED3=1;
  439.      delay(t);
  440.      LED11=1;
  441.      delay(t);
  442.      LED17=1;
  443.      delay(1000);
  444.      if(key==0){key_delay(key_t);if(key==0)a++;}
  445. }
  446. /*********************************************************************************************/
  447. void m8(void)    //整个心形闪动   慢
  448. {
  449.      P0=0x0;
  450.          P2=0x0;
  451.          P4=0x0;
  452.          delay(200);         
  453.          P0=0xff;
  454.          P2=0xff;
  455.          P4=0xff;
  456.          delay(200);
  457.          if(key==0){key_delay(key_t);if(key==0)a++;}
  458. }
  459. /*********************************************************************************************/
  460. void m9(void)    //三个LED顺时针旋转                慢
  461. {
  462.       unsigned char code led[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//LED从低位往高位移
  463.           unsigned char code led1[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//LED从高位往低位移
  464.           unsigned char i;
  465.   
  466.           for(i=0;i<=7;i++)
  467.           {
  468.           P0=led[i];
  469.           P2=led1[i];
  470.           P4=led[i];
  471.           delay(50);
  472.           if(key==0){key_delay(key_t);if(key==0){a++;break;}}
  473.           }
  474. }
  475. /*********************************************************************************************/
  476. void m10(void)    //三个LED顺时针旋转                快
  477. {
  478.       unsigned char code led[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//LED从低位往高位移
  479.           unsigned char code led1[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//LED从高位往低位移
  480.           unsigned char i;

  481.           for(i=0;i<=7;i++)
  482.           {
  483.           P0=led[i];
  484.           P2=led1[i];
  485.           P4=led[i];
  486.           delay(15);
  487.           if(key==0){key_delay(key_t);if(key==0){a++;break;}}
  488.           }
  489. }
  490. /*********************************************************************************************/
  491. void m11(void)    //心形长亮
  492. {
  493.      P4=0x0;
  494.          P2=0x0;
  495.          P0=0x0;
  496.          if(key==0){key_delay(key_t);if(key==0)a++;}
  497. }
  498. /*********************************************************************************************/
  499. void ADC_init (unsigned char CHA)   //8位A/D转换初始化函数
  500. {
  501.         unsigned char AD_FIN=0; //存储A/D转换标志
  502.     CHA &= 0x07;            //选择ADC的8个接口中的一个(0000 0111 清0高5位)
  503.     ADC_CONTR = 0x40;                //ADC转换的速度(0XX0 0000 其中XX控制速度,请根据数据手册设置)
  504.     _nop_();
  505.     ADC_CONTR |= CHA;       //选择A/D当前通道
  506.     _nop_();
  507.     ADC_CONTR |= 0x80;      //启动A/D电源
  508.     key_delay(1);            //使输入电压达到稳定(1ms即可)
  509. }
  510. /**********************************************************************************************/
  511. unsigned char ADC (void)         //8位A/D转换函数
  512. {
  513.         unsigned char AD_FIN=0; //存储A/D转换标志
  514.     ADC_CONTR |= 0x08;      //启动A/D转换(0000 1000 令ADCS = 1)
  515.     _nop_();
  516.     _nop_();
  517.     _nop_();
  518.     _nop_();
  519.     while (AD_FIN ==0)          //等待A/D转换结束
  520.         {     
  521.         AD_FIN = (ADC_CONTR & 0x10); //0001 0000测试A/D转换结束否
  522.     }
  523.     ADC_CONTR &= 0xE7;      //1111 0111 清ADC_FLAG位, 关闭A/D转换,
  524.     return (ADC_RES);          //返回A/D转换结果(8位)
  525. }
  526. /*********************************************************************************************/
  527. void m13(void)                 //音乐节奏绚烂模式
  528. {
  529.     unsigned char a,i;
  530.     unsigned int pwm;

  531.     if(key==0){key_delay(10);if(key==0)EA=1;}   //按键检测,并打开总中断
  532.                                  
  533.         a=ADC();
  534.                         
  535.     if(a>=0&&a<2){P0=0xff;P2=0xff;P4=0xff;}
  536.     if(a>=2&&a<4)pwm=5;
  537.     if(a>=4&&a<6)pwm=15;
  538.     if(a>=6&&a<8)pwm=25;
  539.     if(a>=8&&a<10)pwm=35;
  540.     if(a>=10&&a<12)pwm=45;
  541.     if(a>=12&&a<14)pwm=55;
  542.     if(a>=14&&a<16)pwm=75;
  543.         if(key==0){key_delay(10);if(key==0)EA=1;}   //按键检测,并打开总中断
  544.     if(a>=16&&a<18)pwm=100;
  545.     if(a>=18&&a<20)pwm=150;
  546.     if(a>=20&&a<22)pwm=200;
  547.     if(a>=22&&a<24)pwm=250;
  548.         if(a>=24&&a<26)pwm=350;
  549.     if(a>=26&&a<28)pwm=450;
  550.         if(a>=28&&a<30)pwm=550;
  551.         if(a>=30)pwm=599;
  552.         if(key==0){key_delay(10);if(key==0)EA=1;}         //按键检测,并打开总中断

  553.         if(a>=2)
  554.         {
  555.         for(i=0;i<2;i++)
  556.         {
  557.         if(key==0){key_delay(10);if(key==0)EA=1;}   //按键检测,并打开总中断
  558.     P0=0x0;
  559.         P2=0x0;
  560.         P4=0x0;
  561.     pwm_delay(pwm);
  562.         if(key==0){key_delay(10);if(key==0)EA=1;}          //按键检测,并打开总中断
  563.         P0=0xff;
  564.         P2=0xff;
  565.         P4=0xff;
  566.     pwm_delay(600-pwm);               
  567.         }
  568.         }

  569.     EA=0;
  570. }
  571. /*********************************************************************************************/
  572. void m12()                   //音乐电平指示模式
  573. {
  574.     unsigned int  a;
  575. ……………………

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

所有资料51hei提供下载:
心形流水灯.rar (8.37 MB, 下载次数: 136)

评分

参与人数 3黑币 +15 收起 理由
jinmei1314 + 5
the-sunset + 5 很给力!有点想做了
炎炎火火 + 5 很给力!

查看全部评分

回复

使用道具 举报

ID:223405 发表于 2017-7-30 17:20 | 显示全部楼层
回复

使用道具 举报

ID:130345 发表于 2017-12-1 16:58 | 显示全部楼层
很感谢,重新学了12
回复

使用道具 举报

ID:29614 发表于 2018-4-24 20:44 | 显示全部楼层
学习学习,这资料不错
回复

使用道具 举报

ID:312589 发表于 2018-4-25 00:38 | 显示全部楼层
是双层板?
回复

使用道具 举报

ID:329974 发表于 2018-5-14 23:39 | 显示全部楼层
元件清单有没有?
回复

使用道具 举报

ID:330637 发表于 2018-5-20 19:00 | 显示全部楼层
感觉很棒!!!!
回复

使用道具 举报

ID:395810 发表于 2018-9-9 23:45 | 显示全部楼层
你好,可以给我看看你的元器件清单吗,我想做一个
回复

使用道具 举报

ID:413595 发表于 2018-10-22 17:42 | 显示全部楼层
多谢楼主分享!正好想做一个声控led灯,再配合蓝牙功放做成一个音箱。
回复

使用道具 举报

ID:377088 发表于 2019-5-1 19:23 | 显示全部楼层
很给力,挺不错的
回复

使用道具 举报

ID:514505 发表于 2019-6-23 18:19 来自手机 | 显示全部楼层
学习学习,这资料不错
回复

使用道具 举报

ID:202586 发表于 2019-7-8 16:44 | 显示全部楼层
谢谢分享    也想做个玩玩
回复

使用道具 举报

ID:202586 发表于 2019-7-9 16:04 来自手机 | 显示全部楼层
你好楼主我下载的源码编译不过有错误啊,能帮忙下吗?很想做一个玩下
回复

使用道具 举报

ID:204968 发表于 2019-7-30 11:36 | 显示全部楼层
都没有声音控制,怎么叫声控?
回复

使用道具 举报

ID:704585 发表于 2020-6-6 15:45 | 显示全部楼层
感谢楼主发分享
回复

使用道具 举报

ID:573789 发表于 2020-6-15 11:13 | 显示全部楼层
厉害了   值得学习
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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