这个心形流水灯的小制作可以通过一个按键切换花样,有两种声控模式,单片机用的STC12C5A60S2.
下面是视频效果:http://v.youku.com/v_show/id_XMjUyNTkzNzE2OA==.html
下面是实物图:
Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)
声控心形流水灯单片机源程序如下:
- /*********************************************************************************************
- 程序名:心形流水灯
- 编写人:刘金昊
- 编写时间:2016年7月第一版,2017年2月第二版
- 硬件支持:STC12C5A60S2
- 说明:低电平点亮
- /*********************************************************************************************/
- #include <STC12C5A60S2.h>
- #include <intrins.h>
- #define key_t 50 //按键去抖延时时间设置
- sbit key=P3 ^ 3; //花样切换按键定义
- unsigned char volatile a=1;//菜单标志位,用volatile声明防止编译器优化此变量,使其可在中断中改变
- sbit LED1=P0^0;
- sbit LED2=P0^1;
- sbit LED3=P0^2;
- sbit LED4=P0^3;
- sbit LED5=P0^4;
- sbit LED6=P0^5;
- sbit LED7=P0^6;
- sbit LED8=P0^7;
- sbit LED9=P2^7;
- sbit LED10=P2^6;
- sbit LED11=P2^5;
- sbit LED12=P2^4;
- sbit LED13=P2^3;
- sbit LED14=P2^2;
- sbit LED15=P2^1;
- sbit LED16=P2^0;
- sbit LED17=P4^0;
- sbit LED18=P4^1;
- sbit LED19=P4^2;
- sbit LED20=P4^3;
- sbit LED21=P4^4;
- sbit LED22=P4^5;
- sbit LED23=P4^6;
- sbit LED24=P4^7;
- /*********************************************************************************************/
- void delay (unsigned int a) //毫秒级CPU延时函数,用于花样闪烁延时
- {
- unsigned int i;
- while( a-- != 0)
- {
- for(i = 0; i < 600; i++);
- if(key==0)break;
- }
- }
- /*********************************************************************************************/
- void key_delay (unsigned int a) //按键去抖动延时函数
- {
- unsigned int i;
- while( a-- != 0)
- {
- for(i = 0; i < 600; i++);
- }
- }
- /*********************************************************************************************/
- void pwm_delay(unsigned int t) //pwm专用延时函数
- {
- unsigned int tt;
- tt=10*t;
- while(--tt);
- }
- /*********************************************************************************************/
- void INT1(void) interrupt 2 using 3 //INT1中断函数
- {
- a++;
-
- if(a>13)
- {
- a=1;
- }
- }
- /*********************************************************************************************/
- void m1(void) //相邻两灯呼吸点亮
- {
- unsigned int i;
- unsigned char code led=0xaa,led1=0x55; //led首位不亮,led1首位亮
- for(i=1;i<400;i++)
- {
- if(key==0)break;
- P2=0xff;
- P0=0xff;
- P4=0xff;
- pwm_delay(i);
- P2=led1;
- P0=led;
- P4=led;
- pwm_delay(400-i);
- }
- P2=0xff;
- P0=0xff;
- P4=0xff;
- for(i=399;i>0;i--)
- {
- if(key==0)break;
- P2=0xff;
- P0=0xff;
- P4=0xff;
- pwm_delay(i);
- P2=led;
- P0=led1;
- P4=led1;
- pwm_delay(400-i);
- }
- P2=led;
- P0=led1;
- P4=led1;
- for(i=1;i<400;i++)
- {
- if(key==0)break;
- P2=0xff;
- P0=0xff;
- P4=0xff;
- pwm_delay(i);
- P2=led;
- P0=led1;
- P4=led1;
- pwm_delay(400-i);
- }
- P2=0xff;
- P0=0xff;
- P4=0xff;
- for(i=399;i>0;i--)
- {
- if(key==0){key_delay(key_t);if(key==0){a++;break;}}
- P2=0xff;
- P0=0xff;
- P4=0xff;
- pwm_delay(i);
- P2=led1;
- P0=led;
- P4=led;
- pwm_delay(400-i);
- }
- P2=led1;
- P0=led;
- P4=led;
- }
- /*********************************************************************************************/
- void m2(void) //单个led顺时针旋转
- {
- unsigned char code led[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //LED从低位往高位移
- unsigned char code led1[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; //LED从高位往低位移
- unsigned char i;
- for(i=0;i<=7;i++)
- {
- P0=led[i];
- delay(50);
- if(key==0)break;
- }
- P0=0xff;
- for(i=0;i<=7;i++)
- {
- P2=led1[i];
- delay(50);
- if(key==0)break;
- }
- P2=0xff;
- for(i=0;i<=7;i++)
- {
- P4=led[i];
- delay(50);
- if(key==0){key_delay(key_t);if(key==0){a++;break;}}
- }
- P4=0xff;
- }
- /*********************************************************************************************/
- void m3(void) //相邻两灯交替点亮流水效果
- {
- unsigned char code led=0xaa,led1=0x55; //led首位不亮,led1首位亮
- P2=led;
- P0=led1;
- P4=led1;
- delay(200);
- P2=led1;
- P0=led;
- P4=led;
- delay(200);
- if(key==0){key_delay(key_t);if(key==0)a++;}
- }
- /*********************************************************************************************/
- void m4(void) //对称上下点亮熄灭
- {
- unsigned char i;
- unsigned char code led[]={0xff,0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00},t=100; //由低位向高位点亮
- unsigned char code led1[]={0xff,0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x00}; //由高位向低位点亮
- unsigned char code led2[]={0x3e,0x1c,0x08,0x00}; //LED9~16自上到下点亮
- unsigned char code led3[]={0xf7,0xe3,0xc1,0x80,}; //LED9~16自下到上点亮
- P4=0xff;
- P2=0xff;
- P0=0xff;
- for(i=0;i<8;i++)
- {
- P0=led[i+1];
- P4=led1[i];
- delay(t);
- if(key==0)break;
- }
- P2=0x7f;
- P4=0x00;
- delay(t);
- for(i=0;i<4;i++)
- {
- P2=led2[i];
- delay(t);
- if(key==0)break;
- }
- for(i=0;i<8;i++)
- {
- P0=~led[i+1];
- P4=~led1[i];
- delay(t);
- if(key==0)break;
- }
- P2=~0x7f;
- P4=~0x00;
- delay(t);
- for(i=0;i<4;i++)
- {
- P2=~led2[i];
- delay(t);
- if(key==0)break;
- }
- for(i=0;i<4;i++)
- {
- P2=led3[i];
- delay(t);
- if(key==0)break;
- }
- P2=0x00;
- P4=0xfe;
- delay(t);
- for(i=0;i<8;i++)
- {
- P0=led1[i+1];
- P4=led[i+1];
- delay(t);
- if(key==0)break;
- }
- for(i=0;i<4;i++)
- {
- P2=~led3[i];
- delay(t);
- if(key==0)break;
- }
- P2=~0x00;
- P4=~0xfe;
- delay(t);
- for(i=0;i<8;i++)
- {
- P0=~led1[i+1];
- P4=~led[i+1];
- delay(t);
- if(key==0){key_delay(key_t);if(key==0){a++;break;}}
- }
- }
- /*********************************************************************************************/
- void m5(void) //顺时针逐个点亮熄灭
- {
- unsigned char code led[]={0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x0}; //LED由低位向高位点亮
- unsigned char code led1[]={0x7f,0x3f,0x1f,0xf,0x7,0x3,0x1,0x0}; //LED由高位向低位点亮
- unsigned char code led2[]={0x1,0x3,0x7,0xf,0x1f,0x3f,0x7f,0xff}; //LED由低位向高位熄灭
- unsigned char code led3[]={0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff}; //LED由高位向低位熄灭
- unsigned char code t=70;
- unsigned char i;
- for(i=0;i<=7;i++)
- {
- if(key==0)break;
- P0=led[i];
- delay(t);
- }
- for(i=0;i<=7;i++)
- {
- if(key==0)break;
- P2=led1[i];
- delay(t);
- }
- for(i=0;i<=7;i++)
- {
- if(key==0)break;
- P4=led[i];
- delay(t);
- }
- delay(t);
- for(i=0;i<=7;i++)
- {
- if(key==0)break;
- P0=led2[i];
- delay(t);
- }
- for(i=0;i<=7;i++)
- {
- if(key==0)break;
- P2=led3[i];
- delay(t);
- }
- for(i=0;i<=7;i++)
- {
- if(key==0){key_delay(key_t);if(key==0){a++;break;}}
- P4=led2[i];
- delay(t);
- }
- }
- /*********************************************************************************************/
- void m6(void) //整个心形呼吸灯闪烁
- {
- unsigned int i;
- P0=0xff;
- P2=0xff;
- P4=0xff;
- delay(100);
- for(i=1;i<500;i++)
- {
- if(key==0)break;
- P0=0x0;
- P2=0x0;
- P4=0x0;
- pwm_delay(i);
- P0=0xff;
- P2=0xff;
- P4=0xff;
- pwm_delay(500-i);
- }
- P0=0x0;
- P2=0x0;
- P4=0x0;
- delay(50);
- for(i=499;i>0;i--)
- {
- if(key==0){key_delay(key_t);if(key==0){a++;break;}}
- P0=0x0;
- P2=0x0;
- P4=0x0;
- pwm_delay(i);
- P0=0xff;
- P2=0xff;
- P4=0xff;
- pwm_delay(500-i);
- }
- }
- /*********************************************************************************************/
- void m7(void) //不规则点亮熄灭
- {
- unsigned char code t=500;
- P4=0xff;
- P2=0xff;
- P0=0xff;
- LED18=0;
- delay(t);
- LED9=0;
- delay(t);
- LED11=0;
- delay(t);
- LED3=0;
- delay(t);
- LED17=0;
- delay(t);
- LED13=0;
- delay(t);
- LED20=0;
- delay(t);
- LED6=0;
- delay(t);
- LED15=0;
- delay(t);
- LED23=0;
- delay(t);
- LED1=0;
- delay(t);
- LED10=0;
- delay(t);
- LED2=0;
- delay(t);
- LED19=0;
- delay(t);
- LED4=0;
- delay(t);
- LED21=0;
- delay(t);
- LED14=0;
- delay(t);
- LED8=0;
- delay(t);
- LED24=0;
- delay(t);
- LED7=0;
- delay(t);
- LED12=0;
- delay(t);
- LED5=0;
- delay(t);
- LED22=0;
- delay(t);
- LED16=0;
- delay(1500);
-
- LED14=1;
- delay(t);
- LED2=1;
- delay(t);
- LED10=1;
- delay(t);
- LED4=1;
- delay(t);
- LED5=1;
- delay(t);
- LED16=1;
- delay(t);
- LED24=1;
- delay(t);
- LED8=1;
- delay(t);
- LED13=1;
- delay(t);
- LED21=1;
- delay(t);
- LED12=1;
- delay(t);
- LED19=1;
- delay(t);
- LED1=1;
- delay(t);
- LED23=1;
- delay(t);
- LED9=1;
- delay(t);
- LED18=1;
- delay(t);
- LED7=1;
- delay(t);
- LED20=1;
- delay(t);
- LED15=1;
- delay(t);
- LED6=1;
- delay(t);
- LED22=1;
- delay(t);
- LED3=1;
- delay(t);
- LED11=1;
- delay(t);
- LED17=1;
- delay(1000);
- if(key==0){key_delay(key_t);if(key==0)a++;}
- }
- /*********************************************************************************************/
- void m8(void) //整个心形闪动 慢
- {
- P0=0x0;
- P2=0x0;
- P4=0x0;
- delay(200);
- P0=0xff;
- P2=0xff;
- P4=0xff;
- delay(200);
- if(key==0){key_delay(key_t);if(key==0)a++;}
- }
- /*********************************************************************************************/
- void m9(void) //三个LED顺时针旋转 慢
- {
- unsigned char code led[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//LED从低位往高位移
- unsigned char code led1[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//LED从高位往低位移
- unsigned char i;
-
- for(i=0;i<=7;i++)
- {
- P0=led[i];
- P2=led1[i];
- P4=led[i];
- delay(50);
- if(key==0){key_delay(key_t);if(key==0){a++;break;}}
- }
- }
- /*********************************************************************************************/
- void m10(void) //三个LED顺时针旋转 快
- {
- unsigned char code led[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//LED从低位往高位移
- unsigned char code led1[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//LED从高位往低位移
- unsigned char i;
-
- for(i=0;i<=7;i++)
- {
- P0=led[i];
- P2=led1[i];
- P4=led[i];
- delay(15);
- if(key==0){key_delay(key_t);if(key==0){a++;break;}}
- }
- }
- /*********************************************************************************************/
- void m11(void) //心形长亮
- {
- P4=0x0;
- P2=0x0;
- P0=0x0;
- if(key==0){key_delay(key_t);if(key==0)a++;}
- }
- /*********************************************************************************************/
- void ADC_init (unsigned char CHA) //8位A/D转换初始化函数
- {
- unsigned char AD_FIN=0; //存储A/D转换标志
- CHA &= 0x07; //选择ADC的8个接口中的一个(0000 0111 清0高5位)
- ADC_CONTR = 0x40; //ADC转换的速度(0XX0 0000 其中XX控制速度,请根据数据手册设置)
- _nop_();
- ADC_CONTR |= CHA; //选择A/D当前通道
- _nop_();
- ADC_CONTR |= 0x80; //启动A/D电源
- key_delay(1); //使输入电压达到稳定(1ms即可)
- }
- /**********************************************************************************************/
- unsigned char ADC (void) //8位A/D转换函数
- {
- unsigned char AD_FIN=0; //存储A/D转换标志
- ADC_CONTR |= 0x08; //启动A/D转换(0000 1000 令ADCS = 1)
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- while (AD_FIN ==0) //等待A/D转换结束
- {
- AD_FIN = (ADC_CONTR & 0x10); //0001 0000测试A/D转换结束否
- }
- ADC_CONTR &= 0xE7; //1111 0111 清ADC_FLAG位, 关闭A/D转换,
- return (ADC_RES); //返回A/D转换结果(8位)
- }
- /*********************************************************************************************/
- void m13(void) //音乐节奏绚烂模式
- {
- unsigned char a,i;
- unsigned int pwm;
- if(key==0){key_delay(10);if(key==0)EA=1;} //按键检测,并打开总中断
-
- a=ADC();
-
- if(a>=0&&a<2){P0=0xff;P2=0xff;P4=0xff;}
- if(a>=2&&a<4)pwm=5;
- if(a>=4&&a<6)pwm=15;
- if(a>=6&&a<8)pwm=25;
- if(a>=8&&a<10)pwm=35;
- if(a>=10&&a<12)pwm=45;
- if(a>=12&&a<14)pwm=55;
- if(a>=14&&a<16)pwm=75;
- if(key==0){key_delay(10);if(key==0)EA=1;} //按键检测,并打开总中断
- if(a>=16&&a<18)pwm=100;
- if(a>=18&&a<20)pwm=150;
- if(a>=20&&a<22)pwm=200;
- if(a>=22&&a<24)pwm=250;
- if(a>=24&&a<26)pwm=350;
- if(a>=26&&a<28)pwm=450;
- if(a>=28&&a<30)pwm=550;
- if(a>=30)pwm=599;
- if(key==0){key_delay(10);if(key==0)EA=1;} //按键检测,并打开总中断
- if(a>=2)
- {
- for(i=0;i<2;i++)
- {
- if(key==0){key_delay(10);if(key==0)EA=1;} //按键检测,并打开总中断
- P0=0x0;
- P2=0x0;
- P4=0x0;
- pwm_delay(pwm);
- if(key==0){key_delay(10);if(key==0)EA=1;} //按键检测,并打开总中断
- P0=0xff;
- P2=0xff;
- P4=0xff;
- pwm_delay(600-pwm);
- }
- }
- EA=0;
- }
- /*********************************************************************************************/
- void m12() //音乐电平指示模式
- {
- unsigned int a;
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
心形流水灯.rar
(8.37 MB, 下载次数: 136)
|