找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机驱动WS2811彩灯源程序和实物图

  [复制链接]
ID:175516 发表于 2017-3-20 19:49 | 显示全部楼层 |阅读模式
WS2811是一款可以级联的RGB三色LED灯。只需要一根数据线就可以控制多颗LED。现在发上来整理的库函数,可以直接调用显示函数。
134437qkyykzc7echkxee1.jpg.thumb.jpg

WS2811.h
  1. #ifndef __WS2811_H
  2. #define __WS2811_H         
  3. #include "sys.h"


  4. #define White       0xFFFFFF  // 白色
  5. #define Black       0x000000  // 黑色
  6. #define Red         0x00ff00  // 红色
  7. #define Green       0xff0000  // 绿色
  8. #define Blue        0x0000ff  // 蓝色


  9. #define nWs 16                // 有多少颗WS2811级联

  10. extern unsigned long WsDat[];

  11. extern void WS_Init(void);
  12. extern void WS_SetAll(void);
  13. extern u32 ColorToColor(unsigned long color0, unsigned long color1);

  14.                                                      
  15. #endif

复制代码
  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 "sys.h"
  15. #include <stm32f10x.h>
  16. #include "WS2811.h"
  17. #include "delay.h"
  18.        
  19. /* 显存 */
  20. unsigned long WsDat[nWs];


  21. /**************************************************************************************
  22. * IO初始化(移植时请修改)
  23. **************************************************************************************/
  24. void WS_Init()
  25. {
  26.         GPIO_InitTypeDef  GPIO_InitStructure;       
  27.        
  28.         //端口时钟,使能
  29.         RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE );         

  30.         // 端口配置
  31.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;                                // PIN
  32.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                 // 推挽输出
  33.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                // IO口速度为50MHz
  34.         GPIO_Init(GPIOA, &GPIO_InitStructure);                                        // 根据设定参数初始化
  35. }

  36. /**************************
  37. * 内部延时
  38. ***************************/
  39. void delay2us()
  40. {
  41.         unsigned char i;
  42.         for(i=0; i<12; i++);
  43. }
  44. void delay05us()
  45. {
  46.         unsigned char i;
  47.         for(i=0; i<1; i++);
  48. }

  49. /***************************
  50. * 发送一比特
  51. ****************************/
  52. void TX0()          { PAout(0) = 1; delay05us(); PAout(0) = 0; delay2us(); } // 发送0
  53. void TX1()          { PAout(0) = 1; delay2us();  PAout(0) = 0; delay05us(); } // 发送1
  54. void WS_Reset() { PAout(0) = 0; delay_us(60);  PAout(0) = 1; PAout(0) = 0; }

  55. /**************************************************************************************
  56. * 发送一字节
  57. **************************************************************************************/
  58. void WS_Set1(unsigned long dat)
  59. {
  60.         unsigned char i;
  61.        
  62.         for(i=0; i<24; i++)
  63.         {
  64.                 if(0x800000 == (dat & 0x800000) )        TX1();
  65.                 else                                                                TX0();
  66.                 dat<<=1;                                                        //左移一位
  67.         }
  68. }

  69. /**************************************************************************************
  70. * 发送所有字节
  71. **************************************************************************************/
  72. void WS_SetAll()
  73. {
  74.         unsigned char j;
  75.        
  76.         for(j=0; j<nWs; j++)
  77.         {
  78.                 WS_Set1(WsDat[0]);  // j / 0
  79.         }
  80.         WS_Reset();
  81. }









  82. /********************************************
  83. * 求绝对值
  84. ********************************************/
  85. unsigned char abs0(int num)
  86. {
  87.         if(num>0) return num;
  88.        
  89.         num = -num;
  90.         return (unsigned char) num;
  91. }

  92. /***********************************************************************************
  93. * 颜色渐变算法
  94. * 误差 <= 2
  95. ************************************************************************************/
  96. u32 ColorToColor(unsigned long color0, unsigned long color1)
  97. {
  98.         unsigned char Red0, Green0, Blue0;  // 起始三原色
  99.         unsigned char Red1, Green1, Blue1;  // 结果三原色
  100.         int                          RedMinus, GreenMinus, BlueMinus;        // 颜色差(color1 - color0)
  101.         unsigned char NStep;                                                         // 需要几步
  102.         float                  RedStep, GreenStep, BlueStep;                // 各色步进值
  103.         unsigned long color;                                                        // 结果色
  104.         unsigned char i;
  105.        
  106.         // 绿 红 蓝 三原色分解
  107.         Red0   = color0>>8;
  108.         Green0 = color0>>16;
  109.         Blue0  = color0;
  110.        
  111.         Red1   = color1>>8;
  112.         Green1 = color1>>16;
  113.         Blue1  = color1;
  114.        
  115.         // 计算需要多少步(取差值的最大值)
  116.         RedMinus   = Red1 - Red0;
  117.         GreenMinus = Green1 - Green0;
  118.         BlueMinus  = Blue1 - Blue0;
  119.        
  120.         NStep = ( abs0(RedMinus) > abs0(GreenMinus) ) ? abs0(RedMinus):abs0(GreenMinus);
  121.         NStep = ( NStep > abs0(BlueMinus) ) ? NStep:abs0(BlueMinus);
  122.        
  123.         // 计算出各色步进值
  124.         RedStep   = (float)RedMinus   / NStep;
  125.         GreenStep = (float)GreenMinus / NStep;
  126.         BlueStep  = (float)BlueMinus  / NStep;
  127.        
  128.         // 渐变开始
  129.         for(i=0; i<NStep; i++)
  130.         {
  131.                 Red1   = Red0   + (int)(RedStep   * i);
  132.                 Green1 = Green0 + (int)(GreenStep * i);
  133.                 Blue1  = Blue0  + (int)(BlueStep  * i);
  134.                
  135.                 color  = Green1<<16 | Red1<<8 | Blue1;         // 合成  绿红蓝
  136.                 WsDat[0] = color;
  137.                 WS_SetAll();                                                        // 输出
  138.                 delay_ms(1);                                                // 渐变速度
  139.         }
  140.         // 渐变结束
  141.        
  142.         return color;
  143. }
