平時看到的螢火蟲大多是黃綠色的
timg (2).jpg (131.78 KB, 下載次數: 69)
下載附件
2020-2-8 20:22 上傳
但還有一種螢火蟲,藍色的。
timg.jpg (25.99 KB, 下載次數: 62)
下載附件
2020-2-8 20:22 上傳
u=2614420400,1707533523&fm=26&gp=0.jpg (22.24 KB, 下載次數: 76)
下載附件
2020-2-8 20:22 上傳
是不是覺得藍色的螢火蟲更好看?
那就用單片機制作一個。
用stc15f104w 8腳單片機來做一個6led藍色螢火蟲瓶。當然也可以用同樣用這個單片機,采用查理復用來實現6個腳驅動更多led,但編程更麻煩。也可以用stc15w204s 16腳封裝來做,那個單片機寬電壓,就比stc15f104w貴兩毛錢。
接線就是6個i/o 口接led正極,負極都接地,不用限流二極管,因為上拉最多10mA,led受得了。如果覺得暗,自己在程序里改推挽輸出,強上拉20mA,要加限流電阻
下面開始制作
IMG_20190922_102522.jpg (2.44 MB, 下載次數: 63)
下載附件
2020-2-8 20:21 上傳
準備漆包線
IMG_20190922_165524.jpg (1.9 MB, 下載次數: 57)
下載附件
2020-2-8 20:21 上傳
焊上藍色貼片led
IMG_20190922_165532.jpg (3.91 MB, 下載次數: 60)
下載附件
2020-2-8 20:21 上傳
焊6個
IMG_20190922_165601.jpg (3.17 MB, 下載次數: 74)
下載附件
2020-2-8 20:21 上傳
洞洞板上焊8pin芯片座
IMG_20191117_171923.jpg (2.11 MB, 下載次數: 69)
下載附件
2020-2-8 20:21 上傳
焊上led和燒寫程序的排針
IMG_20191117_171937.jpg (2.27 MB, 下載次數: 65)
下載附件
2020-2-8 20:21 上傳
背面
IMG_20191117_172123.jpg (2.11 MB, 下載次數: 68)
下載附件
2020-2-8 20:21 上傳
找一個果醬玻璃瓶
IMG_20191117_172135.jpg (2.35 MB, 下載次數: 76)
下載附件
2020-2-8 20:21 上傳
瓶蓋貼膠帶絕緣
IMG_20191117_172159.jpg (2.43 MB, 下載次數: 79)
下載附件
2020-2-8 20:22 上傳
找一截usb線
IMG_20191117_173155.jpg (2.39 MB, 下載次數: 64)
下載附件
2020-2-8 20:22 上傳
瓶蓋打孔
IMG_20191117_174536.jpg (2.38 MB, 下載次數: 72)
下載附件
2020-2-8 20:22 上傳
焊上
IMG_20191117_174936.jpg (2.64 MB, 下載次數: 63)
下載附件
2020-2-8 20:22 上傳
固定
IMG_20191117_174944.jpg (2.4 MB, 下載次數: 74)
下載附件
2020-2-8 20:22 上傳
里面
IMG_20191117_175848.jpg (2.66 MB, 下載次數: 61)
下載附件
2020-2-8 20:22 上傳
裝好,不錯吧
IMG_20191117_175858.jpg (2.67 MB, 下載次數: 56)
下載附件
2020-2-8 20:22 上傳
亮燈
IMG_20191117_175915.jpg (2.77 MB, 下載次數: 63)
下載附件
2020-2-8 20:22 上傳
挺省電的7mA
IMG_20191117_180104.jpg (1.57 MB, 下載次數: 54)
下載附件
2020-2-8 20:22 上傳
關燈效果
程序我寫了一個,只是能用,非常繁瑣,大家見效了。
用一個定時器產生一個小定時,到了就計數,然后調整占空比來實現呼吸,每個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; //占空比標志再次開啟;
- }
-
- }
復制代碼
|