找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1224|回复: 4
收起左侧

20灯WS2812控制板单片机代码 添加炫彩流动效果 原理图PCB

  [复制链接]
ID:124729 发表于 2023-10-19 15:26 | 显示全部楼层 |阅读模式
stc单片机控制WS2812灯

立创EDA标准版直接导入,无需解压。

GERBER文件可以直接打样。

灯珠摆放角度:灯珠绿色端为GND端,当PCB正放时,GND端在下边,VCC在上边

电路原理图如下:
WS2812-3332灯珠尺寸图.png
WS2812X20-3332灯条尺寸.JPG

单片机源程序如下:
  1. /*
  2. 代码内容:STC8单片机-WS2812控制板V1代码
  3. 增加一个灯效,炫彩流动。

  4. 代码效果:使用WS2812控制板,直接驱动WS2812模块。
  5. 1,控制板有两个按键,
  6. 按键单击,可以选择上/下一个效果
  7. 按键双击,可以选择上/下两个效果
  8. 按键三击,单片机直接复位(任意按键)
  9. 2,EEPROM保存效果序号
  10. 按键更改效果后,会把效果序号保存至EEPROM,
  11. 下次上电时,直接运行上次保存的效果。

  12. ***************特别注意****************
  13. 1,下载程序时,选择24M主频,同时复位引脚作为IO口(默认的设置就是)
  14. */


  15. #include "all.h"
  16. void GPIO_Init()//GPIO设置为准双向
  17. {
  18.         P0M0 = 0x00;
  19.         P0M1 = 0x00;
  20.         
  21.         P1M0 = 0x00;
  22.         P1M1 = 0x00;
  23.         
  24.         P2M0 = 0x00;        
  25.         P2M1 = 0x00;
  26.         
  27.         P3M0 = 0x00;
  28.         P3M1 = 0x00;
  29.         
  30.         P4M0 = 0x00;
  31.         P4M1 = 0x00;
  32.         
  33.         P5M0 = 0x00;
  34.         P5M1 = 0x00;
  35. }
  36. //定时器0中断,扫描按键
  37. void Timer0_Rountine(void)  interrupt 1
  38. {
  39.         KEY1_Scan();
  40.         KEY2_Scan();
  41. }
  42. void main()
  43. {
  44.         GPIO_Init();
  45.         Timer0_Init();
  46.         EEPROM_Init();
  47.         WS2812_RST();
  48.         color_code_init();
  49.         EA=1;
  50.         while(1)
  51.         {
  52.                 WS2812_main();
  53.         }
  54. }