复制代码


评分

参与人数 2黑币 +53 收起 理由
Eleven_1ing + 3 赞一个!
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:112074 发表于 2017-5-9 18:31 | 显示全部楼层
好东西  谢谢
回复

使用道具 举报

ID:220245 发表于 2017-7-29 11:36 | 显示全部楼层
不错,很好,借鉴了。
回复

使用道具 举报

ID:276559 发表于 2018-1-16 14:38 | 显示全部楼层
32的源码,51的标题,,,楼主注意点嘛。。。
回复

使用道具 举报

ID:78170 发表于 2018-3-27 18:09 | 显示全部楼层
谢谢楼主分析 谢谢
回复

使用道具 举报

ID:287229 发表于 2018-3-27 18:50 | 显示全部楼层
谢楼主分析 谢谢
回复

使用道具 举报

ID:78170 发表于 2018-3-28 08:33 | 显示全部楼层
谢谢楼主分享
回复

使用道具 举报

ID:282431 发表于 2018-3-28 09:28 | 显示全部楼层
学习,谢谢楼主分享
回复

使用道具 举报

ID:309276 发表于 2018-4-16 15:13 | 显示全部楼层
你可真厉害
回复

使用道具 举报

ID:309276 发表于 2018-4-16 15:13 | 显示全部楼层
我想下载
回复

使用道具 举报

ID:161115 发表于 2018-4-18 13:22 | 显示全部楼层
正在需要,感谢楼主无私的分享!
回复

使用道具 举报

ID:338195 发表于 2018-5-25 17:32 | 显示全部楼层
我要借鉴一下
回复

使用道具 举报

ID:69489 发表于 2018-6-19 11:40 | 显示全部楼层
不完整啊,延时函数没有,很多头文件也没有
回复

使用道具 举报

ID:359215 发表于 2018-6-28 19:30 | 显示全部楼层
不知道用STM8S003做驱动,能不能实现,内部晶振只有16M
回复

使用道具 举报

ID:359215 发表于 2018-6-28 19:31 | 显示全部楼层
用在STM8S003上面不行,频率16M达不到
回复

使用道具 举报

ID:357395 发表于 2018-6-28 22:02 | 显示全部楼层
不错,很好,借鉴了。
回复

使用道具 举报

ID:368867 发表于 2018-8-1 14:54 | 显示全部楼层
没有delay的头文件啊?
回复

使用道具 举报

ID:383463 发表于 2018-8-6 15:32 | 显示全部楼层
顶一个
回复

使用道具 举报

ID:411803 发表于 2018-10-18 16:56 | 显示全部楼层
很棒鸭
回复

使用道具 举报

ID:74848 发表于 2019-2-8 19:45 | 显示全部楼层
感谢分享,用89C51单片机可以吗?
回复

使用道具 举报

ID:106417 发表于 2019-2-26 10:59 | 显示全部楼层
多谢分享,支持一下,这个灯看起来不错
回复

使用道具 举报

ID:486017 发表于 2019-3-7 09:39 | 显示全部楼层
赞一个@!
回复

使用道具 举报

ID:489066 发表于 2019-3-12 10:35 | 显示全部楼层
怎么都是这么久远的。。。
回复

使用道具 举报

ID:421823 发表于 2019-3-19 17:19 | 显示全部楼层
为什么网上代码都一个样
回复

使用道具 举报

ID:555240 发表于 2020-3-14 15:55 | 显示全部楼层
好东西,感谢分享
回复

使用道具 举报

ID:788346 发表于 2020-6-24 08:45 | 显示全部楼层
不错,
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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