凡亿教育-小燕
凡事用心,一起进步
打开APP
公司名片
凡亿问答 | 单片机控制WS2811 LED渐变色源码,可以显示16000K色
单片机控制WS2811 LED渐变色源码,可以显示16000K色

LED使用的5050分装自带WS2811.只需要一个IO口控制,可以显示16777215 种颜色,附源代码。
a98b58ee1a095c70552645db672e55.png18ebed226bde8125190811ab9b77d2.png96431aee7c3d21badb97f3e4ea71da.png10e2821ad5626e0a89ea4751a1c993.pngef8a0ee32dbe1c57820b61498dace8.pngb9185024c98286b96119eaf8a40522.pngdd65e5e2e192dd669fe40b863f27b7.pnge43014585e41e378eb66b95971e8cd.png15f534eb853bf9462ca330c8f1477d.png

单片机源程序如下:

  1. #include "main.h"
  2. #include

  3. //#define MAIN_Fosc                24000000L        //定义主时钟   
  4. #define WHITE       0xFFFFFF  // 白色
  5. #define BLACK       0x000000  // 黑色
  6. #define RED         0x00ff00  // 红色
  7. #define GREEN       0xff0000  // 绿色
  8. #define BLUE        0x0000ff  // 蓝色
  9. #define CHENG       0xff7f00  // 橙色
  10. #define DIAN                0xff00ff  //
  11. #define ZI                    0x00ffff

  12. #define LED_N  16   //LED的数量   


  13. //extern unsigned long WsDat[];
  14. unsigned long WsDat[];



  15. void main ()//主函数
  16. {

  17.   reset();
  18. //DisP_R_G_B(20);
  19. ColorToColor(0X000000,0XFF0000);
  20. ColorToColor(0XFF0000,0xFFFF00);
  21. ColorToColor(0xFFFF00,0Xffffff);
  22. ColorToColor(0Xffffff,0X00ffff);
  23. ColorToColor(0X00ffff,0X0000ff);
  24. ColorToColor(0X0000ff,0X000000);

  25. ColorToColor(0X000000,0X00FF00);
  26. ColorToColor(0X00FF00,0x0FFFF0);
  27. ColorToColor(0x0FFFF0,0Xffffff);
  28. ColorToColor(0Xffffff,0XFF00ff);
  29. ColorToColor(0XFF00ff,0XF0000f);
  30. ColorToColor(0XF0000f,0X000000);


  31. }

  32. void delay(unsigned int time)   //延时
  33. {  unsigned int i,j,k;
  34.    for(j=0;j
  35.            for(i=0;i
  36.        for(k=0;k
  37.           Delay();
  38.   
  39. }



  40. void Delay()                //@24.000MHz
  41. {
  42.         _nop_();
  43. }
  44. void reset(void)
  45. {
  46.    int i;
  47.    LED=0;
  48. for(i=0;i<50;i++)
  49. {Delay();
  50.    }  
  51. }
  52. void T0(void)
  53. {
  54.   LED=1;
  55.   LED=0;
  56.   Delay();
  57.            
  58. }


  59. void T1(void)
  60. {
  61.   LED=1;
  62.   Delay();
  63.   LED=0;

  64. }
  65. void DisP_Color(unsigned long dat)                                 //控制一个灯
  66. {          unsigned int i;
  67.          for(i=0;i<24;i++)
  68.                    {   if(0x800000 == (dat & 0x800000))  T1();
  69.                 else       T0();
  70.                 dat<<=1;                                                        //左移一位
  71.                    }

  72. }

  73. void DisP_ALLColor(unsigned long dat)         //控制所有灯         
  74. {int j;         
  75.    for(j=0;j
  76.   reset();
  77. }


  78. void DisP_R_G_B(unsigned int j)                    //RGB渐变
  79. {  
  80.     unsigned long i=0;
  81.     while(i<0xffffff)
  82.         {
  83.         if(i<0xff)  DisP_ALLColor(i++);         
  84.                    else if(i<0xffff) {        i=i+0x100;DisP_ALLColor(i);        }
  85.                 else if(i<0xffffff)  {i=i+0x10000;DisP_ALLColor(i);        }
  86.               delay(j);
  87.          }                  
  88.         while(i>0)
  89.         {
  90.          if(i>0xffff00)  DisP_ALLColor(i--);         
  91.                    else if(i>0xff0000) {i=i-0x100;        DisP_ALLColor(i);}
  92.                 else if(i>0)  {i=i-0x10000;DisP_ALLColor(i);}
  93.                 delay(j);
  94.         }       
  95.         reset();
  96. }





  97. unsigned char abs0(int num)
  98. {
  99.         if(num>0) return num;
  100.         
  101.         num = -num;
  102.         return (unsigned char) num;
  103. }
  104.           
  105. unsigned long ColorToColor(unsigned long color0, unsigned long color1)
  106. {
  107.         unsigned char Red0, Green0, Blue0;  // 起始三原色
  108.         unsigned char Red1, Green1, Blue1;  // 结果三原色
  109.         int  RedMinus, GreenMinus, BlueMinus;        // 颜色差(color1 - color0)
  110.         unsigned char NStep;                                                         // 需要几步
  111.         float    RedStep, GreenStep, BlueStep;                // 各色步进值
  112.         unsigned long color;                                                        // 结果色
  113.         unsigned char i;
  114.         
  115.         // 绿 红 蓝 三原色分解
  116.         Red0   = color0>>8;
  117.         Green0 = color0>>16;
  118.         Blue0  = color0;
  119.         
  120.         Red1   = color1>>8;
  121.         Green1 = color1>>16;
  122.         Blue1  = color1;
  123.         
  124.         // 计算需要多少步(取差值的最大值)
  125.         RedMinus   = Red1 - Red0;
  126.         GreenMinus = Green1 - Green0;
  127.         BlueMinus  = Blue1 - Blue0;
  128.         
  129.         NStep = ( abs0(RedMinus) > abs0(GreenMinus) ) ? abs0(RedMinus):abs0(GreenMinus);
  130.         NStep = ( NStep > abs0(BlueMinus) ) ? NStep:abs0(BlueMinus);
  131.         
  132.         // 计算出各色步进值
  133.         RedStep   = (float)RedMinus   / NStep;
  134.         GreenStep = (float)GreenMinus / NStep;
  135. ……………………


复制代码

LED渐变.rar (30.65 KB, 下载次数: 293)
2018-1-3 13:54 上传
点击文件名下载附件
LED渐变
下载积分: 黑币 -5



22个回答

很给力,谢谢分享

哪位大侠能发给我一个包,我积分不够下载的。学习一下 46196428@qq.com
很给力,谢谢分享

哪位大侠能发给我一个包,我积分不够下载的。学习一下 5658274@qq.com
看看顺便学习下
好资料,谢谢分享。
你好,我想问一下这个单片机里面 24MHZ 晶振下的_nop_移植到stm32应该是多少,或者说这里面的时间是必须精确到_nop_这样吗
还有T1,T0的作用 能详细说一下吗。。
资料很好,值得学习
2811,有点复杂,
还有很多功能没写进去
热门问答
我来回答
首页
22
0
0