本程序基于stm32的ws2811例程修改,细节在于T1H与T1L的间隔时间
单片机源程序如下:
- /****************************************************************************************
- * WS2811 彩灯驱动函数
- *
- * 调用方法:
- * 修改宏定义: #define nWs 1 // 有多少颗WS2811级联
- * WS_Init(); // IO初始化
- * WsDat[0] = 0x808080;//显存赋值
- * WS_SetAll(); // 发送数据
- * ColorToColor(unsigned long color0, unsigned long color1);// 颜色渐变算法
- *
- * 作者:星希望(已校验)
- * 日期:2015年6月24日
- ****************************************************************************************/
- #include <STC8.H>
- #include "WS2811.h"
- #include "delay.h"
- #include <intrins.h>
- #define u32 unsigned long
- #define DAT_OUT_h P1M0=0X00;DAT_OUT=1
- #define DAT_OUT_l P1M0=0X00;DAT_OUT=0
- sbit DAT_OUT=P1^0;
- /* 显存 */
- unsigned long WsDat[nWs];
- /**************************************************************************************
- * IO初始化(移植时请修改)
- **************************************************************************************/
- void WS_Init()
- {
- P1M1=0X00;
- P1PU=0XFF;
- }
- /**************************
- * 内部延时
- ***************************/
- void delay2us()
- {
- unsigned char i;
- i = 14;
- while (--i);
- }
- void delay05us()
- {
- unsigned char i;
- i = 2;
- while (--i);
- }
- void delay1_2us()
- {
- unsigned char i;
- i = 8;
- while (--i);
- }
- void delay1_3us()
- {
- unsigned char i;
- i = 9;
- while (--i);
- }
- /***************************
- * 发送一比特
- ****************************/
- void TX0() { DAT_OUT_h; delay05us(); DAT_OUT_l; delay2us(); } // 发送0
- void TX1() { DAT_OUT_h; delay1_2us(); DAT_OUT_l; delay1_3us(); } // 发送1
- void WS_Reset() { DAT_OUT_l; delay_us(60); DAT_OUT_h; DAT_OUT_l; }
- /**************************************************************************************
- * 发送一字节
- **************************************************************************************/
- void WS_Set1(unsigned long dat)
- {
- unsigned char i;
-
- for(i=0; i<24; i++)
- {
- if(0x800000 == (dat & 0x800000) ) TX1();
- else TX0();
- dat<<=1; //左移一位
- }
- }
- /**************************************************************************************
- * 发送所有字节
- **************************************************************************************/
- void WS_SetAll()
- {
- unsigned char j;
-
- for(j=0; j<nWs; j++)
- {
- WS_Set1(WsDat[0]); // j / 0
- }
- WS_Reset();
- }
- void WS_SET(unsigned long color,unsigned char num)
- {
- unsigned char j;
- for(j=0;j<nWs;j++)
- {
- if(j<num)
- {
- WS_Set1(color);
- }
- else
- {
- WS_Set1(Black);
- }
- }
- WS_Reset();
- }
- void WS_SET_Water_lamp(unsigned long color,unsigned int time)
- {
- unsigned char j,x;
- for(x=0;x<nWs;x++)
- {
- for(j=0;j<nWs;j++)
- {
- if(j==x)
- {
- WS_Set1(color);
- }
- else
- {
- WS_Set1(Black);
- }
- }
- WS_Reset();
- delay_ms(time);
- }
- }
- void WS_SET_Water_lamp_two(unsigned long color,unsigned int time)
- {
- unsigned char j,x;
- for(x=0;x<nWs;x++)
- {
- for(j=0;j<nWs;j++)
- {
- if(j<x)
- {
- WS_Set1(color);
- }
- else
- {
- WS_Set1(Black);
- }
- }
- WS_Reset();
- delay_ms(time);
- }
- }
- void Breathing_lamp(unsigned long color,unsigned int time)
- {
- unsigned char j,x,r,g,b,move;
- unsigned long color0,color1;
- r=color>>8;
- g=color;
- b=color>>16;
- if(r!=0)
- {
- color0=r;move=8;
- }
- if(g!=0)
- {
- color0=g;move=0;
- }
- if(b!=0)
- {
- color0=b;move=16;
- }
- for(x=0;x<127;x++)
- {
- color1=color0<<move;
- for(j=0;j<nWs;j++)
- {
- WS_Set1(color1);
-
- }
- color0=color0-2;
- WS_Reset();
- delay_ms(time);
- }
- for(x=0;x<127;x++)
- {
- color1=color0<<move;
- for(j=0;j<nWs;j++)
- {
- WS_Set1(color1);
-
- }
- color0=color0+2;
- WS_Reset();
- delay_ms(time);
- }
- }
- void Breathing_lamp_Alternate(unsigned int time)
- {
- unsigned char j,x,num,move;
- unsigned long color0,color1;
- for(num=0;num<3;num++)
- {
- color0=0;
- move=8*num;
- for(x=0;x<127;x++)
- {
- color1=color0<<move;
- for(j=0;j<nWs;j++)
- {
- WS_Set1(color1);
- }
- color0=color0+2;
- WS_Reset();
- delay_ms(time);
- }
- for(x=0;x<127;x++)
- {
- color1=color0<<move;
- for(j=0;j<nWs;j++)
- {
- WS_Set1(color1);
-
- }
- color0=color0-2;
- WS_Reset();
- delay_ms(time);
- }
- }
- }
- /********************************************
- * 求绝对值
- ********************************************/
- unsigned char abs0(int num)
- {
- if(num<0)
- num = -num;
- return (unsigned char) num;
- }
- /***********************************************************************************
- * 颜色渐变算法
- * 误差 <= 2
- ************************************************************************************/
- u32 ColorToColor(unsigned long color0, unsigned long color1,unsigned int time)
- {
- unsigned char Red0, Green0, Blue0; // 起始三原色
- unsigned char Red1, Green1, Blue1; // 结果三原色
- int RedMinus, GreenMinus, BlueMinus; // 颜色差(color1 - color0)
- unsigned char NStep; // 需要几步
- float RedStep, GreenStep, BlueStep; // 各色步进值
- unsigned long color; // 结果色
- unsigned char i;
-
- // 绿 红 蓝 三原色分解
- Red0 = color0>>8;
- Green0 = color0>>16;
- Blue0 = color0;
-
- Red1 = color1>>8;
- Green1 = color1>>16;
- Blue1 = color1;
-
- // 计算需要多少步(取差值的最大值)
- RedMinus = Red1 - Red0;
- GreenMinus = Green1 - Green0;
- BlueMinus = Blue1 - Blue0;
-
- if(( abs0(RedMinus) > abs0(GreenMinus) ))
- NStep=abs0(RedMinus);
- else
- NStep=abs0(GreenMinus);
- if(( NStep < abs0(BlueMinus) ))
- NStep=abs0(BlueMinus);
-
- // 计算出各色步进值
- RedStep = (float)RedMinus / NStep;
- GreenStep = (float)GreenMinus / NStep;
- BlueStep = (float)BlueMinus / NStep;
-
- // 渐变开始
- for(i=0; i<NStep; i++)
- {
- Red1 = Red0 + (int)(RedStep * i);
- Green1 = Green0 + (int)(GreenStep * i);
- Blue1 = Blue0 + (int)(BlueStep * i);
-
- color = Green1<<16|Red1<<8|Blue1; // 合成 绿红蓝
- WsDat[0] = color;
- WS_SetAll(); // 输出
- delay_ms(time); // 渐变速度
- }
- // 渐变结束
-
- return color;
- }
复制代码
所有资料51hei提供下载:
RGB彩灯调试.zip
(65.47 KB, 下载次数: 202)
|