数码之家

 找回密码
 立即注册
搜索
查看: 8597|回复: 47

[C51] stc15f104w 6LED蓝色萤火虫

[复制链接]
发表于 2020-2-8 20:13:26 | 显示全部楼层 |阅读模式

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

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

x
平时看到的萤火虫大多是黄绿色的
timg (2).jpg
但还有一种萤火虫,蓝色的。
timg.jpg
u=2614420400,1707533523&fm=26&gp=0.jpg
是不是觉得蓝色的萤火虫更好看?
那就用单片机制作一个。
用stc15f104w 8脚单片机来做一个6led蓝色萤火虫瓶。当然也可以用同样用这个单片机,采用查理复用来实现6个脚驱动更多led,但编程更麻烦。也可以用stc15w204s 16脚封装来做,那个单片机宽电压,就比stc15f104w贵两毛钱。
接线就是6个i/o 口接led正极,负极都接地,不用限流二极管,因为上拉最多10mA,led受得了。如果觉得暗,自己在程序里改推挽输出,强上拉20mA,要加限流电阻
下面开始制作
IMG_20190922_102522.jpg
准备漆包线和led
IMG_20190922_165524.jpg
贴片发光二极管焊在漆包线上
IMG_20190922_165532.jpg
焊6个
IMG_20190922_165601.jpg
一小块洞洞板,上面一个8pin芯片座
IMG_20191117_171923.jpg
焊上led
IMG_20191117_171937.jpg
背面
IMG_20191117_172123.jpg
找一个果酱玻璃瓶
IMG_20191117_172135.jpg
瓶盖贴胶带绝缘
IMG_20191117_172159.jpg
一截usb线
IMG_20191117_173155.jpg
瓶盖钻孔
IMG_20191117_174536.jpg
穿线
IMG_20191117_174936.jpg
固定
IMG_20191117_174944.jpg
里面
IMG_20191117_175848.jpg
装好,不错吧
IMG_20191117_175858.jpg
亮灯
IMG_20191117_175915.jpg
很省电 7mA
IMG_20191117_180104.jpg
关灯效果,不错吧。程序见下一楼

打赏

参与人数 3家元 +120 收起 理由
风间尘 + 20
人艰不拆了 + 20
家睦 + 80

查看全部打赏

 楼主| 发表于 2020-2-8 20:13:57 | 显示全部楼层
本帖最后由 游泳的鸟儿 于 2020-2-8 20:19 编辑

