平時看到的螢火蟲大多是黃綠色的
但還有一種螢火蟲,藍色的。
是不是覺得藍色的螢火蟲更好看?
那就用單片機制作一個。
用stc15f104w 8腳單片機來做一個6led藍色螢火蟲瓶。當然也可以用同樣用這個單片機,采用查理復用來實現6個腳驅動更多led,但編程更麻煩。也可以用stc15w204s 16腳封裝來做,那個單片機寬電壓,就比stc15f104w貴兩毛錢。
接線就是6個i/o 口接led正極,負極都接地,不用限流二極管,因為上拉最多10mA,led受得了。如果覺得暗,自己在程序里改推挽輸出,強上拉20mA,要加限流電阻
下面開始制作
準備漆包線
焊上藍色貼片led
焊6個
洞洞板上焊8pin芯片座
焊上led和燒寫程序的排針
背面
找一個果醬玻璃瓶
瓶蓋貼膠帶絕緣
找一截usb線
瓶蓋打孔
焊上
固定
里面
裝好,不錯吧
亮燈
挺省電的7mA
關燈效果
程序我寫了一個,只是能用,非常繁瑣,大家見效了。
用一個定時器產生一個小定時,到了就計數,然后調整占空比來實現呼吸,每個led頻率不一樣來實現不同步的隨機
還有一個定時器用來切換模式,隨便寫了兩個模式,各50秒左右,一個是單個亮,一個是6個各自頻率呼吸
- #include <stc15.h>
- #define ufloat unsigned float
- #define uchar unsigned char
- #define uint unsigned int
- #define s0 200
- #define s1 130
- #define s2 145
- #define s3 174
- #define s4 160
- #define s5 190 //設置每個呼吸時間長度
- uchar z0,z1,z2,z3,z4,z5, t0,t1,t2,t3,t4,t5;
- bit flag1, flag2,flag3,flag4,flag5,flag6,flag7,flag8,flag9,flag10,flag11,flag12; //flag1 3 5 7 9 11占空比標志位, flag2 4 6 8 10 12占空比方向標志位(0自增, 1自減);
- int a=0,b=0,d;
- sbit led0 = P3^0; //輸出口;
- sbit led1 = P3^1;
- sbit led2 = P3^2;
- sbit led3 = P3^3;
- sbit led4 = P3^4;
- sbit led5 = P3^5;
- void init ();
- void display ();
- //***************1ms延時@12mhz***************
- void delay(unsigned int c){
- unsigned int i;
- while(c--!=0){
- for(i=0;i<600;i++);
- }
- }
- //***************延時程序**************************
- void delay1(unsigned int f){
- while(f--!=0){
- }
- }
- /*****************定時器2中斷*******************/
- void timer2(void) interrupt 12
- {
- T2H = 0;
- T2L = 0;
- a++;
- if(a==10000){
- b++;
- a=0;
- if(b==2){b=0;}
- }
- }
- int main (void)
- {
- init();
- while (1)
- {
- if(b==1){
- ET0 = 1; //開定時器0中斷;
- display (); //演示模式1
- }
- if(b==0){
- ET0 = 0; //關定時器0中斷; //以下都是演示模式2
- for(d=0;d<1000;d++){
- P3=0x01;
- delay1(d);
- P3=0x00;
- delay1(1000-d);
- }
-
- for(d=1000;d>0;d--){
- P3=0x01;
- delay1(d);
- P3=0x00;
- delay1(1000-d);
- }
- for(d=0;d<1000;d++){
- P3=0x02;
- delay1(d);
- P3=0x00;
- delay1(1000-d);
- }
-
- for(d=1000;d>0;d--){
- P3=0x02;
- delay1(d);
- P3=0x00;
- delay1(1000-d);
- }
- for(d=0;d<1000;d++){
- P3=0x04;
- delay1(d);
- P3=0x00;
- delay1(1000-d);
- }
-
- for(d=1000;d>0;d--){
- P3=0x04;
- delay1(d);
- P3=0x00;
- delay1(1000-d);
- }
- for(d=0;d<1000;d++){
- P3=0x08;
- delay1(d);
- P3=0x00;
- delay1(1000-d);
- }
-
- for(d=1000;d>0;d--){
- P3=0x08;
- delay1(d);
- P3=0x00;
- delay1(1000-d);
- }
- for(d=0;d<1000;d++){
- P3=0x10;
- delay1(d);
- P3=0x00;
- delay1(1000-d);
- }
-
- for(d=1000;d>0;d--){
- P3=0x10;
- delay1(d);
- P3=0x00;
- delay1(1000-d);
- }
- for(d=0;d<1000;d++){
- P3=0x20;
- delay1(d);
- P3=0x00;
- delay1(1000-d);
- }
-
- for(d=1000;d>0;d--){
- P3=0x20;
- delay1(d);
- P3=0x00;
- delay1(1000-d);
- }
- }
- }
- return 0;
- }
- /**********----------**********/
- void init () //初始化子函數
- {
- TMOD = 0x01; //定時器0模式;
- TH0 = (65536-50)/256; //附高8位初值(0.05ms);
- TL0 = (65536-50)%256; //附底8位初值(0.05ms);
- EA = 1; //開總中斷;
- ET0 = 1; //開定時器0中斷;
- TR0 = 1; //開啟定時器0;
- AUXR |= 0x04; //定時器2時鐘1T模式
- T2L = 0x00; //設置定時2初值
- T2H = 0x00; //設置定時2初值
- AUXR |= 0x10; //定時器2開始計時
- IE2 |= 0x04; //定時器2允許中斷
- }
- /**********----------**********/
- void display () //占空比子函數;
- {
- //*******************************led0*********************************//
- if (flag1 == 1) //占空比標志起始;
- {
- flag1 = 0; //復位占空比標志位;
- if (flag2 == 0) //占空比自增標志;
- {
- z0++;
- if (z0 == s0) //占空比最大值;
- {
- flag2 = 1; //占空比進入自減標志位開啟;
- }
- }
- else //占空比自減開始;
- {
- z0--;
- if (z0 == 0) //占空比最小值;
- {
- flag2 = 0; //占空比進入自增標志位開啟;
- }
- }
- }
- //*******************************led1*********************************//
- if (flag3 == 1) //占空比標志起始;
- {
- flag3 = 0; //復位占空比標志位;
- if (flag4 == 0) //占空比自增標志;
- {
- z1++;
- if (z1 == s1) //占空比最大值;
- {
- flag4 = 1; //占空比進入自減標志位開啟;
- }
- }
- else //占空比自減開始;
- {
- z1--;
- if (z1 == 0) //占空比最小值;
- {
- flag4 = 0; //占空比進入自增標志位開啟;
- }
- }
- }
- //*******************************led2*********************************//
- if (flag5 == 1) //占空比標志起始;
- {
- flag5 = 0; //復位占空比標志位;
- if (flag6 == 0) //占空比自增標志;
- {
- z2++;
- if (z2 == s2) //占空比最大值;
- {
- flag6 = 1; //占空比進入自減標志位開啟;
- }
- }
- else //占空比自減開始;
- {
- z2--;
- if (z2 == 0) //占空比最小值;
- {
- flag6 = 0; //占空比進入自增標志位開啟;
- }
- }
- }
- //*******************************led3*********************************//
- if (flag7 == 1) //占空比標志起始;
- {
- flag7 = 0; //復位占空比標志位;
- if (flag8 == 0) //占空比自增標志;
- {
- z3++;
- if (z3 == s3) //占空比最大值;
- {
- flag8 = 1; //占空比進入自減標志位開啟;
- }
- }
- else //占空比自減開始;
- {
- z3--;
- if (z3 == 0) //占空比最小值;
- {
- flag8 = 0; //占空比進入自增標志位開啟;
- }
- }
- }
- //*******************************led4*********************************//
- if (flag9 == 1) //占空比標志起始;
- {
- flag9 = 0; //復位占空比標志位;
- if (flag10 == 0) //占空比自增標志;
- {
- z4++;
- if (z4 == s4) //占空比最大值;
- {
- flag10 = 1; //占空比進入自減標志位開啟;
- }
- }
- else //占空比自減開始;
- {
- z4--;
- if (z4 == 0) //占空比最小值;
- {
- flag10 = 0; //占空比進入自增標志位開啟;
- }
- }
- }
- //*******************************led5*********************************//
- if (flag11 == 1) //占空比標志起始;
- {
- flag11 = 0; //復位占空比標志位;
- if (flag12 == 0) //占空比自增標志;
- {
- z5++;
- if (z5 == s5) //占空比最大值;
- {
- flag12 = 1; //占空比進入自減標志位開啟;
- }
- }
- else //占空比自減開始;
- {
- z5--;
- if (z5 == 0) //占空比最小值;
- {
- flag12 = 0; //占空比進入自增標志位開啟;
- }
- }
- }
- }
- //*****************************定時器中斷****************************//
- void timer0() interrupt 1
- {
- TH0 = (65536-50)/256;
- TL0 = (65536-50)%256;
- t0++;
- t1++;
- t2++;
- t3++;
- t4++;
- t5++;
- //*******************************led0*********************************//
- if (t0 <= z0) //未到占空比數值輸出為0;
- {
- led0 = 1;
- }
- else
- {
- led0 = 0; //到達占空比數值輸出為1;
- }
- if (t0 == s0) //一旦到達總周期,動態計數器t0累加值清零,進入下個循環;
- {
- t0 = 0;
- led0 = 0;
- flag1 = 1; //占空比標志再次開啟;
- }
- //***********************************led1**********************************//
- if (t1 <= z1) //未到占空比數值輸出為0;
- {
- led1 = 1;
- }
- else
- {
- led1 = 0; //到達占空比數值輸出為1;
- }
- if (t1 == s1) //一旦到達總周期,動態計數器t0累加值清零,進入下個循環;
- {
- t1 = 0;
- led1 = 0;
- flag3 = 1; //占空比標志再次開啟;
- }
- //**********************************led2***********************************//
- if (t2 <= z2) //未到占空比數值輸出為0;
- {
- led2 = 1;
- }
- else
- {
- led2 = 0; //到達占空比數值輸出為1;
- }
- if (t2 == s2) //一旦到達總周期,動態計數器t0累加值清零,進入下個循環;
- {
- t2 = 0;
- led2 = 0;
- flag5 = 1; //占空比標志再次開啟;
- }
- //*********************************led3**************************************//
- if (t3 <= z3) //未到占空比數值輸出為0;
- {
- led3 = 1;
- }
- else
- {
- led3 = 0; //到達占空比數值輸出為1;
- }
- if (t3 == s3) //一旦到達總周期,動態計數器t0累加值清零,進入下個循環;
- {
- t3 = 0;
- led3 = 0;
- flag7 = 1; //占空比標志再次開啟;
- }
- //*******************************led4*********************************//
- if (t4 <= z4) //未到占空比數值輸出為0;
- {
- led4 = 1;
- }
- else
- {
- led4 = 0; //到達占空比數值輸出為1;
- }
- if (t4 == s4) //一旦到達總周期,動態計數器t0累加值清零,進入下個循環;
- {
- t4 = 0;
- led4 = 0;
- flag9 = 1; //占空比標志再次開啟;
- }
- //*******************************led5*********************************//
- if (t5 <= z5) //未到占空比數值輸出為0;
- {
- led5 = 1;
- }
- else
- {
- led5 = 0; //到達占空比數值輸出為1;
- }
- if (t5 == s5) //一旦到達總周期,動態計數器t0累加值清零,進入下個循環;
- {
- t5 = 0;
- led5 = 0;
- flag11 = 1; //占空比標志再次開啟;
- }
-
- }
復制代碼
|