数码之家

 找回密码
 立即注册
搜索
查看: 2187|回复: 45

[综合] DIY 16路LED电子萤火虫(STC版/开源)

[复制链接]
发表于 2023-8-23 17:49:37 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册

x
这个是1年半前做的了,今天才想起来没发过,发上来。在http://bbs.mydigit.cn/read.php?tid=1445415 坛友的代码上适当改动,把6LED的增加到16LED,用贴片stc15w408as控制。

IMG_20220212_173425.jpg
IMG_20220212_190617.jpg
sop-20封装的单片机焊在转接板上

IMG_20220207_182730.jpg
0603的LED两头焊漆包线

IMG_20220207_183718.jpg
IMG_20220207_183755.jpg
焊16个,并点亮,确定每个都能亮

IMG_20220214_182848.jpg
准备microUSB

IMG_20220216_214914.jpg
木塞上给microUSB开口

IMG_20220217_174032.jpg
装入瓶中的效果

IMG_20220217_182933.jpg
IMG_20220217_183557.jpg
点亮

效果视频:
16led萤火虫_stc15w408as控制.mp4 (2.44 MB, 下载次数: 1)

下面是代码
  1. #include <STC15.H>                                                
  2. #define ONE_CYCLE_STEP        33   //led多了,该值要调小,不然频闪                         100 35MHZ                 33 11.0592MHZ
  3. #define        PORT1 P3        
  4. #define PORT2 P1
  5. #define        LED_CNT                16        //定义输出口的端口数1-8        4代表使用0-3口输出
  6. #define        SCRIPT_CNT        6        //定义脚本数

  7. //萤火虫结构
  8. struct Firefly{
  9.         unsigned int        brightness;                        //最大亮度值0-255
  10.         unsigned int        timeCell;                        //时间间隔0-65535
  11.         unsigned int        count;                                //运行控制变量:当前计数
  12.         unsigned char        bn;                                        //运行控制变量:当前亮度
  13. };

  14. //定义每个输出端口的执行脚本
  15. //每个端口将执行SCRIPT_CNT次,然后不断循环执行
  16. struct Firefly code fireFlyScript[][SCRIPT_CNT] = {
  17.                                                 {{150,500,0,0},{0,600,0,0},{100,700,0,0},{0,600,0,0},{50,400,0,0},{150,800,0,0}},                 //1
  18.                                                 {{0,300,0,0},{100,400,0,0},{0,700,0,0},{200,300,0,0},{0,700,0,0},{150,700,0,0}},                                 //2
  19.                                                 {{90,300,0,0},{0,400,0,0},{110,600,0,0},{0,1200,0,0},{100,400,0,0},{0,500,0,0}},                                 //3
  20.                                                 {{0,500,0,0},{0,300,0,0},{200,600,0,0},{0,1000,0,0},{100,1000,0,0},{0,300,0,0}},                 //4
  21.                                                 {{0,900,0,0},{130,600,0,0},{100,200,0,0},{0,1200,0,0},{80,500,0,0},{0,1000,0,0}},                         //5
  22.                                                 {{60,700,0,0},{150,600,0,0},{0,800,0,0},{0,1000,0,0},{100,200,0,0},{0,100,0,0}},                 //6
  23.                                                 {{0,600,0,0},{180,500,0,0},{110,200,0,0},{50,100,0,0},{0,600,0,0},{160,100,0,0}},                         //7
  24.                                                 {{0,750,0,0},{255,300,0,0},{150,200,0,0},{0,1000,0,0},{255,1500,0,0},{150,100,0,0}},                         //8


  25.                                                 {{0,600,0,0},{120,700,0,0},{115,800,0,0},{0,900,0,0},{90,300,0,0},{0,100,0,0}},                                         //9
  26.                                                 {{137,200,0,0},{0,500,0,0},{0,600,0,0},{130,600,0,0},{40,350,0,0},{0,1200,0,0}},                         //10
  27.                                                 {{113,600,0,0},{0,760,0,0},{90,534,0,0},{0,500,0,0},{128,500,0,0},{0,500,0,0}},                                 //11
  28.                                                 {{0,700,0,0},{0,500,0,0},{139,900,0},{0,500,0,0}, {60,700,0,0},{0,400,0,0}},                         //12
  29.                                                 {{0,700,0,0},{50,700,0,0},{60,400,0,0},{0,500,0,0},{40,800,0,0},{150,540,0,0}},                         //13
  30.                                             {{0,500,0,0},{65,700,0,0},{0,900,0,0},{30,800,0,0},{98,300,0,0},{130,600,0,0}},                         //14
  31.                                                 {{0,250,0,0},{148,600,0,0},{70,600,0,0},{0,900,0,0},{85,500,0,0},{0,1200,0,0}},                         //15
  32.                                                 {{80,100,0,0},{60,600,0,0},{0,800,0,0},{0,400,0,0},{116,1000,0,0},{135,900,0,0}}                         //16
  33.                                        
  34. };

  35. //定义LED_CNT只萤火虫
  36. struct Firefly fireFlies[LED_CNT];

  37. //每只萤火虫的脚本计数器
  38. unsigned char ffScript[LED_CNT];

  39. //预先计算好的余弦函数表,PWM输出模拟函数曲线效果更好
  40. unsigned char code cosValue[]={
  41.                                         0,0,0,0,0,0,0,0,1,1,1,2,2,3,3,4,4,5,6,6,7,8,
  42.                                         9,10,11,11,12,13,14,16,17,18,19,20,21,23,24,
  43.                                         25,27,28,29,31,32,34,35,37,39,40,42,44,45,47,
  44.                                         49,50,52,54,56,58,60,62,63,65,67,69,71,73,75,
  45.                                         77,80,82,84,86,88,90,92,94,97,99,101,103,105,
  46.                                         107,110,112,114,116,119,121,123,125,127,130,
  47.                                         132,134,136,139,141,143,145,148,150,152,154,
  48.                                         156,158,161,163,165,167,169,171,173,175,178,
  49.                                         180,182,184,186,188,190,191,193,195,197,199,
  50.                                         201,203,205,206,208,210,211,213,215,216,218,
  51.                                         220,221,223,224,226,227,228,230,231,232,234,
  52.                                         235,236,237,238,239,241,242,243,244,244,245,
  53.                                         246,247,248,249,249,250,251,251,252,252,253,
  54.                                         253,254,254,254,255,255,255,255,255,255,255,
  55.                                         255,255,255,255,255,255,255,255,254,254,254,
  56.                                         253,253,252,252,251,251,250,249,249,248,247,
  57.                                         246,245,244,244,243,242,241,239,238,237,236,
  58.                                         235,234,232,231,230,228,227,226,224,223,221,
  59.                                         220,218,216,215,213,211,210,208,206,205,203,
  60.                                         201,199,197,195,193,192,190,188,186,184,182,
  61.                                         180,178,175,173,171,169,167,165,163,161,158,
  62.                                         156,154,152,150,148,145,143,141,139,136,134,
  63.                                         132,130,128,125,123,121,119,116,114,112,110,
  64.                                         107,105,103,101,99,97,94,92,90,88,86,84,82,
  65.                                         80,77,75,73,71,69,67,65,64,62,60,58,56,54,52,
  66.                                         50,49,47,45,44,42,40,39,37,35,34,32,31,29,28,
  67.                                         27,25,24,23,21,20,19,18,17,16,14,13,12,11,11,
  68.                                         10,9,8,7,6,6,5,4,4,3,3,2,2,1,1,1,0,0,0,0,0,0,0,
  69.                                         0
  70.                                 };

  71. //计时器中断计数变量
  72. unsigned int time0count_0;

  73. /*
  74. //---------------------------------------
  75. //名称        :两组io口合成一组十六位io口
  76. //参数        :
  77. //返回        :
  78. //---------------------------------------
  79. void segment_out(unsigned int dat){
  80.         P3=dat&0x00ff;
  81.         P1=dat&0xff00;
  82. }
  83. */
  84. //---------------------------------------
  85. //名称        :定时器0中断服务程序
  86. //                :Timer0
  87. //参数        :
  88. //返回        :
  89. //---------------------------------------
  90. void Timer0(void) interrupt 1
  91. {                          
  92.         unsigned long cell;                //计算用临时变量
  93.         unsigned int i,p,h;


  94.         //一个周期结束,检查脚本以及下一个周期的占空比
  95.         if(++time0count_0>ONE_CYCLE_STEP)
  96.         {
  97.                 time0count_0 = 0;
  98.                 //N路信号分别处理
  99.                 for(i = 0;i<LED_CNT;i++)
  100.                 {
  101.                         //一个脚本执行完毕,装入下一个脚本
  102.                         if(++fireFlies[i].count>fireFlies[i].timeCell)
  103.                         {
  104.                                 ffScript[i]++;
  105.                                 ffScript[i] = ffScript[i] % SCRIPT_CNT;
  106.                                 fireFlies[i] = fireFlyScript[i][ffScript[i]];
  107.                         }
  108.                         //计算下一个周期的占空比和亮度
  109.                         cell = fireFlies[i].count;
  110.                         cell *=360;
  111.                         cell /= fireFlies[i].timeCell;
  112.                         fireFlies[i].bn = (cosValue[cell]*fireFlies[i].brightness)/255;
  113.                         //准备点亮某个LED
  114.                         p=1<<i;
  115.                         h=p;
  116.                         h=h>>8;
  117.                         //如果亮度值不为0则点亮
  118.                         if(fireFlies[i].bn != 0)
  119.                         {
  120.                                 PORT1 |= p;
  121.                                 PORT2 |= h;
  122.                         }
  123.                         else
  124.                         {
  125.                                 PORT1 &= ~p;
  126.                                 PORT2 &= ~h;
  127.                         }
  128.                 }
  129.         }
  130.         //每个输出口占空比达到后输出低电平关闭LED
  131.         for(i = 0; i<LED_CNT; i++)
  132.         {
  133.                 p=1<<i;
  134.                 h=p;
  135.                 h=h>>8;
  136.                 if(time0count_0==fireFlies[i].bn){
  137.                         PORT1 &= ~p;
  138.                         PORT2 &= ~h;
  139.                 }
  140.         }
  141. }

  142. void main()
  143. {
  144.         unsigned        i;

  145.         //关闭所有LED
  146.         PORT1=0;
  147.         PORT2=0;

  148.         //初始化所有萤火虫和执行脚本
  149.         for(i = 0; i<LED_CNT; i++)
  150.         {
  151.                 fireFlies[i] = fireFlyScript[i][0];
  152.                 ffScript[i] = 0;
  153.         }

  154.         //***定时器Timer0初始化*** 十六位自动重装
  155.         TMOD&=0xF0;            //将TMOD的低4位定时器0控制部分清零
  156.         TL0=0xE8;              //设置定时器0初值低8位
  157.         TH0=0xFF;              //设置定时器0初值高8位
  158.         TR0=1;                 //启动定时器0
  159.         ET0=1;                 //Timer0中断允许
  160.         
  161.         //***开全局中断设置****
  162.         //定时器Timer0设置了中断允许,此处要开全局中断
  163.         EA=1;                  //开全局中断
  164.         
  165.         while(1);               //死循环,单片机初始化后,将一直运行这个死循环
  166. }