程序我写了一个,只是能用,非常繁琐,大家见效了。
用一个定时器产生一个小定时,到了就计数,然后调整占空比来实现呼吸,每个led频率不一样来实现不同步的随机
还有一个定时器用来切换模式,随便写了两个模式,各50秒左右,一个是单个亮,一个是6个各自频率呼吸


  1. #include <stc15.h>
  2. #define ufloat unsigned float
  3. #define uchar  unsigned char
  4. #define uint   unsigned int
  5. #define s0  200
  6. #define s1  130
  7. #define s2  145
  8. #define s3  174
  9. #define s4  160
  10. #define s5  190                 //设置每个呼吸时间长度

  11. uchar z0,z1,z2,z3,z4,z5, t0,t1,t2,t3,t4,t5;
  12. 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自减);
  13. int a=0,b=0,d;

  14. sbit led0 = P3^0;        //输出口;
  15. sbit led1 = P3^1;
  16. sbit led2 = P3^2;
  17. sbit led3 = P3^3;
  18. sbit led4 = P3^4;
  19. sbit led5 = P3^5;
  20. void init ();
  21. void display ();
  22. //***************1ms延时@12mhz***************
  23. void delay(unsigned int c){
  24.         unsigned int i;
  25.         while(c--!=0){
  26.                  for(i=0;i<600;i++);
  27.                 }
  28. }
  29. //***************延时程序**************************
  30. void delay1(unsigned int f){                         
  31.         while(f--!=0){
  32.         }
  33. }
  34. /*****************定时器2中断*******************/
  35. void timer2(void) interrupt 12
  36. {
  37.          T2H  = 0;
  38.          T2L  = 0;
  39.                  a++;
  40.                  if(a==10000){
  41.                     b++;
  42.                         a=0;
  43.                         if(b==2){b=0;}
  44.                 }
  45. }

  46. int main (void)
  47. {
  48.          init();
  49.          while (1)
  50.          {
  51.                  if(b==1){
  52.               ET0  = 1;                        //开定时器0中断;
  53.               display ();                        //演示模式1
  54.    }
  55.                  if(b==0){
  56.                       ET0  = 0;                        //关定时器0中断;                       //以下都是演示模式2
  57. for(d=0;d<1000;d++){
  58.         P3=0x01;
  59.         delay1(d);
  60.         P3=0x00;
  61.         delay1(1000-d);
  62. }
  63.        
  64. for(d=1000;d>0;d--){
  65.         P3=0x01;
  66.         delay1(d);
  67.         P3=0x00;
  68.         delay1(1000-d);
  69. }

  70. for(d=0;d<1000;d++){
  71.         P3=0x02;
  72.         delay1(d);
  73.         P3=0x00;
  74.         delay1(1000-d);
  75. }
  76.        
  77. for(d=1000;d>0;d--){
  78.         P3=0x02;
  79.         delay1(d);
  80.         P3=0x00;
  81.         delay1(1000-d);
  82. }

  83. for(d=0;d<1000;d++){
  84.         P3=0x04;
  85.         delay1(d);
  86.         P3=0x00;
  87.         delay1(1000-d);
  88. }
  89.        
  90. for(d=1000;d>0;d--){
  91.         P3=0x04;
  92.         delay1(d);
  93.         P3=0x00;
  94.         delay1(1000-d);
  95. }

  96. for(d=0;d<1000;d++){
  97.         P3=0x08;
  98.         delay1(d);
  99.         P3=0x00;
  100.         delay1(1000-d);
  101. }
  102.        
  103. for(d=1000;d>0;d--){
  104.         P3=0x08;
  105.         delay1(d);
  106.         P3=0x00;
  107.         delay1(1000-d);
  108. }

  109. for(d=0;d<1000;d++){
  110.         P3=0x10;
  111.         delay1(d);
  112.         P3=0x00;
  113.         delay1(1000-d);
  114. }
  115.        
  116. for(d=1000;d>0;d--){
  117.         P3=0x10;
  118.         delay1(d);
  119.         P3=0x00;
  120.         delay1(1000-d);
  121. }

  122. for(d=0;d<1000;d++){
  123.         P3=0x20;
  124.         delay1(d);
  125.         P3=0x00;
  126.         delay1(1000-d);
  127. }
  128.        
  129. for(d=1000;d>0;d--){
  130.         P3=0x20;
  131.         delay1(d);
  132.         P3=0x00;
  133.         delay1(1000-d);
  134. }

  135.                         }
  136.         }
  137.          return 0;
  138. }
  139. /**********----------**********/
  140. void init ()                                //初始化子函数
  141. {
  142.          TMOD = 0x01;                        //定时器0模式;
  143.          TH0  = (65536-50)/256;        //附高8位初值(0.05ms);          
  144.          TL0  = (65536-50)%256;        //附底8位初值(0.05ms);
  145.          EA   = 1;                        //开总中断;
  146.          ET0  = 1;                        //开定时器0中断;
  147.          TR0  = 1;                        //开启定时器0;
  148.             AUXR |= 0x04;                //定时器2时钟1T模式
  149.                 T2L = 0x00;                //设置定时2初值
  150.                 T2H = 0x00;                //设置定时2初值
  151.                 AUXR |= 0x10;                //定时器2开始计时
  152.                 IE2 |= 0x04;        //定时器2允许中断

  153. }
  154. /**********----------**********/
  155. void display ()                                //占空比子函数;
  156. {
  157. //*******************************led0*********************************//         
  158.                  if (flag1 == 1)                        //占空比标志起始;
  159.          {
  160.                  flag1 = 0;                        //复位占空比标志位;
  161.                  if (flag2 == 0)                //占空比自增标志;
  162.                  {
  163.                          z0++;
  164.                          if (z0 == s0)        //占空比最大值;
  165.                          {
  166.                                  flag2 = 1;        //占空比进入自减标志位开启;
  167.                          }
  168.                  }
  169.                  else                                //占空比自减开始;
  170.                  {
  171.                          z0--;
  172.                          if (z0 == 0)                //占空比最小值;
  173.                          {
  174.                                  flag2 = 0;        //占空比进入自增标志位开启;        
  175.                          }
  176.                  }
  177.          }
  178. //*******************************led1*********************************//
  179.             if (flag3 == 1)                        //占空比标志起始;
  180.          {
  181.                  flag3 = 0;                        //复位占空比标志位;
  182.                  if (flag4 == 0)                //占空比自增标志;
  183.                  {
  184.                          z1++;
  185.                          if (z1 == s1)        //占空比最大值;
  186.                          {
  187.                                  flag4 = 1;        //占空比进入自减标志位开启;
  188.                          }
  189.                  }
  190.                  else                                //占空比自减开始;
  191.                  {
  192.                          z1--;
  193.                          if (z1 == 0)                //占空比最小值;
  194.                          {
  195.                                  flag4 = 0;        //占空比进入自增标志位开启;        
  196.                          }
  197.                  }
  198.          }
  199. //*******************************led2*********************************//
  200.                   if (flag5 == 1)                        //占空比标志起始;
  201.          {
  202.                  flag5 = 0;                        //复位占空比标志位;
  203.                  if (flag6 == 0)                //占空比自增标志;
  204.                  {
  205.                          z2++;
  206.                          if (z2 == s2)        //占空比最大值;
  207.                          {
  208.                                  flag6 = 1;        //占空比进入自减标志位开启;
  209.                          }
  210.                  }
  211.                  else                                //占空比自减开始;
  212.                  {
  213.                          z2--;
  214.                          if (z2 == 0)                //占空比最小值;
  215.                          {
  216.                                  flag6 = 0;        //占空比进入自增标志位开启;        
  217.                          }
  218.                  }
  219.          }
  220. //*******************************led3*********************************//
  221.             if (flag7 == 1)                        //占空比标志起始;
  222.          {
  223.                  flag7 = 0;                        //复位占空比标志位;
  224.                  if (flag8 == 0)                //占空比自增标志;
  225.                  {
  226.                          z3++;
  227.                          if (z3 == s3)        //占空比最大值;
  228.                          {
  229.                                  flag8 = 1;        //占空比进入自减标志位开启;
  230.                          }
  231.                  }
  232.                  else                                //占空比自减开始;
  233.                  {
  234.                          z3--;
  235.                          if (z3 == 0)                //占空比最小值;
  236.                          {
  237.                                  flag8 = 0;        //占空比进入自增标志位开启;        
  238.                          }
  239.                  }
  240.          }
  241. //*******************************led4*********************************//
  242.         if (flag9 == 1)                        //占空比标志起始;
  243.          {
  244.                  flag9 = 0;                        //复位占空比标志位;
  245.                  if (flag10 == 0)                //占空比自增标志;
  246.                  {
  247.                          z4++;
  248.                          if (z4 == s4)        //占空比最大值;
  249.                          {
  250.                                  flag10 = 1;        //占空比进入自减标志位开启;
  251.                          }
  252.                  }
  253.                  else                                //占空比自减开始;
  254.                  {
  255.                          z4--;
  256.                          if (z4 == 0)                //占空比最小值;
  257.                          {
  258.                                  flag10 = 0;        //占空比进入自增标志位开启;        
  259.                          }
  260.                  }
  261.          }
  262. //*******************************led5*********************************//
  263.         if (flag11 == 1)                        //占空比标志起始;
  264.          {
  265.                  flag11 = 0;                        //复位占空比标志位;
  266.                  if (flag12 == 0)                //占空比自增标志;
  267.                  {
  268.                          z5++;
  269.                          if (z5 == s5)        //占空比最大值;
  270.                          {
  271.                                  flag12 = 1;        //占空比进入自减标志位开启;
  272.                          }
  273.                  }
  274.                  else                                //占空比自减开始;
  275.                  {
  276.                          z5--;
  277.                          if (z5 == 0)                //占空比最小值;
  278.                          {
  279.                                  flag12 = 0;        //占空比进入自增标志位开启;        
  280.                          }
  281.                  }
  282.          }

  283. }
  284. //*****************************定时器中断****************************//
  285. void timer0() interrupt 1
  286. {
  287.          TH0  = (65536-50)/256;
  288.          TL0  = (65536-50)%256;
  289.          t0++;
  290.                  t1++;
  291.                  t2++;
  292.                  t3++;
  293.                  t4++;
  294.                  t5++;

  295. //*******************************led0*********************************//
  296.          if (t0 <= z0)        //未到占空比数值输出为0;
  297.          {
  298.                  led0 = 1;
  299.          }
  300.          else
  301.          {
  302.                  led0 = 0;        //到达占空比数值输出为1;
  303.          }
  304.          if (t0 == s0)        //一旦到达总周期,动态计数器t0累加值清零,进入下个循环;
  305.          {
  306.                  t0    = 0;
  307.                  led0   = 0;
  308.                  flag1 = 1;        //占空比标志再次开启;
  309.          }        
  310. //***********************************led1**********************************//
  311.                  if (t1 <= z1)        //未到占空比数值输出为0;
  312.          {
  313.                  led1 = 1;
  314.          }
  315.          else
  316.          {
  317.                  led1 = 0;        //到达占空比数值输出为1;
  318.          }
  319.          if (t1 == s1)        //一旦到达总周期,动态计数器t0累加值清零,进入下个循环;
  320.          {
  321.                  t1    = 0;
  322.                  led1   = 0;
  323.                  flag3 = 1;        //占空比标志再次开启;
  324.          }
  325. //**********************************led2***********************************//                 
  326.                  if (t2 <= z2)        //未到占空比数值输出为0;
  327.          {
  328.                  led2 = 1;
  329.          }
  330.          else
  331.          {
  332.                  led2 = 0;        //到达占空比数值输出为1;
  333.          }
  334.          if (t2 == s2)        //一旦到达总周期,动态计数器t0累加值清零,进入下个循环;
  335.          {
  336.                  t2    = 0;
  337.                  led2   = 0;
  338.                  flag5 = 1;        //占空比标志再次开启;
  339.          }        
  340. //*********************************led3**************************************//
  341.                  if (t3 <= z3)        //未到占空比数值输出为0;
  342.          {
  343.                  led3 = 1;
  344.          }
  345.          else
  346.          {
  347.                  led3 = 0;        //到达占空比数值输出为1;
  348.          }
  349.          if (t3 == s3)        //一旦到达总周期,动态计数器t0累加值清零,进入下个循环;
  350.          {
  351.                  t3    = 0;
  352.                  led3   = 0;
  353.                  flag7 = 1;        //占空比标志再次开启;
  354.          }        
  355. //*******************************led4*********************************//
  356.                  if (t4 <= z4)        //未到占空比数值输出为0;
  357.          {
  358.                  led4 = 1;
  359.          }
  360.          else
  361.          {
  362.                  led4 = 0;        //到达占空比数值输出为1;
  363.          }
  364.          if (t4 == s4)        //一旦到达总周期,动态计数器t0累加值清零,进入下个循环;
  365.          {
  366.                  t4    = 0;
  367.                  led4   = 0;
  368.                  flag9 = 1;        //占空比标志再次开启;
  369.          }        


  370. //*******************************led5*********************************//
  371.                  if (t5 <= z5)        //未到占空比数值输出为0;
  372.          {
  373.                  led5 = 1;
  374.          }
  375.          else
  376.          {
  377.                  led5 = 0;        //到达占空比数值输出为1;
  378.          }
  379.          if (t5 == s5)        //一旦到达总周期,动态计数器t0累加值清零,进入下个循环;
  380.          {
  381.                  t5    = 0;
  382.                  led5   = 0;
  383.                  flag11 = 1;        //占空比标志再次开启;
  384.          }        
  385.       
  386. }