复制代码
  1. #include "all.h"
  2. u8 xdata RGB_One[3];//存储一个灯的颜色
  3. u8 xdata color_code[COLOR_BUFFER_LEN][3];
  4. void color_code_init()
  5. {
  6.         u8 i;
  7.         u8 cnt=0;//记录当前写入位置
  8.         u8 k;
  9.         for(i=0;i<COLOR_BUFFER_LEN;i++)//第一步,全部写0
  10.         {
  11.                 color_code[i][0]=0;
  12.                 color_code[i][1]=0;
  13.                 color_code[i][2]=0;
  14.         }
  15.         //第二步,写RG,0-10,11个数据
  16.         for(i=0;i<=COLOR_LEN;i++)
  17.         {
  18.                 k=i*COLOR_ADD;
  19.                 color_code[cnt][0]=k;//G
  20.                 color_code[cnt][1]=COLOR_MAX-k;//R
  21.                 color_code[cnt][2]=0;//B
  22.                 cnt++;
  23.         }
  24.         //第二步,写GB,1-10,10个数据
  25.         for(i=1;i<=COLOR_LEN;i++)
  26.         {
  27.                 k=i*COLOR_ADD;
  28.                 color_code[cnt][0]=COLOR_MAX-k;//G
  29.                 color_code[cnt][1]=0;//R
  30.                 color_code[cnt][2]=k;//B
  31.                 cnt++;
  32.         }
  33.         //第三步,写BR,1-9,9个数据
  34.         for(i=1;i<COLOR_LEN;i++)
  35.         {
  36.                 k=i*COLOR_ADD;
  37.                 color_code[cnt][0]=0;//G
  38.                 color_code[cnt][1]=k;//R
  39.                 color_code[cnt][2]=COLOR_MAX-k;//B
  40.                 cnt++;
  41.         }
  42. }
  43. void Delay1ms()                //@24.000MHz
  44. {
  45.         unsigned char i, j;

  46.         _nop_();
  47.         i = 32;
  48.         j = 40;
  49.         do
  50.         {
  51.                 while (--j);
  52.         } while (--i);
  53. }
  54. void Delay_xms(u16 i)
  55. {
  56.         while(i--)
  57.         {
  58.                 Delay1ms();        
  59.         }
  60. }
  61. void WS2812_Write_RGB()
  62. {
  63.         u8 i,j,a;
  64.         EA=0;
  65.         for(j=0;j<3;j++)//每个灯需要传输次数
  66.         {
  67.                 a=RGB_One[j];
  68.                 for(i=0;i<8;i++)
  69.                 {
  70.                         WS2812_PIN=1;
  71.                         _nop_();_nop_();_nop_();_nop_();
  72.                         WS2812_PIN=(a&0x80);        
  73.                         _nop_();_nop_();_nop_();_nop_();
  74.                         _nop_();_nop_();_nop_();_nop_();
  75.                         a<<=1;
  76.                         WS2812_PIN=0;
  77.                 }
  78.                 WS2812_PIN=0;
  79.         }
  80.         EA=1;
  81. }
  82. void WS2812_RST()
  83. {
  84.         WS2812_PIN=0;
  85.         Delay1ms();
  86. }
  87. void WS2812_DIS_1()//效果1,颜色切换,所有LED颜色一样,共7种基本色
  88. {
  89.         static u8 j=1;
  90.         u16 i=0;
  91.         if(j&0X01) RGB_One[1]=10;else RGB_One[1]=0;
  92.         if(j&0X02) RGB_One[0]=10;else RGB_One[0]=0;
  93.         if(j&0X04) RGB_One[2]=10;else RGB_One[2]=0;
  94.         j%=7;
  95.         j++;
  96.         for(i=0;i<WS2812_NUM;i++)
  97.         WS2812_Write_RGB();
  98.         WS2812_RST();
  99.         Delay_xms(1000);
  100. }
  101. void WS2812_DIS_2()//效果2,单色追个点亮
  102. {
  103.         static u16 j=0;
  104.         u16 i;

  105.         j%=WS2812_NUM;
  106.         j++;

  107.         for(i=0;i<WS2812_NUM;i++)
  108.         {
  109.                 if(i<j)
  110.                 {
  111.                         RGB_One[1]=10;RGB_One[0]=0;RGB_One[2]=0;
  112.                         WS2812_Write_RGB();
  113.                 }
  114.                 else
  115.                 {
  116.                         RGB_One[1]=0;RGB_One[0]=0;RGB_One[2]=0;
  117.                         WS2812_Write_RGB();
  118.                 }
  119.         }
  120.         WS2812_RST();
  121.         Delay_xms(50);
  122. }
  123. void WS2812_DIS_3()//效果3,多个点亮流动
  124. {
  125.         static u16 j=0;
  126.         u16 i;

  127.         j%=WS2812_NUM;
  128.         j++;

  129.         for(i=0;i<WS2812_NUM;i++)
  130.         {
  131.                 if(i>j&&(i<j+10))
  132.                 {
  133.                         RGB_One[1]=00;RGB_One[0]=10;RGB_One[2]=0;
  134.                         WS2812_Write_RGB();
  135.                 }
  136.                 else
  137.                 {
  138.                         RGB_One[1]=0;RGB_One[0]=0;RGB_One[2]=0;
  139.                         WS2812_Write_RGB();
  140.                 }
  141.         }
  142.         
  143.         WS2812_RST();
  144.         Delay_xms(50);
  145. }
  146. void WS2812_DIS_4()//效果4,单色呼吸灯
  147. {
  148.         static u8 j=1;
  149.         u16 i=0;
  150.         
  151.         j%=100;
  152.         
  153.         if(j<50)//0-49
  154.         {
  155.                 RGB_One[1]=0;RGB_One[0]=0;RGB_One[2]=j;        
  156.         }
  157.         else//50-1
  158.         {
  159.                 RGB_One[1]=0;RGB_One[0]=0;RGB_One[2]=100-j;        
  160.         }
  161.         j++;
  162.         
  163.         for(i=0;i<WS2812_NUM;i++)
  164.         WS2812_Write_RGB();
  165.         
  166.         WS2812_RST();
  167.         Delay_xms(100);
  168. }
  169. void WS2812_DIS_5()//效果5,两边向中间流
  170. {
  171.         static u16 j=0;
  172.         u16 i;

  173.         j%=WS2812_NUM/2;
  174.         j++;

  175.         for(i=0;i<WS2812_NUM;i++)
  176.         {
  177.                 if(i<j)
  178.                 {
  179.                         RGB_One[1]=10;RGB_One[0]=0;RGB_One[2]=0;
  180.                         WS2812_Write_RGB();
  181.                 }
  182.                 else if(i>WS2812_NUM-j)
  183.                 {
  184.                         RGB_One[1]=0;RGB_One[0]=0;RGB_One[2]=10;
  185.                         WS2812_Write_RGB();
  186.                 }
  187.                 else
  188.                 {
  189.                         RGB_One[1]=0;RGB_One[0]=0;RGB_One[2]=0;
  190.                         WS2812_Write_RGB();
  191.                 }
  192.         }
  193.         
  194.         WS2812_RST();
  195.         Delay_xms(100);
  196. }
  197. void WS2812_DIS_6()//效果6,彩色流动
  198. {
  199.         u8 i=0;u8 j;
  200.         static u8 cnt=30;
  201.         
  202.         for(i=0;i<WS2812_NUM;i++)//灯数
  203.         {
  204.                 j=(cnt+i)%COLOR_BUFFER_LEN;
  205.                 RGB_One[0]=color_code[j][0];
  206.                 RGB_One[1]=color_code[j][1];
  207.                 RGB_One[2]=color_code[j][2];
  208.                 WS2812_Write_RGB();        
  209.         }
  210.         cnt++;cnt%=COLOR_BUFFER_LEN;
  211.         WS2812_RST();
  212.         Delay_xms(30);
  213.         
  214. }
  215. void WS2812_main()
  216. {
  217.         switch(WS2812_menu)
  218.         {
  219.                 case 0:WS2812_DIS_1();break;//颜色全一样,7种颜色变换
  220.                 case 1:WS2812_DIS_2();break;//单一颜色,逐个点亮
  221.                 case 2:WS2812_DIS_3();break;//10个LED点亮,流动
  222.                 case 3:WS2812_DIS_4();break;//单色呼吸灯
  223.                 case 4:WS2812_DIS_5();break;//两边向中间流
  224.                 case 5:WS2812_DIS_6();break;//炫彩流动
  225.         }
  226. }
复制代码

代码和原理图 立创格式的PCB 资料下载: WS2812X20灯条.7z (508.92 KB, 下载次数: 89)

评分

参与人数 1黑币 +50 收起 理由
admin + 50

查看全部评分

回复

使用道具 举报

ID:297903 发表于 2023-10-25 15:16 | 显示全部楼层
感谢分享,程序测试可用,谢谢!!
回复

使用道具 举报

ID:1093862 发表于 2024-1-19 15:39 | 显示全部楼层
大佬,程序经测可用,就是亮度太暗了,怎么调亮呢
回复

使用道具 举报

ID:1093862 发表于 2024-1-19 20:09 | 显示全部楼层
程序可用就是亮度太暗了,怎么才能调亮点呢
回复

使用道具 举报

ID:97300 发表于 2024-1-19 23:30 | 显示全部楼层
感谢分享,有空时试试
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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