平时看到的萤火虫大多是黄绿色的
但还有一种萤火虫,蓝色的。
是不是觉得蓝色的萤火虫更好看?
那就用单片机制作一个。
用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; //占空比标志再次开启;
- }
-
- }
复制代码
|