复制代码


打赏

参与人数 2家元 +32 收起 理由
jf201006 + 12 謝謝分享
人艰不拆了 + 20

查看全部打赏

回复 支持 4 反对 0

使用道具 举报

发表于 2020-2-8 23:11:13 | 显示全部楼层
断断续续学了十年了  ,  08年买的锐志51开发板,到现在还只是会点灯 ,    可能跟我只有初中学历有关吧 :lol::lol::lol::lol::lol:
回复 支持 6 反对 1

使用道具 举报

发表于 2020-2-8 23:11:31 来自手机浏览器 | 显示全部楼层
没有用老干妈的瓶子,差评:lol:
回复 支持 反对

使用道具 举报

发表于 2020-2-9 00:24:49 | 显示全部楼层
有意思,电路呢?
回复 支持 反对

使用道具 举报

发表于 2020-2-9 06:15:45 来自手机浏览器 | 显示全部楼层
游泳的鸟儿 发表于 2020-2-8 20:13
程序我写了一个,只是能用,非常繁琐,大家见效了。
用一个定时器产生一个小定时,到了就计数,然后调整占 ...

牛掰,,谢谢分享,有空仿制一个
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-2-9 08:25:09 | 显示全部楼层
sonichy 发表于 2020-2-9 00:24
有意思,电路呢?

