找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 10988|回复: 25
收起左侧

单片机控制WS2811 LED渐变色源码,可以显示16000K色

  [复制链接]
ID:270677 发表于 2018-1-3 13:55 | 显示全部楼层 |阅读模式
LED使用的5050分装自带WS2811.只需要一个IO口控制,可以显示16777215 种颜色,附源代码。
9.png 8.png 7.png 6.png 5.png 4.png 3.png 2.png 1.png

单片机源程序如下:
  1. #include "main.h"
  2. #include <STC/STC12C5A60S2.h>

  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<time;j++)
  35.            for(i=0;i<time;i++)
  36.        for(k=0;k<time;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<LED_N;j++) DisP_Color(dat);
  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. ……………………

  136. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

原理图: 无
仿真: 无
代码: LED渐变.7z (14.87 KB, 下载次数: 372)

评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:318462 发表于 2018-5-15 12:29 | 显示全部楼层
好资料,51黑有你更精彩!!!
回复

使用道具 举报

ID:92841 发表于 2018-7-15 00:00 | 显示全部楼层
很给力,谢谢分享

哪位大侠能发给我一个包,我积分不够下载的。学习一下
回复

使用道具 举报

ID:430328 发表于 2018-11-21 08:31 | 显示全部楼层
看看顺便学习下
回复

使用道具 举报

ID:74143 发表于 2018-11-23 16:16 | 显示全部楼层
好资料,谢谢分享。
回复

使用道具 举报

ID:399179 发表于 2018-11-23 20:56 来自手机 | 显示全部楼层
感谢分享!
回复

使用道具 举报

ID:259149 发表于 2018-12-1 16:37 | 显示全部楼层
你好,我想问一下这个单片机里面 24MHZ 晶振下的_nop_移植到stm32应该是多少,或者说这里面的时间是必须精确到_nop_这样吗
回复

使用道具 举报

ID:259149 发表于 2018-12-1 16:40 | 显示全部楼层
还有T1,T0的作用 能详细说一下吗。。
回复

使用道具 举报

ID:146045 发表于 2019-10-24 21:32 | 显示全部楼层
资料很好,值得学习
回复

使用道具 举报

ID:697723 发表于 2020-4-12 00:47 来自手机 | 显示全部楼层
2811,有点复杂,
回复

使用道具 举报

ID:116743 发表于 2020-11-22 15:31 | 显示全部楼层
还有很多功能没写进去
回复

使用道具 举报

ID:413986 发表于 2021-2-4 13:10 | 显示全部楼层
下载来试试看,我也写了一个,总有毛病,参考下
回复

使用道具 举报

ID:79026 发表于 2021-2-21 16:21 | 显示全部楼层
这个不错,很多场合需要调色和调亮度的
回复

使用道具 举报

ID:706963 发表于 2021-5-19 17:46 | 显示全部楼层
求教才能控制他在其中的某个位置亮起来呢?
回复

使用道具 举报

ID:706963 发表于 2021-5-19 17:47 | 显示全部楼层
有没有硬件线路图讲解呢?
回复

使用道具 举报

ID:950218 发表于 2021-7-8 08:56 | 显示全部楼层
谢谢分享资料!
正需要颜色切换的代码。
回复

使用道具 举报

ID:519089 发表于 2021-7-14 20:04 | 显示全部楼层
没什么用,,灌水
回复

使用道具 举报

ID:856401 发表于 2021-7-16 21:48 来自手机 | 显示全部楼层
好代码
回复

使用道具 举报

ID:507641 发表于 2021-7-28 22:26 | 显示全部楼层
可否能做流水灯?
回复

使用道具 举报

ID:721169 发表于 2021-11-15 19:58 来自手机 | 显示全部楼层
正需要找参考代码
回复

使用道具 举报

ID:99525 发表于 2022-1-7 15:31 | 显示全部楼层
可以加蓝牙芯片直接手机上用七彩图控制灯带了!
回复

使用道具 举报

ID:230500 发表于 2022-1-8 13:06 | 显示全部楼层
无私分享,值得赞赏,2811和2812 是否可以通用?
回复

使用道具 举报

ID:60656 发表于 2022-5-20 21:54 | 显示全部楼层
程序能跑起来吗
回复

使用道具 举报

ID:653353 发表于 2024-3-17 15:38 来自手机 | 显示全部楼层
很好玩的RGB彩灯
回复

使用道具 举报

ID:1045034 发表于 2024-3-29 09:45 | 显示全部楼层
两个问号?NStep = ( abs0(RedMinus) > abs0(GreenMinus) ) ? abs0(RedMinus):abs0(GreenMinus);         NStep = ( NStep > abs0(BlueMinus) ) ? NStep:abs0(BlueMinus);
回复

使用道具 举报

ID:1045034 发表于 2024-3-29 09:46 | 显示全部楼层
        NStep = ( abs0(RedMinus) > abs0(GreenMinus) ) ? abs0(RedMinus):abs0(GreenMinus);
        NStep = ( NStep > abs0(BlueMinus) ) ? NStep:abs0(BlueMinus);
       这两个问号有问题
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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