這個心形流水燈的小制作可以通過一個按鍵切換花樣,有兩種聲控模式,單片機用的STC12C5A60S2.
下面是視頻效果:http://v.youku.com/v_show/id_XMjUyNTkzNzE2OA==.html
下面是實物圖:
0.png (733.15 KB, 下載次數: 101)
下載附件
2017-7-30 17:34 上傳
0.png (688.7 KB, 下載次數: 113)
下載附件
2017-7-30 17:34 上傳
Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)
0.png (30.47 KB, 下載次數: 136)
下載附件
2017-7-30 17:35 上傳
0.png (51.18 KB, 下載次數: 116)
下載附件
2017-7-30 17:35 上傳
0.png (41.13 KB, 下載次數: 116)
下載附件
2017-7-30 17:37 上傳
聲控心形流水燈單片機源程序如下:
- /*********************************************************************************************
- 程序名:心形流水燈
- 編寫人:劉金昊
- 編寫時間: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, 下載次數: 137)
2017-7-30 17:10 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|