你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STC15控制WS2812 RGB彩灯级联

[复制链接]
STMCU小助手 发布时间:2022-10-26 22:29
一、WS2812介绍

379393ea79894e2690033676f8d109d5.png

引脚

0d99c72145544b2a9cb535910ddfc5c0.png

工作时序

9262a9641e1f4ae19bd1404d554aaa63.png

352f5edf8c494abe96ec80488f97f89b.png
965d6ca5689a4788ae1c663237047cad.png


注意

当我们使用WS2812控制RGB彩灯的时候,每一个彩灯需要发送24bit数据RGB各8BIt控制,如果我们要控制两个则需要连续发送48bit数据,同理当我们要控制N个彩灯的时候,需要发送N*24bit数据。

二、WS2812级联接线
下面是我使用两个WS2812进行级联,WS2812在使用过程中只需要一根控制线就可以了,OUT连接下一块的IN,接多块WS2812同样如此进行连接

4736eaff6840452f9952bc249b988710.png

三、实验测试
RGB颜色表

e5b912d97008456c8e7fc51f95b59db9.png

b73e933afb1f412d9cf08bc2768c6aa6.png

7c2a8cbbca1a42b3a0051a51595172b6.png

代码中的颜色是根据上述的RGB颜色表来写的

1.ws2812.c

  1. #include "ws2812.h"
  2. #include "delay.h"
  3. #include <intrins.h>

  4. #include <STC15F2K60S2.H>

  5. #define LED_COUNT 8     //控制彩灯的个数
  6. sbit IN = P3^2;        //WS2812输入引脚控制

  7. //WS2812发送的顺序是GRB,ledcount表示LED的个数,color表示LED的种类
  8. void RGB_LED_Controal(unsigned char led_count,unsigned char color)
  9. {
  10.         unsigned char i = 0;
  11.         for(i=0;i<led_count;i++)  //控制灯的个数
  12.         {
  13.                         switch(color)
  14.                                 {
  15.                                                 //RGB颜色可以网上查看RGB颜色表
  16.                                                 case 1:Send_24bit(0xc9,0x00,0x57);break;  //翠绿色
  17.                                                 case 2:Send_24bit(0x20,0xa0,0xF0);break;        //紫色
  18.                                                 case 3:Send_24bit(0x70,0xda,0xd6);break;  //淡紫色
  19.                                                 case 4:Send_24bit(0x59,0x3d,0xab);break;  //钴色
  20.                                                 case 5:Send_24bit(0x80,0xfa,0x72);break;  //橙红色
  21.                                                 case 6:Send_24bit(0x8a,0x80,0x87);break;  //冷灰
  22.                                                 case 7:Send_24bit(0x80,0x80,0x69);break;  //暖灰色
  23.                                                 case 8:Send_24bit(0xf0,0xfa,0xe6);break;        //亚麻色
  24.                                                 case 9:Send_24bit(0x00,0xff,0x00);break;  //红色
  25.                                                 case 10:Send_24bit(0x30,0xb0,0x60);break;  //栗色
  26.                                                 case 11:Send_24bit(0xfc,0x7c,0x00);break;  //草地绿
  27.                                                 case 12:Send_24bit(0xff,0x00,0xff);break;  //青色
  28.                                                 case 13:Send_24bit(0x2e,0x08,0x54);break;  //靛青
  29.                                                 case 14:Send_24bit(0x8f,0xbc,0xbf);break;        //玫瑰红
  30.                                                 case 15:Send_24bit(0x19,0x19,0x70);break;  //孔雀蓝
  31.                                                 case 16:Send_24bit(0xc7,0x00,0x8c);break;  //土耳其玉色
  32.                                                 case 17:Send_24bit(0xe6,0xf0,0x8c);break;  //黄褐色
  33.                                                 case 18:Send_24bit(0xff,0x00,0x7f);break;  //嫩绿色        
  34.                                                 default:Send_24bit(0x00,0x00,0x00);break;                                       
  35.                                 }
  36.         }
  37. }

  38. //数据复位 低电平持续300us以上
  39. void ResetData(void)
  40. {
  41.         unsigned char i = 0;
  42.         IN = 0;
  43.         for(i = 0;i<6;i++)
  44.         {
  45.                 Delay50us();
  46.         }
  47. }

  48. void Send_Byte(unsigned char temp)
  49. {
  50.         unsigned char i = 0;
  51.         for(i = 0;i<8;i++)
  52.         {
  53.                         if(temp & 0x80)  //从高位开始发送
  54.                         {
  55.                                  //发送“1”码
  56.                                 IN = 1;   
  57.                                 //高电平 持续760ns-1.6us
  58.                                 _nop_();
  59.                                 _nop_();
  60.                                 _nop_();
  61.                                 _nop_();
  62.                                 _nop_();
  63.                                 _nop_();
  64.                                 _nop_();
  65.                                 _nop_();
  66.                                 _nop_();
  67.                                 _nop_();
  68.                                 _nop_();
  69.                                 _nop_();
  70.                                 _nop_();
  71.                                 _nop_();
  72.                                 _nop_();
  73.                                 _nop_();
  74.                                 _nop_();
  75.                                 _nop_();
  76.                                 _nop_();
  77.                                 _nop_();
  78.                                 IN = 0;  
  79.                                 //低电平 持续时间220ns-420ns
  80.                                 _nop_();
  81.                                 _nop_();
  82.                                 _nop_();
  83.                                 _nop_();
  84.                                 _nop_();
  85.                                 _nop_();                        
  86.                                 
  87.                         }else{
  88.                                 //发送"0"码        
  89.                                 IN = 1;
  90.                                 //高电平持续时间 220ns-420ns
  91.                                 _nop_();
  92.                                 _nop_();
  93.                                 _nop_();
  94.                                 _nop_();
  95.                                 _nop_();
  96.                                 _nop_();        
  97.                                 
  98.                                 IN = 0;
  99.                                 //低电平持续时间 750ns-1.6us
  100.                                 _nop_();
  101.                                 _nop_();
  102.                                 _nop_();
  103.                                 _nop_();
  104.                                 _nop_();
  105.                                 _nop_();
  106.                                 _nop_();
  107.                                 _nop_();
  108.                                 _nop_();
  109.                                 _nop_();
  110.                                 _nop_();
  111.                                 _nop_();
  112.                                 _nop_();
  113.                                 _nop_();
  114.                                 _nop_();
  115.                                 _nop_();
  116.                                 _nop_();
  117.                                 _nop_();
  118.                                 _nop_();
  119.                                 _nop_();
  120.                                 
  121.                         }
  122.                         temp = (temp << 1);  //次高位
  123.                 }
  124.         //        Delay10us();               
  125. }



  126. //发送一帧数据RGB 各八位
  127. void Send_24bit(unsigned char dat1,unsigned char dat2,unsigned char dat3)
  128. {
  129.         Send_Byte(dat1);
  130.         Send_Byte(dat2);
  131.         Send_Byte(dat3);
  132. }

  133. //-------------------------------------------------------------------------------