复制代码


附件里是完整工程下载:

萤火虫16灯版.zip

45.97 KB, 下载次数: 3, 下载积分: 家元 -55

打赏

参与人数 4家元 +120 收起 理由
亲爱的混蛋 + 30
jf201006 + 30 謝謝分享
兔包公 + 30 以資鼓勵
zhkrid + 30 優秀文章

查看全部打赏

发表于 2023-8-23 18:31:50 | 显示全部楼层
不错。挺漂亮的
回复 支持 反对

使用道具 举报

发表于 2023-8-23 19:20:22 | 显示全部楼层
关灯后效果不错。
回复 支持 反对

使用道具 举报

发表于 2023-8-23 19:42:14 来自手机浏览器 | 显示全部楼层
本帖最后由 兔包公 于 2023-8-23 19:47 编辑

你这不能飞,我找找,见过油管有个老外做了个飞起来的,似乎是用zvc感应电的
Screenshot_20230823_194155.jpg

打赏

参与人数 2家元 +36 收起 理由
wska + 30
游泳的鸟儿 + 6 歡迎探討

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2023-8-23 20:02:25 | 显示全部楼层
手工牛批的要做个记号,有空了慢慢看看
回复 支持 反对

使用道具 举报

发表于 2023-8-23 20:29:28 | 显示全部楼层
感觉铜线用的有点粗

