找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6893|回复: 10
收起左侧

关于51内核单片机对WS2811的RGB彩灯控制程序

  [复制链接]
ID:271759 发表于 2019-3-30 13:29 | 显示全部楼层 |阅读模式
本程序基于stm32的ws2811例程修改,细节在于T1H与T1L的间隔时间

单片机源程序如下:
  1. /****************************************************************************************
  2. * WS2811 彩灯驱动函数
  3. *
  4. * 调用方法:
  5. *        修改宏定义: #define nWs 1        // 有多少颗WS2811级联
  6. *        WS_Init();        // IO初始化
  7. *        WsDat[0] = 0x808080;//显存赋值
  8. *        WS_SetAll();  // 发送数据
  9. *        ColorToColor(unsigned long color0, unsigned long color1);// 颜色渐变算法
  10. *
  11. * 作者:星希望(已校验)
  12. * 日期:2015年6月24日
  13. ****************************************************************************************/
  14. #include <STC8.H>
  15. #include "WS2811.h"
  16. #include "delay.h"
  17. #include <intrins.h>
  18. #define u32 unsigned long
  19. #define        DAT_OUT_h    P1M0=0X00;DAT_OUT=1
  20. #define        DAT_OUT_l    P1M0=0X00;DAT_OUT=0
  21. sbit DAT_OUT=P1^0;
  22. /* 显存 */
  23. unsigned long WsDat[nWs];

  24. /**************************************************************************************
  25. * IO初始化(移植时请修改)
  26. **************************************************************************************/
  27. void WS_Init()
  28. {
  29.     P1M1=0X00;
  30.           P1PU=0XFF;
  31. }

  32. /**************************
  33. * 内部延时
  34. ***************************/
  35. void delay2us()
  36. {
  37.         unsigned char i;

  38.         i = 14;
  39.         while (--i);
  40. }
  41. void delay05us()
  42. {
  43.         unsigned char i;

  44.         i = 2;
  45.         while (--i);
  46. }
  47. void delay1_2us()
  48. {
  49.         unsigned char i;

  50.         i = 8;
  51.         while (--i);
  52. }
  53. void delay1_3us()
  54. {
  55.         unsigned char i;

  56.         i = 9;
  57.         while (--i);
  58. }
  59. /***************************
  60. * 发送一比特
  61. ****************************/
  62. void TX0()          { DAT_OUT_h; delay05us(); DAT_OUT_l; delay2us(); } // 发送0
  63. void TX1()          { DAT_OUT_h; delay1_2us();  DAT_OUT_l; delay1_3us(); } // 发送1
  64. void WS_Reset() { DAT_OUT_l; delay_us(60);  DAT_OUT_h; DAT_OUT_l; }

  65. /**************************************************************************************
  66. * 发送一字节
  67. **************************************************************************************/
  68. void WS_Set1(unsigned long dat)
  69. {
  70.         unsigned char i;
  71.        
  72.         for(i=0; i<24; i++)
  73.         {
  74.                 if(0x800000 == (dat & 0x800000) )        TX1();
  75.                 else                                                                TX0();
  76.                 dat<<=1;                                                        //左移一位
  77.         }
  78. }

  79. /**************************************************************************************
  80. * 发送所有字节
  81. **************************************************************************************/
  82. void WS_SetAll()
  83. {
  84.         unsigned char j;
  85.        
  86.         for(j=0; j<nWs; j++)
  87.         {
  88.                 WS_Set1(WsDat[0]);  // j / 0
  89.         }
  90.         WS_Reset();
  91. }
  92. void WS_SET(unsigned long color,unsigned char num)
  93. {
  94.      unsigned char j;
  95.            for(j=0;j<nWs;j++)
  96.            {
  97.                      if(j<num)
  98.                                  {
  99.                                          WS_Set1(color);
  100.                                  }
  101.          else
  102.          {
  103.            WS_Set1(Black);                         
  104.                                  }                                         
  105.                  }         
  106.      WS_Reset();
  107. }
  108. void WS_SET_Water_lamp(unsigned long color,unsigned int time)
  109. {
  110.      unsigned char j,x;
  111.            for(x=0;x<nWs;x++)
  112.            {
  113.                            for(j=0;j<nWs;j++)
  114.                      {
  115.                                           if(j==x)
  116.                                                 {
  117.                                                   WS_Set1(color);
  118.                                                 }
  119.                                                 else
  120.                                                 {
  121.                                                   WS_Set1(Black);                         
  122.                                                 }       
  123.                                  }
  124.         WS_Reset();                                  
  125.         delay_ms(time);                                 
  126.                  }          
  127. }
  128. void WS_SET_Water_lamp_two(unsigned long color,unsigned int time)
  129. {
  130.      unsigned char j,x;
  131.            for(x=0;x<nWs;x++)
  132.            {
  133.                            for(j=0;j<nWs;j++)
  134.                      {
  135.                                           if(j<x)
  136.                                                 {
  137.                                                   WS_Set1(color);
  138.                                                 }
  139.                                                 else
  140.                                                 {
  141.                                                   WS_Set1(Black);                         
  142.                                                 }       
  143.                                  }
  144.         WS_Reset();                                  
  145.         delay_ms(time);                                 
  146.                  }          
  147. }
  148. void Breathing_lamp(unsigned long color,unsigned int time)
  149. {
  150.      unsigned char j,x,r,g,b,move;
  151.           unsigned long color0,color1;
  152.            r=color>>8;
  153.            g=color;
  154.            b=color>>16;
  155.            if(r!=0)
  156.                  {
  157.                          color0=r;move=8;
  158.      }
  159.                  if(g!=0)
  160.                  {
  161.                          color0=g;move=0;
  162.                  }         
  163.                  if(b!=0)       
  164.      {
  165.                          color0=b;move=16;                 
  166.      }
  167.                  for(x=0;x<127;x++)
  168.            {
  169.                            color1=color0<<move;
  170.                            for(j=0;j<nWs;j++)
  171.                      {
  172.                                           WS_Set1(color1);
  173.                                             
  174.                                  }
  175.                                  color0=color0-2;
  176.         WS_Reset();                                  
  177.         delay_ms(time);                                 
  178.                  }
  179.                  for(x=0;x<127;x++)
  180.            {
  181.                            color1=color0<<move;
  182.                            for(j=0;j<nWs;j++)
  183.                      {
  184.                                           WS_Set1(color1);
  185.                                             
  186.                                  }
  187.                                  color0=color0+2;
  188.         WS_Reset();                                  
  189.         delay_ms(time);                                 
  190.                  }
  191. }
  192. void Breathing_lamp_Alternate(unsigned int time)
  193. {
  194.             unsigned char j,x,num,move;
  195.             unsigned long color0,color1;
  196.             for(num=0;num<3;num++)
  197.             {
  198.                                   color0=0;
  199.           move=8*num;                                                
  200.                                         for(x=0;x<127;x++)
  201.                                         {
  202.                                                   color1=color0<<move;
  203.                                                         for(j=0;j<nWs;j++)
  204.                                                         {
  205.                                                                 WS_Set1(color1);
  206.                                                         }
  207.                                                         color0=color0+2;
  208.                                                         WS_Reset();                                  
  209.                                                         delay_ms(time);                                 
  210.                                         }
  211.                                          for(x=0;x<127;x++)
  212.                                          {
  213.                                                    color1=color0<<move;
  214.                                                          for(j=0;j<nWs;j++)
  215.                                                          {
  216.                                                                         WS_Set1(color1);
  217.                                                                                
  218.                                                          }
  219.                                                          color0=color0-2;
  220.                                                         WS_Reset();                                  
  221.                                                         delay_ms(time);                                 
  222.                                          }
  223.                   }                                         
  224. }



  225. /********************************************
  226. * 求绝对值
  227. ********************************************/
  228. unsigned char abs0(int num)
  229. {
  230.         if(num<0)
  231.            num = -num;
  232.         return (unsigned char) num;
  233. }

  234. /***********************************************************************************
  235. * 颜色渐变算法
  236. * 误差 <= 2
  237. ************************************************************************************/
  238. u32 ColorToColor(unsigned long color0, unsigned long color1,unsigned int time)
  239. {
  240.         unsigned char Red0, Green0, Blue0;  // 起始三原色
  241.         unsigned char Red1, Green1, Blue1;  // 结果三原色
  242.         int                          RedMinus, GreenMinus, BlueMinus;        // 颜色差(color1 - color0)
  243.         unsigned char NStep;                                                         // 需要几步
  244.         float                  RedStep, GreenStep, BlueStep;                // 各色步进值
  245.         unsigned long color;                                                        // 结果色
  246.         unsigned char i;
  247.        
  248.         // 绿 红 蓝 三原色分解
  249.         Red0   = color0>>8;
  250.         Green0 = color0>>16;
  251.         Blue0  = color0;
  252.        
  253.         Red1   = color1>>8;
  254.         Green1 = color1>>16;
  255.         Blue1  = color1;
  256.        
  257.         // 计算需要多少步(取差值的最大值)
  258.         RedMinus   = Red1 - Red0;
  259.         GreenMinus = Green1 - Green0;
  260.         BlueMinus  = Blue1 - Blue0;
  261.        
  262.         if(( abs0(RedMinus) > abs0(GreenMinus) ))
  263.                 NStep=abs0(RedMinus);
  264.         else
  265.                 NStep=abs0(GreenMinus);
  266.         if(( NStep < abs0(BlueMinus) ))
  267.                 NStep=abs0(BlueMinus);
  268.        
  269.         // 计算出各色步进值
  270.         RedStep   = (float)RedMinus   / NStep;
  271.         GreenStep = (float)GreenMinus / NStep;
  272.         BlueStep  = (float)BlueMinus  / NStep;
  273.        
  274.         // 渐变开始
  275.         for(i=0; i<NStep; i++)
  276.         {
  277.                 Red1   = Red0   + (int)(RedStep   * i);
  278.                 Green1 = Green0 + (int)(GreenStep * i);
  279.                 Blue1  = Blue0  + (int)(BlueStep  * i);
  280.                
  281.                 color  = Green1<<16|Red1<<8|Blue1;         // 合成  绿红蓝
  282.                 WsDat[0] = color;
  283.                 WS_SetAll();                                                        // 输出
  284.                 delay_ms(time);                                                // 渐变速度
  285.         }
  286.         // 渐变结束
  287.        
  288.         return color;
  289. }
