找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1412|回复: 12
收起左侧

求指导个简单的WS2812的单片机程序编写,万分感谢

[复制链接]
ID:977079 发表于 2023-7-2 19:34 | 显示全部楼层 |阅读模式

由于本论坛禁止直接求程序,禁止伸手党,所以向大家请教一下大致的实现方法与思路,理清头绪后我自己来写程序去实现,谢谢大家

急需一个STC15W204S的单片机驱动WS2812的驱动程序,要求是:需要带按键切换,红绿蓝白四个颜色,有懂的师傅们抽空帮个忙!十分感谢!还有就是如何我要学习如何写这个WS2812的驱动程序需要学习什么直接一点的资料能快速入门?
回复

使用道具 举报

ID:213173 发表于 2023-7-3 07:48 | 显示全部楼层
如果楼主略懂一点编程,可以参考坛友的代码添加按键操纵即可,否则还是买个学习板,老老实实从流水灯学起。
《WS2812的极简驱动程序,控制芯片为STC15 1T系列单片机》
http://www.51hei.com/bbs/dpj-170852-1.html
回复

使用道具 举报

ID:899081 发表于 2023-7-3 08:31 | 显示全部楼层
首先看规格书。
回复

使用道具 举报

ID:136485 发表于 2023-7-3 08:36 | 显示全部楼层
这个论坛里一搜一大把,你这个功能更简单
回复

使用道具 举报

ID:899081 发表于 2023-7-3 08:43 | 显示全部楼层
#include  "reg52.h"
#include  "intrins.h"



unsigned char   green,red,biue;

bit   oneep;
sbit  out=P1^2;

void Delay2us()                //@11.0592MHz
{
        unsigned char i;

        i = 3;
        while (--i);
}



void Delay500ms()                //@11.0592MHz
{
        unsigned char i, j, k;

        _nop_();
        _nop_();
        i = 10;
        j = 3;
        k = 50;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}







/////发送1码///////////////////

void   one()
{
  out=1;
  Delay2us();
  out=0;
  _nop_();
        _nop_();
}


//////发送0码////////////
void zero()
{
  out=1;
   _nop_();
        _nop_();
  out=0;
  Delay2us();

}



  





//复位码//////////////

void convert()
{

  unsigned char i,g,b,r;
   g=green;
   r=red;
   b=biue;
  for(i=0;i<8;i++)
      {oneep=(r>>1);
      
          if(oneep==1)
           one();
          if(oneep==0)
            zero();
        }
    for(i=0;i<8;i++)
      {oneep=(g>>1);
      
          if(oneep==1)
           one();
          if(oneep==0)
            zero();
        }   
   for(i=0;i<8;i++)
      {oneep=(b>>1);
          if(oneep==1)
           one();
          if(oneep==0)
            zero();
        }
   
}

//////////////发送5组数函数/////////////////
void   fasong()
{
  
  unsigned  char i;

  for(i=0;i<15;i++)
     { convert();
      }
}


////////////发送//////////////////////////
void   reddd()
{
  unsigned  char i;
   
   red=0;
  green=0;
  biue=0;
  for(i=0;i<15;i++)
     { convert();
      }
   red=200;
   convert();
}


///////////////发送4组数////////////////////////////////
void  fasongsirun()
{  unsigned   char i;
   red=0;
  green=0;
  biue=0;
  for(i=0;i<3;i++)
    { convert();
      }
     red=200;
   convert();
}
///////////////发送3组数//////////////////////
void  fasong3()
{ unsigned   char i;
   red=0;
  green=0;
  biue=0;
  for(i=0;i<2;i++)
    { convert();
      }
      red=200;
   convert();
}
//////////////发送2组数/////////////////
void faone()
{
  unsigned   char i;
  red=0;
  green=0;
  biue=0;
  for(i=0;i<1;i++)
   { convert();
      }
     red=200;
     convert();
}

////////////////////////////
void  oeoo()
{    red=200;
     convert();
}


