WS2811是一款可以级联的RGB三色LED灯。只需要一根数据线就可以控制多颗LED。现在发上来整理的库函数,可以直接调用显示函数。

/****************************************************************************************
* WS2811 彩灯驱动函数
*
* 调用方法:
*        修改宏定义: #define nWs 1        // 有多少颗WS2811级联
*        WS_Init();        // IO初始化
*        WsDat[0] = 0x808080;//显存赋值
*        WS_SetAll();  // 发送数据
*        ColorToColor(unsigned long color0, unsigned long color1);// 颜色渐变算法
*
* 作者:星希望(已校验)
* 日期:2015年6月24日
****************************************************************************************/
#include "sys.h"
#include <stm32f10x.h>
#include "WS2811.h"
#include "delay.h"
        
/* 显存 */
unsigned long WsDat[nWs];

/**************************************************************************************
* IO初始化(移植时请修改)
**************************************************************************************/
void WS_Init()
{
        GPIO_InitTypeDef  GPIO_InitStructure;        
        
        //端口时钟,使能
        RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE );

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

/**************************
* 内部延时
***************************/
void delay2us()
{
        unsigned char i;
        for(i=0; i<12; i++);
}
void delay05us()
{
        unsigned char i;
        for(i=0; i<1; i++);
}

/***************************
* 发送一比特
****************************/
void TX0()          { PAout(0) = 1; delay05us(); PAout(0) = 0; delay2us(); } // 发送0
void TX1()          { PAout(0) = 1; delay2us();  PAout(0) = 0; delay05us(); } // 发送1
void WS_Reset() { PAout(0) = 0; delay_us(60);  PAout(0) = 1; PAout(0) = 0; }

/**************************************************************************************
* 发送一字节
**************************************************************************************/
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();
}

/********************************************
* 求绝对值
********************************************/
unsigned char abs0(int num)
{
        if(num>0) return num;
        
        num = -num;
        return (unsigned char) num;
}

/***********************************************************************************
* 颜色渐变算法
* 误差 <= 2
************************************************************************************/
u32 ColorToColor(unsigned long color0, unsigned long color1)
{
        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;
        
        NStep = ( abs0(RedMinus) > abs0(GreenMinus) ) ? abs0(RedMinus):abs0(GreenMinus);
        NStep = ( 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(1);                                                // 渐变速度
        }
        // 渐变结束
        
        return color;
}