打赏

参与人数 1家元 +6 收起 理由
游泳的鸟儿 + 6 太细了在瓶中不好固定住

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2023-8-23 23:52:55 | 显示全部楼层
有规律点,好看
回复 支持 反对

使用道具 举报

发表于 2023-8-24 02:44:07 | 显示全部楼层
不错。挺漂亮的
回复 支持 反对

使用道具 举报

发表于 2023-8-24 07:35:30 | 显示全部楼层
建议加一个震动电机,随机震动
回复 支持 反对

使用道具 举报

发表于 2023-8-24 08:56:24 | 显示全部楼层
LED有些绿了,黄绿色是不是好些
回复 支持 反对

使用道具 举报

发表于 2023-8-24 10:27:24 | 显示全部楼层
不错,挺好玩的。
回复 支持 反对

使用道具 举报

发表于 2023-8-24 10:53:45 | 显示全部楼层
哈哈~羡慕动手能力强的大佬。。。
回复 支持 反对

使用道具 举报

发表于 2023-8-24 11:16:33 | 显示全部楼层
这个萤火虫在全黑的环境里怎么看着有点渗人!
回复 支持 反对

使用道具 举报

发表于 2023-8-24 12:03:11 | 显示全部楼层
挺漂亮的,软硬能手
回复 支持 反对

使用道具 举报

发表于 2023-8-24 12:31:35 | 显示全部楼层
有创意,感觉漆包线确实有点粗...
回复 支持 反对

使用道具 举报

发表于 2023-8-24 13:24:08 | 显示全部楼层
估计夜晚效果更漂亮!
回复 支持 反对

使用道具 举报

发表于 2023-8-24 14:33:52 | 显示全部楼层
效果不 错,挺漂 亮
回复 支持 反对

使用道具 举报

发表于 2023-8-24 14:55:47 | 显示全部楼层
做的漂亮,有才
回复 支持 反对

使用道具 举报

发表于 2023-8-24 15:15:09 | 显示全部楼层
创意不错,可惜就是玩一两次就没啥新鲜感了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2024-5-2 20:02 , Processed in 0.218400 second(s), 14 queries , Redis On.

Powered by Discuz!

© 2006-2023 smzj.net

快速回复 返回顶部 返回列表