找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4073|回复: 4
打印 上一主题 下一主题
收起左侧

stc15f104w单片机制作6LED蓝色萤火虫源程序

[复制链接]
跳转到指定楼层
楼主
平时看到的萤火虫大多是黄绿色的

但还有一种萤火虫,蓝色的。


是不是觉得蓝色的萤火虫更好看?
那就用单片机制作一个。
用stc15f104w 8脚单片机来做一个6led蓝色萤火虫瓶。当然也可以用同样用这个单片机,采用查理复用来实现6个脚驱动更多led,但编程更麻烦。也可以用stc15w204s 16脚封装来做,那个单片机宽电压,就比stc15f104w贵两毛钱。
接线就是6个i/o 口接led正极,负极都接地,不用限流二极管,因为上拉最多10mA,led受得了。如果觉得暗,自己在程序里改推挽输出,强上拉20mA,要加限流电阻
下面开始制作

准备漆包线

焊上蓝色贴片led

焊6个

洞洞板上焊8pin芯片座

焊上led和烧写程序的排针

背面

找一个果酱玻璃瓶

瓶盖贴胶带绝缘

找一截usb线

瓶盖打孔

焊上

固定

里面

装好,不错吧

亮灯

挺省电的7mA

关灯效果


程序我写了一个,只是能用,非常繁琐,大家见效了。
用一个定时器产生一个小定时,到了就计数,然后调整占空比来实现呼吸,每个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. }
复制代码



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:704640 发表于 2020-3-19 10:53 来自手机 | 只看该作者
谢谢分享,如果是摆成心形,父母生日可以送作生日礼物
回复

使用道具 举报

板凳
ID:377382 发表于 2020-4-5 12:02 | 只看该作者
太棒啦
回复

使用道具 举报

地板
ID:98446 发表于 2020-4-27 10:29 | 只看该作者
chenyucy72 发表于 2020-3-19 10:53
谢谢分享,如果是摆成心形,父母生日可以送作生日礼物

心形流水灯网上有很多人做,你可以看看,用40脚大单片机和32个led
回复

使用道具 举报

5#
ID:704585 发表于 2020-4-29 14:04 | 只看该作者
感谢楼主分享
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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