51单片机驱动WS2811彩灯源程序方案相关推荐

  1. 基于51单片机的51单片机的LED彩灯霓虹灯控制器(心形流水灯)设计

    基于51单片机的51单片机的LED彩灯霓虹灯控制器(心形流水灯)设计 必看!!视频讲解 基于51单片机的LED彩灯霓虹灯心形流水灯设计 这里写目录标题 1 开发环境 2 功能说明介绍 3 仿真图 4 ...

  2. 1-基于51单片机的音乐彩灯

    具体实现功能 系统由51单片机+ADC0809模块+LM386功放模块+喇叭+音频接口+发光二极管+电源构成. 具体功能: (1)通过音频线输入可以播放电脑.手机.MP3里面的音乐. (2)AD对音频 ...

  3. c语言编程TLC2543AD采集,51单片机驱动12位AD转换TLC2543电路图+程序

    51单片机驱动12位AD转换TLC2543电路图+程序 2015-06-18 16:51:15   来源:51hei void resultvolt() { volt=volt*5000.0/4334 ...

  4. 51单片机驱动——LCD1602

    51单片机驱动--LCD1602 1.描述 51单片机控制LCD1602屏幕显示测量数据.固定字符串等,大家复制过去可以直接使用,相关注释我已标明. 2.子文件 LCD1602.c #include ...

  5. 用51单片机驱动蜂鸣器

    用51单片机驱动蜂鸣器 #include<reg51.h>//头文件 sbit BEEP=P1^5;//位定义P1的第五个端口为蜂鸣器 void delay() //延时函数 {unsig ...

  6. 51单片机驱动DS18B20温度传感器测量温度

    51单片机驱动DS18B20温度传感器测量温度 1.DS18B20温度传感器介绍: 2.51单片机驱动DS18B20测量温度 1.DS18B20温度传感器介绍: ①引脚定义 引脚 符号 说明 1 GN ...

  7. 使用51单片机驱动YM12232B型液晶显示屏

    这是一个使用51单片机驱动YM12232B 液晶显示器的例子,本人水平有限,仅供参考. 本实例中将使用51单片机控制YM12232B LCD分别在主窗口和副窗口中显示"科"和&qu ...

  8. 基于51单片机驱动A4988实现步进电机逆时针转动

    基于51单片机驱动A4988实现步进电机逆时针转动 一.简介 二.接线 典型接线图 实际接线 三.部分代码 引脚定义 定时器初始化 主函数 四.实验现象 五.注意事项 一.简介 A4988 是一款完全 ...

  9. 基于51单片机驱动HC-SR04超声波模块(LCD1602显示)

    基于51单片机驱动HC-SR04超声波模块(LCD1602显示) 一.基本参数 二.通信时序 三.部分代码展示 四.实际效果 总结 一.基本参数 点击图片购买 HC- SR04+是一款宽电压工作的超声 ...

  10. 51单片机驱动HMI串口屏,串口屏的下载方式

    51单片机驱动HMI串口屏,串口屏的下载方式 串口屏 串口屏的程序下载 51程序 总结 串口屏 串口屏是一个集成了单片机的屏幕模块,采用的是TTL串口协议,可以直接通过对应指令控制屏幕, 本文采用的串 ...

最新文章

  1. java B2B2C Springboot仿淘宝电子商城系统-负载均衡之ribbon+feign
  2. C++逐行读取文本文件的正确做法
  3. Linear_algebra_02_行列式
  4. apscheduler 绿色版
  5. Thread 和 Runnable创建新线程的区别,Runnable可以共享线程类的实例属性
  6. Batch入门教程(1)
  7. extjs 月份选择控件_Ext JS 4实现带week(星期)的日期选择控件(实战二)
  8. 从程序员到项目经理(16):原来一切问题都是可以解决的【转载】
  9. 十大程序员最实用的技术社区网站
  10. Python Qt GUI设计:菜单栏、工具栏和状态栏的使用方法(拓展篇—2)
  11. 幽默感七个技巧_培养幽默感的16种方法
  12. Kali Linux中显示“仓库没有数字签名”的解决方法
  13. oracle 支持多少并发量,如何估算一台数据库服务器能够承受的并发量
  14. 关于FLASH元件包含按钮的一个问题…
  15. Flex 布局语法教程
  16. i10在java中什么意思啊_Java的Integer和int有什么區別
  17. 万智牌天使恩典oracle,万智牌:每日套牌搬运 twitch 今日直播牌组
  18. 深度学习-参数和超参数介绍
  19. Mac M1 安装ubuntu虚拟机
  20. BTCOIL新能源线圈、扁线线圈、汽车新能源线圈关键词提取

热门文章

  1. 判断浏览器内核是否是IE8及其以下
  2. java过滤空号了停机号_手机号码空号检测
  3. 录屏软件推荐:bilibili哔哩哔哩直播姬录屏软件下载使用指南
  4. kettle教程,简单插入与更新
  5. mysql数据库更新数据库语句_MySQL数据库之UPDATE更新语句精解
  6. 图书管理系统-借书操作
  7. html中引入的图标库,动态引入阿里图标库
  8. 进销存excel_Excel进销存管理套表,自动库存显示应收应付,全函数快捷轻松
  9. STC单片机使用RS485下载程序方法
  10. 计算机指纹驱动程序,解决方法:联想笔记本指纹识别驱动程序安装教程[详细]...