复制代码

所有资料51hei提供下载:
RGB彩灯调试.zip (65.47 KB, 下载次数: 201)

评分

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

查看全部评分

回复

使用道具 举报

ID:328014 发表于 2019-3-31 02:15 | 显示全部楼层
楼主能分享下源程序吗?
回复

使用道具 举报

ID:271759 发表于 2019-4-2 13:56 | 显示全部楼层
51hei团团 发表于 2019-3-31 02:15
楼主能分享下源程序吗?

源程序不是在附件里嘛?你看看
回复

使用道具 举报

ID:69115 发表于 2019-11-13 01:36 | 显示全部楼层
用STC8单片控制不错.
回复

使用道具 举报

ID:659581 发表于 2019-12-9 16:37 | 显示全部楼层
兄弟 可不可以给我邮箱发个程序包啊 感谢大哥
我的邮箱 804551172@qq.com
有些定义我看的不太明白
回复

使用道具 举报

ID:686417 发表于 2020-3-16 16:21 | 显示全部楼层
用STC8单片控制不错.
回复

使用道具 举报

ID:439460 发表于 2021-6-20 16:54 | 显示全部楼层
你这晶振频率是多少啊?
回复

使用道具 举报

ID:958412 发表于 2021-8-2 19:06 | 显示全部楼层
非常不错的内容,在学习中!!!!!!!!!!!!!!!!!!!!!!!!!
回复

使用道具 举报

ID:72642 发表于 2021-11-24 15:11 | 显示全部楼层
亲测可用,我呀,只会调用不会自己写
回复

使用道具 举报

ID:140489 发表于 2022-5-11 11:14 | 显示全部楼层
yuren1984 发表于 2021-6-20 16:54
你这晶振频率是多少啊?

void Delay1ms()                //@24.000MHz
{
        unsigned char i, j;

        _nop_();
        i = 32;
        j = 40;
        do
        {
                while (--j);
        } while (--i);
}
回复

使用道具 举报

ID:99525 发表于 2022-5-12 12:11 | 显示全部楼层
这是STC8系列的,学习下时序怎么控制的,60路灯带看看能不能改成PWM的
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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