//////////////////////////////////
void   greengg()
{

  unsigned  char i;
   
   red=0;
  green=0;
  biue=0;
  for(i=0;i<4;i++)
     { convert();
      }
   green=200;
   convert();
   out=0;
   Delay500ms();
   green=0;
   for(i=0;i<3;i++)
     { convert();
      }
   green=200;
   convert();
   out=0;
   Delay500ms();
     green=0;
    for(i=0;i<2;i++)
     { convert();
      }
   green=200;
   convert();
   out=0;
   Delay500ms();
    green=0;
   for(i=0;i<1;i++)
     { convert();
      }
   green=200;
   convert();
   out=0;
   Delay500ms();
   green=200;
     convert();
      out=0;
   Delay500ms();

}

void   lanlan()
{

  unsigned  char i;
   
   red=0;
  green=0;
  biue=0;
  for(i=0;i<4;i++)
     { convert();
      }
   biue=200;
   convert();
   out=0;
   Delay500ms();
   biue=0;
   for(i=0;i<3;i++)
     { convert();
      }
   biue=200;
   convert();
   out=0;
   Delay500ms();
     biue=0;
    for(i=0;i<2;i++)
     { convert();
      }
   biue=200;
   convert();
   out=0;
   Delay500ms();
    biue=0;
   for(i=0;i<1;i++)
     { convert();
      }
   biue=200;
   convert();
   out=0;
   Delay500ms();
   biue=200;
     convert();
      out=0;
   Delay500ms();

}

void   baibai()
{

  unsigned  char i;
   
   red=0;
  green=0;
  biue=0;
  for(i=0;i<4;i++)
     { convert();
      }
   red=200;
   biue=200;
   green=200;
   convert();
   out=0;
   Delay500ms();
   biue=0;
  green=0;
  biue=0;
   for(i=0;i<3;i++)
     { convert();
      }
    red=200;
   biue=200;
   green=200;

   convert();
   out=0;
   Delay500ms();
    biue=0;
  green=0;
  biue=0;


    for(i=0;i<2;i++)
     { convert();
      }
    red=200;
   biue=200;
   green=200;
   convert();
   out=0;
   Delay500ms();
     biue=0;
  green=0;
  biue=0;


   for(i=0;i<1;i++)
     { convert();
      }
     red=200;
   biue=200;
   green=200;
   convert();
   out=0;
   Delay500ms();
    biue=200;
  green=200;
  biue=200;
     convert();
      out=0;
   Delay500ms();

}



/////////////////红 绿 蓝 白////////////
void  rgb()

{
   red=100;
    fasong();
   out=0;
  Delay500ms();
    red=0;
    green=100;
   fasong();
    out=0;
   Delay500ms();
   green=0;
   biue=100;
   fasong();
     out=0;
   Delay500ms();
    red=100;
   green=100;
   biue=100;
    fasong();
     out=0;
   Delay500ms();
}
//////////////////////////////////////
void   shunn()
{

  unsigned  char i;
   red=200;
   convert();
   out=0;
   Delay500ms();
  for(i=0;i<2;i++)
     {convert();}
   out=0;
   Delay500ms();
  for(i=0;i<3;i++)
     {convert();}
   out=0;
   Delay500ms();
  for(i=0;i<4;i++)
     {convert();}
   out=0;
   Delay500ms();
   
  for(i=0;i<5;i++)
     {convert();}
   out=0;
   Delay500ms();
    red=0;
   green=0;
   biue=0;
   for(i=0;i<5;i++)
     {convert();}
   out=0;
   Delay500ms();

}
void   shunng()
{

  unsigned  char i;
   green=200;
   convert();
   out=0;
   Delay500ms();
  for(i=0;i<2;i++)
     {convert();}
   out=0;
   Delay500ms();
  for(i=0;i<3;i++)
     {convert();}
   out=0;
   Delay500ms();
  for(i=0;i<4;i++)
     {convert();}
   out=0;
   Delay500ms();
   
  for(i=0;i<5;i++)
     {convert();}
   out=0;
   Delay500ms();
   red=0;
   green=0;
   biue=0;

   for(i=0;i<5;i++)
     {convert();}
   out=0;
   Delay500ms();

}
void   shunnl()
{

  unsigned  char i;
   biue=200;
   convert();
   out=0;
   Delay500ms();
  for(i=0;i<2;i++)
     {convert();}
   out=0;
   Delay500ms();
  for(i=0;i<3;i++)
     {convert();}
   out=0;
   Delay500ms();
  for(i=0;i<4;i++)
     {convert();}
   out=0;
   Delay500ms();
   
  for(i=0;i<5;i++)
     {convert();}
   out=0;
   Delay500ms();
    red=0;
   green=0;
   biue=0;
   for(i=0;i<5;i++)
     {convert();}
   out=0;
   Delay500ms();

}

