找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2080|回復: 12
打印 上一主題 下一主題
收起左側

求指導個簡單的WS2812的單片機程序編寫,萬分感謝

[復制鏈接]
跳轉到指定樓層
樓主
ID:977079 發(fā)表于 2023-7-2 19:34 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式

由于本論壇禁止直接求程序,禁止伸手黨,所以向大家請教一下大致的實現(xiàn)方法與思路,理清頭緒后我自己來寫程序去實現(xiàn),謝謝大家

急需一個STC15W204S的單片機驅動WS2812的驅動程序,要求是:需要帶按鍵切換,紅綠藍白四個顏色,有懂的師傅們抽空幫個忙!十分感謝!還有就是如何我要學習如何寫這個WS2812的驅動程序需要學習什么直接一點的資料能快速入門?
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:213173 發(fā)表于 2023-7-3 07:48 | 只看該作者
如果樓主略懂一點編程,可以參考壇友的代碼添加按鍵操縱即可,否則還是買個學習板,老老實實從流水燈學起。
《WS2812的極簡驅動程序,控制芯片為STC15 1T系列單片機》
http://www.torrancerestoration.com/bbs/dpj-170852-1.html
回復

使用道具 舉報

板凳
ID:899081 發(fā)表于 2023-7-3 08:31 | 只看該作者
首先看規(guī)格書。
回復

使用道具 舉報

地板
ID:136485 發(fā)表于 2023-7-3 08:36 | 只看該作者
這個論壇里一搜一大把,你這個功能更簡單
回復

使用道具 舉報

5#
ID:899081 發(fā)表于 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);
}







/////發(fā)送1碼///////////////////

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


//////發(fā)送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();
        }
   
}

//////////////發(fā)送5組數(shù)函數(shù)/////////////////
void   fasong()
{
  
  unsigned  char i;

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


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


///////////////發(fā)送4組數(shù)////////////////////////////////
void  fasongsirun()
{  unsigned   char i;
   red=0;
  green=0;
  biue=0;
  for(i=0;i<3;i++)
    { convert();
      }
     red=200;
   convert();
}
///////////////發(fā)送3組數(shù)//////////////////////
void  fasong3()
{ unsigned   char i;
   red=0;
  green=0;
  biue=0;
  for(i=0;i<2;i++)
    { convert();
      }
      red=200;
   convert();
}
//////////////發(fā)送2組數(shù)/////////////////
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規(guī)格書_cn_v3.1.pdf

953.33 KB, 下載次數(shù): 15

回復

使用道具 舉報

6#
ID:899081 發(fā)表于 2023-7-3 08:44 | 只看該作者
這個是很久以前搞來玩的,你可以先跑跑看在修改。
回復

使用道具 舉報

7#
ID:688692 發(fā)表于 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;
}

發(fā)三個byte對應RGB的值就行了
燈不受控全白就把nop刪掉
還是全白說明單片機太慢,提高單片機的運行速度比如24MHz,直到能控制LED
回復

使用道具 舉報

8#
ID:977079 發(fā)表于 2023-7-3 10:28 | 只看該作者
wulin 發(fā)表于 2023-7-3 07:48
如果樓主略懂一點編程,可以參考壇友的代碼添加按鍵操縱即可,否則還是買個學習板,老老實實從流水燈學起。 ...

好的,謝謝!
回復

使用道具 舉報

9#
ID:977079 發(fā)表于 2023-7-3 10:30 | 只看該作者
螞蟻上樹 發(fā)表于 2023-7-3 08:31
首先看規(guī)格書。

我們公司就是生產幻彩WS2812LED的,主要想入門如何學習C語言,利用C語言自己能夠把LED點亮!
回復

使用道具 舉報

10#
ID:977079 發(fā)表于 2023-7-3 10:31 | 只看該作者
螞蟻上樹 發(fā)表于 2023-7-3 08:43
#include  "reg52.h"
#include  "intrins.h"

感謝師傅百忙抽空,我學習下!
回復

使用道具 舉報

11#
ID:977079 發(fā)表于 2023-7-3 10:33 | 只看該作者
cnos 發(fā)表于 2023-7-3 08:56
void sendbyte(unsigned char byte)
{
        unsigned char i;

好的,真心感謝!
回復

使用道具 舉報

12#
ID:1053359 發(fā)表于 2023-7-3 12:48 | 只看該作者
#include "stm32f4xx.h"

#define LED_COUNT 8     // WS2812 LED數(shù)量
#define RGB_BYTES 3     // 每個LED的RGB字節(jié)數(shù)
#define FRAME_BYTES (LED_COUNT * RGB_BYTES)    // 每幀的字節(jié)數(shù)

// 定義WS2812燈帶顏色緩沖區(qū)
uint8_t leds[FRAME_BYTES] = {0};

// 定義函數(shù):發(fā)送WS2812數(shù)據(jù)位
void sendBit(uint8_t bitValue) {
    // TODO: 發(fā)送邏輯高或邏輯低到WS2812上
    // 可以通過控制GPIO輸出來實現(xiàn)

    // 延時一段時間以用于控制數(shù)據(jù)傳輸速度
    // 根據(jù)WS2812的時序要求來設置延時時間
}

// 定義函數(shù):發(fā)送WS2812數(shù)據(jù)字節(jié)
void sendByte(uint8_t byteValue) {
    for (int i = 0; i < 8; i++) {
        uint8_t bit = (byteValue & (1 << (7 - i))) >> (7 - i);
        sendBit(bit);
    }
}

// 定義函數(shù):發(fā)送WS2812數(shù)據(jù)幀
void sendFrame() {
    for (int i = 0; i < FRAME_BYTES; i++) {
        sendByte(leds[i]);
    }
}

// 初始化WS2812燈帶
void initWS2812() {
    // TODO: 初始化GPIO引腳為輸出模式,用于控制WS2812數(shù)據(jù)總線
    // 根據(jù)單片機型號和開發(fā)環(huán)境的不同,具體實現(xiàn)方式會有所不同
}

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)
            }
        }
        
        // 發(fā)送數(shù)據(jù)幀到WS2812燈帶
        sendFrame();
        
        // 延時一段時間,控制燈帶刷新速度
        // 根據(jù)需求和單片機的時鐘頻率設置適當?shù)难訒r時間
    }
}
這個示例程序初始化了WS2812數(shù)據(jù)總線的GPIO引腳,并在一個無限循環(huán)中設置燈帶的顏色并發(fā)送數(shù)據(jù)幀。您可以根據(jù)需要修改LED_COUNT來適應實際連接的WS2812 LED數(shù)量,并根據(jù)需求修改設置燈帶顏色的代碼段。

請注意,該示例程序只是非常簡單的演示,真正的實現(xiàn)可能需要考慮更多的細節(jié),例如定時器的使用和精確的時序控制,以確保WS2812數(shù)據(jù)的正確傳輸。此外,請確保按照您所使用的單片機型號和開發(fā)環(huán)境的要求進行設置和操作。

希望這個示例能對您有所幫助!如有任何問題,請隨時向我提問。
回復

使用道具 舉報

13#
ID:977079 發(fā)表于 2023-7-3 20:50 | 只看該作者
real8799190 發(fā)表于 2023-7-3 12:48
#include "stm32f4xx.h"

#define LED_COUNT 8     // WS2812 LED數(shù)量

好的,感謝師傅!
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表