我上面描述了,8脚单片机vcc gnd接电源正负极,6个i/o口接6个led正极,负极统一接gnd
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-9 08:25:58 | 显示全部楼层
mckk520 发表于 2020-2-8 23:11
没有用老干妈的瓶子,差评

太辣,没吃那玩意
回复 支持 反对

使用道具 举报

发表于 2020-2-9 12:43:28 | 显示全部楼层
什么软件,怎么烧录的,说详细点,:loveliness:
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-9 13:43:09 | 显示全部楼层
人艰不拆了 发表于 2020-2-9 12:43
什么软件,怎么烧录的,说详细点,

keil4软件写程序,用stc-isp软件烧录,用usb转ttl连接单片机烧写
回复 支持 反对

使用道具 举报

发表于 2020-2-9 13:43:35 | 显示全部楼层
游泳的鸟儿 发表于 2020-2-9 13:43
keil4软件写程序,用stc-isp软件烧录,用usb转ttl连接单片机烧写

多谢,哈哈
回复 支持 反对

使用道具 举报

发表于 2020-2-10 11:02:23 | 显示全部楼层
不拍个视频供欣赏欣赏嘛:lol:
回复 支持 反对

使用道具 举报

发表于 2020-2-11 16:02:51 | 显示全部楼层
说起来,我手里STC的还不少,15w104,208,都有,就是没有心思搞,天天心里乱糟糟的
回复 支持 反对