复制代码

2.ws2812.h

  1. #ifndef _WS2812_H_
  2. #define _WS2812_H_

  3. void ResetData(void);
  4. void SendPix(unsigned char *str);
  5. void SendOneFrame(unsigned char *ptr);

  6. void Send_Byte(unsigned char temp);
  7. void Send_24bit(unsigned char dat1,unsigned char dat2,unsigned char dat3);
  8. void RGB_LED_Controal(unsigned char led_count,unsigned char color);
  9. #endif
复制代码

3.main.c

  1. #include <STC15F2K60S2.H>
  2. #include "delay.h"
  3. #include "ws2812.h"

  4. void main(void)
  5. {
  6.         unsigned char i = 0,j =0;
  7.         P0M0 = 0x00;
  8.         P0M1 = 0x00;
  9.         P1M0 = 0x00;
  10.         P1M1 = 0x00;
  11.         P3M0 = 0x00;
  12.         P3M1 = 0x00;
  13.         P5M0 = 0x00;
  14.         P5M1 = 0x00;
  15.         P1 = 0xFF;
  16.         P3 = 0xFF;
  17.         P5 = 0xFF;        
  18.         
  19.         while(1)
  20.         {        
  21.                 for(i = 0;i<8;i++) //外层控制LED的个数
  22.                 {
  23.                         for(j = 0;j<6;j++) //内层控制LED的颜色种类
  24.                         {
  25.                                 RGB_LED_Controal(i,j);
  26.                                 ResetData();
  27.                                 Delay500ms();
  28.                         }
  29.                 }
  30.         }
  31. }
复制代码

实验效果

下图的结果是全部一起控制的现象,大家可以根据自己的展示需求进行不同的操作。

4bd4a7a0f0f74b65b6f208079b2ad41e.png

————————————————
版权声明:@slow-walker


收藏 评论0 发布时间:2022-10-26 22:29

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版