基于STC8F2K08S2 SK6812 RGB5050灯带开发。

SK6812 或者 WS2812 灯带。 网上资料很多。这里就不再做详细介绍

STC8F2K08S2 可以达到1T的速率 可以达到此款灯带要求。
只需要注意以下几点:
1. IO反转需要达到 μ秒级别。 网上有说传统的 STC89C52 是可以实现的。 本人并没有实测。 STC8F2K08S2 此款可以实现。
2. 传输数据是一次传N个 24位数据。 代表N个灯的颜色。 然后复位 延时 传下次 N个灯你想要的颜色。

STC8F2K08S2 此款芯片 IO 有内部上拉 。可以设置推挽式输出。IO口可以直接接灯带DIN
代码:

#include "reg51.h"
#include "intrins.h"

sfr     P1M0        =   0x92;
sfr     P1M1        =   0x91;   //STC8F2K08S2  设置P1 口
sbit Din = P1^6;

#define COLOR_NUM 7             //显示7种颜色
#define LIGHT_NUM 30            //可以亮30个灯。
struct color
{
        unsigned char red;
        unsigned char green;
        unsigned char blue;
};

struct color rainbow[] = {
    {0xFF, 0x00, 0x00},     // red
    {0x00, 0xFF, 0x00}, // oringe
    {0x00, 0x00, 0xFF}, // yellow
    {0xFF, 0xFF, 0x00},     // green
    {0xFF, 0x00, 0xFF}, // blue
    {0, 0, 0xFF},       // indigo
    {0x8B, 0, 0xFF},    // violet
    {0, 0, 0},          // off
};

//实测 高电平0.2917μs,低电平0.9583
#define CODE0 {Din=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();\
                Din=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();\
                _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();\   
                _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();\   
              }

//实测 高电平    0.5833μs  低电平0.6667       
#define CODE1 {Din=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();\
                    _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();\
            Din = 0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();\
                    _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();\
            }


//>80μs 实测 91μs     
void Reset()
{
    unsigned int i;
    Din = 0;
    for(i=0;i<280;i++)
    ;
}

//这个延时 并没有具体去算。 只是大概。可以根据自己需求更改
void Delayms(unsigned long k)       //@24.000MHz
{ 
    unsigned long i,j;  
    for(i=0; ifor(j=0; j<800; j++)      
    ;  
}

void send_data(unsigned char r, unsigned char g, unsigned char b)
{
    unsigned char a;
        for(a=0;a<8;a++)
        {
            if(r&0x80)
            CODE1
            else
            CODE0

            r=r<<1;
        }

        for(a=8;a<16;a++)
        {
            if(g&0x80)
            CODE1
            else
            CODE0

            g=g<<1;
        }

        for(a=16;a<24;a++)
        {
            if(b&0x80)
            CODE1
            else
            CODE0

            b=b<<1;
        }
}
void main()
{
        unsigned char color,light;
    P1M0 = 0xff;                                //设置P1.0~P1.7为推挽输出模式
    P1M1 = 0x00;

    while (1){
    for(color = 0; color < COLOR_NUM; color++) {
        // 1. lighten all the lights
        for(light = 0; light < LIGHT_NUM; light++)
            send_data(rainbow[color].red, rainbow[color].green, rainbow[color].blue);
        Reset();
        Delayms(500);
    }

    };
}

显示效果是 30个灯一起亮 红 然后变成蓝 绿 等色彩。 程序猿们可以根据自己想要的效果来做处理。
参考 百度文库:
https://wenku.baidu.com/view/0467db96852458fb760b568e.html

如有疑问或者有项目定制开发需求。 请留言或者联系qq:493980674

你可能感兴趣的:(STC8F2K08S2)