使用道具 举报

发表于 2020-2-14 11:37:53 | 显示全部楼层
该录个视频看看效果:smile:
回复 支持 反对

使用道具 举报

发表于 2020-2-15 12:01:37 | 显示全部楼层
做的不错,学习了。
回复 支持 反对

使用道具 举报

发表于 2020-2-15 16:04:14 来自手机浏览器 | 显示全部楼层
236131948 发表于 2020-2-8 23:11
断断续续学了十年了  ,  08年买的锐志51开发板,到现在还只是会点灯 ,    可能跟我只有初中学历有关吧 :l ...

我也一样
回复 支持 反对

使用道具 举报

发表于 2020-4-29 11:49:07 来自手机浏览器 | 显示全部楼层
大神,,我想仿制一个  有什么方法可以驱动更多的灯吗
回复 支持 反对

使用道具 举报

发表于 2020-4-29 13:42:03 | 显示全部楼层
:praise:

线稍微粗了一点。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-29 15:05:50 | 显示全部楼层
社會忒墟僞 发表于 2020-4-29 11:49
大神,,我想仿制一个  有什么方法可以驱动更多的灯吗

换多脚单片机 什么14脚 20脚 40脚,或者用查理复用,不过那样编程比较麻烦
回复 支持 反对

使用道具 举报

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

本版积分规则

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

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2024-4-19 13:30 , Processed in 0.343201 second(s), 15 queries , Redis On.

Powered by Discuz!

© 2006-2023 smzj.net

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