void   shunnlv()
{

  unsigned  char i;
   biue=200;
   green=200;
   convert();
   out=0;
   Delay500ms();
  for(i=0;i<2;i++)
     {convert();}
   out=0;
   Delay500ms();
  for(i=0;i<3;i++)
     {convert();}
   out=0;
   Delay500ms();
  for(i=0;i<4;i++)
     {convert();}
   out=0;
   Delay500ms();
   
  for(i=0;i<5;i++)
     {convert();}
   out=0;
   Delay500ms();
  
    red=0;
   green=0;
   biue=0;
   for(i=0;i<5;i++)
     {convert();}
   out=0;
   Delay500ms();

}
void   shunnhl()
{

  unsigned  char i;
   red=200;
   green=200;
   convert();
   out=0;
   Delay500ms();
  for(i=0;i<2;i++)
     {convert();}
   out=0;
   Delay500ms();
  for(i=0;i<3;i++)
     {convert();}
   out=0;
   Delay500ms();
  for(i=0;i<4;i++)
     {convert();}
   out=0;
   Delay500ms();
   
  for(i=0;i<5;i++)
     {convert();}
   out=0;
   Delay500ms();
   red=0;
   green=0;
   biue=0;
   for(i=0;i<5;i++)
     {convert();}
   out=0;
   Delay500ms();

}







void main()
{
  red=0;
  green=0;
  biue=0;
while(1)
  {
   red=0;
   rgb();
   fasong();
    out=0;
   Delay500ms();
    reddd();
    out=0;
   Delay500ms();
    fasongsirun();
    out=0;
   Delay500ms();
   fasong3();
    out=0;
   Delay500ms();
    faone();
   out=0;
   Delay500ms();
   oeoo();
   out=0;
   Delay500ms();
   fasong();
    out=0;
   Delay500ms();
   
    lanlan();  
    baibai();
     shunn();
      shunng();
       shunnl;  
     shunnlv();
      shunnhl();
      
   }


}

ws2812b-mini-v3规格书_cn_v3.1.pdf

953.33 KB, 下载次数: 15

回复

使用道具 举报

ID:899081 发表于 2023-7-3 08:44 | 显示全部楼层
这个是很久以前搞来玩的,你可以先跑跑看在修改。
回复

使用道具 举报

ID:688692 发表于 2023-7-3 08:56 | 显示全部楼层
void sendbyte(unsigned char byte)
{
        unsigned char i;
        i=8;
        EA=0;
                do
                {
                        WS2812DAT=1;nop();
                        WS2812DAT=byte&0x80;nop();
                        WS2812DAT=0;nop();
                        byte=(byte<<1);                 //左移位
                }while(--i);
        EA=1;
}

发三个byte对应RGB的值就行了
灯不受控全白就把nop删掉
还是全白说明单片机太慢,提高单片机的运行速度比如24MHz,直到能控制LED
回复

使用道具 举报

ID:977079 发表于 2023-7-3 10:28 | 显示全部楼层
wulin 发表于 2023-7-3 07:48
如果楼主略懂一点编程,可以参考坛友的代码添加按键操纵即可,否则还是买个学习板,老老实实从流水灯学起。 ...

好的,谢谢!
回复

使用道具 举报

ID:977079 发表于 2023-7-3 10:30 | 显示全部楼层

我们公司就是生产幻彩WS2812LED的,主要想入门如何学习C语言,利用C语言自己能够把LED点亮!
回复

使用道具 举报

ID:977079 发表于 2023-7-3 10:31 | 显示全部楼层
蚂蚁上树 发表于 2023-7-3 08:43
#include  "reg52.h"
#include  "intrins.h"

感谢师傅百忙抽空,我学习下!
回复

使用道具 举报

ID:977079 发表于 2023-7-3 10:33 | 显示全部楼层
cnos 发表于 2023-7-3 08:56
void sendbyte(unsigned char byte)
{
        unsigned char i;

好的,真心感谢!
回复

使用道具 举报

ID:1053359 发表于 2023-7-3 12:48 | 显示全部楼层
#include "stm32f4xx.h"

#define LED_COUNT 8     // WS2812 LED数量
#define RGB_BYTES 3     // 每个LED的RGB字节数
#define FRAME_BYTES (LED_COUNT * RGB_BYTES)    // 每帧的字节数

// 定义WS2812灯带颜色缓冲区
uint8_t leds[FRAME_BYTES] = {0};

// 定义函数:发送WS2812数据位
void sendBit(uint8_t bitValue) {
    // TODO: 发送逻辑高或逻辑低到WS2812上
    // 可以通过控制GPIO输出来实现

    // 延时一段时间以用于控制数据传输速度
    // 根据WS2812的时序要求来设置延时时间
}

// 定义函数:发送WS2812数据字节
void sendByte(uint8_t byteValue) {
    for (int i = 0; i < 8; i++) {
        uint8_t bit = (byteValue & (1 << (7 - i))) >> (7 - i);
        sendBit(bit);
    }
}

// 定义函数:发送WS2812数据帧
void sendFrame() {
    for (int i = 0; i < FRAME_BYTES; i++) {
        sendByte(leds[i]);
    }
}

// 初始化WS2812灯带
void initWS2812() {
    // TODO: 初始化GPIO引脚为输出模式,用于控制WS2812数据总线
    // 根据单片机型号和开发环境的不同,具体实现方式会有所不同
}

int main(void) {
    // 初始化WS2812灯带
    initWS2812();
   
    while (1) {
        // 设置灯带颜色
        // 假设将前4个LED设置为红色,后4个LED设置为绿色
        for (int i = 0; i < LED_COUNT; i++) {
            if (i < LED_COUNT/2) {
                leds[i * RGB_BYTES] = 255;     // 红色亮度(0-255)
                leds[i * RGB_BYTES + 1] = 0;   // 绿色亮度(0-255)
                leds[i * RGB_BYTES + 2] = 0;   // 蓝色亮度(0-255)
            } else {
                leds[i * RGB_BYTES] = 0;       // 红色亮度(0-255)
                leds[i * RGB_BYTES + 1] = 255; // 绿色亮度(0-255)
                leds[i * RGB_BYTES + 2] = 0;   // 蓝色亮度(0-255)
            }
        }
        
        // 发送数据帧到WS2812灯带
        sendFrame();
        
        // 延时一段时间,控制灯带刷新速度
        // 根据需求和单片机的时钟频率设置适当的延时时间
    }
}
这个示例程序初始化了WS2812数据总线的GPIO引脚,并在一个无限循环中设置灯带的颜色并发送数据帧。您可以根据需要修改LED_COUNT来适应实际连接的WS2812 LED数量,并根据需求修改设置灯带颜色的代码段。

请注意,该示例程序只是非常简单的演示,真正的实现可能需要考虑更多的细节,例如定时器的使用和精确的时序控制,以确保WS2812数据的正确传输。此外,请确保按照您所使用的单片机型号和开发环境的要求进行设置和操作。

希望这个示例能对您有所帮助!如有任何问题,请随时向我提问。
回复

使用道具 举报

ID:977079 发表于 2023-7-3 20:50 | 显示全部楼层
real8799190 发表于 2023-7-3 12:48
#include "stm32f4xx.h"

#define LED_COUNT 8     // WS2812 LED数量

好的,感谢师傅!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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