WS2811 使用时需要注意的东西:
1.发送0 1时的高低点平时间,建议使用逻辑分析仪或示波器进行波形查看,精准时间大小。
2.WS281特性为发送数据后保存数据信息,若灯不更换其他颜色,请勿输入数据。
3.注意代码使用过程的规范。精准定位问题出现原因

此处只给出了WS2811的驱动代码。

WS2811.h

#ifndef _WS2811_H
#define _WS2811_H
#include "sys.h"

#define WS2811_CONTROL PAout(0)       
#define HIGH 1
#define SEND_TIMES 20
#define LIGHT_TIME 500         单位:秒

//控制函数声明/
void WS2811_Init(void);
void TIM3_Int_Init(u16 arr,u16 psc);
void l_dat0(void);
void l_dat1(void);
void Reset(void);
void send_single_data(const u8 *data);
void send_string_data(const u8 *data,u8 size);
void RGB_open(const u8 *data);
void RGB_Lighting(void);
void RGB_ALARM(void);
/
#endif
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
WS2811.c

#include "WS2811.h"

static void delay(unsigned long int us);

static u8 Gard[3]={0};  // BLUE RED GREEN
static u16 TIM3_count=0;
static u8 Light_blue=0;
static u8 Light_red=0;
static u8 Light_green=0;

//==================================WS2811初始化======================================//
void WS2811_Init(void)
{
    GPIO_InitTypeDef  GPIO_InitStructure;

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//使能GPIOA时钟

//GPIOA0初始化设置
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;//下拉拉
    GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化
    
    Reset();
    
    TIM3_Int_Init(1000,84);                   //TIM3 1KHZ
}
//==================================通用定时器3初始化================================//
//arr:自动重装值sc:时钟预分频数     定时器溢出时间计算方法:Tout=((arr+1)*(psc+1))/Ft us.
void TIM3_Int_Init(u16 arr,u16 psc)
{
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
    
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);  ///使能TIM3时钟
    
    TIM_TimeBaseInitStructure.TIM_Period = arr;     //自动重装载值
    TIM_TimeBaseInitStructure.TIM_Prescaler=psc;  //定时器分频
    TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
    TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1; 
    
    TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);//初始化TIM3
    
    TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); //允许定时器3更新中断
    TIM_Cmd(TIM3,ENABLE); //使能定时器3
    
    NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn; //定时器3中断
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x01; //抢占优先级1
    NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x03; //子优先级3
    NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
    NVIC_Init(&NVIC_InitStructure);
    
}

//定时器3中断服务函数
void TIM3_IRQHandler(void)
{
    if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET){ //溢出中断
        TIM3_count++;
        if((TIM3_count%(LIGHT_TIME*3))==0){
            Light_blue=1;
            Light_red=0;
            Light_green=0;
        }
        else if((TIM3_count%(LIGHT_TIME*3))==(LIGHT_TIME*1)){
            Light_blue=0;
            Light_red=1;
            Light_green=0;
        }
        else if((TIM3_count%(LIGHT_TIME*3))==(LIGHT_TIME*2)){
            Light_blue=0;
            Light_red=0;
            Light_green=1;
        }
        else if(TIM3_count>(LIGHT_TIME*3))
        TIM3_count=0;
    }
    TIM_ClearITPendingBit(TIM3,TIM_IT_Update);  //清除中断标志位
}

//===============高速编码模式BIT0(高电平时间:0.5us 低电平时间:2us )===============//
void l_dat0(void)
{
    WS2811_CONTROL|=HIGH;
    delay(3);
    WS2811_CONTROL&=~HIGH;
    delay(15);
}

//===============高速编码模式BIT1(高电平时间:5us 低电平时间:0.5us)================//
void l_dat1(void)
{
    WS2811_CONTROL|=HIGH;
    delay(16);
    WS2811_CONTROL&=~HIGH;
    delay(2);
}

//===================================RGB复位====================================//
void Reset(void)
{
    WS2811_CONTROL&=~HIGH;
    delay(2000);
}

//============================发送RGB灰度数据===================================//
void send_single_data(const u8 *data)                                             //数据格式:R7~R0~G7~G0~B7~B0
{
    s8 i=0,j=0;
    for(i = 0; i < 3; i++){
        for(j = 7; j > -1; j--){
            if((*(data+i)&(HIGH<<j))==(HIGH<<j)) 
                l_dat1(); 
            else 
                l_dat0();
        }
    }
}

void send_string_data(const u8 *data,u8 size)                                             
{
    u8 i=0;
    for(i=0;i<size;i++){
        send_single_data(data);     
    }
    Reset();
}
//==================================RGB常亮=====================================//
void RGB_open(const u8 *data) //RGB常亮
{
    send_single_data(data);
}

//=================================RGB闪烁========= BLUE RED GREEN ===============//
void RGB_Lighting(void)
{
    if(Light_blue){
        Gard[0]=255;
        Gard[1]=0;
        Gard[2]=0;
        send_string_data(Gard,SEND_TIMES);              //发送次数与灯管长度有关
        Light_blue=0;
    }
    else if(Light_red){
        Gard[0]=0;
        Gard[1]=255;
        Gard[2]=0;
        send_string_data(Gard,SEND_TIMES); 
        Light_red=0;
    }
    else if(Light_green){
        Gard[0]=0;
        Gard[1]=0;
        Gard[2]=255;
        send_string_data(Gard,SEND_TIMES); 
        Light_green=0;
    }
}

//=================================延时========= BLUE RED GREEN ===============//
static void delay(unsigned long int us)
{
    unsigned long int j;
    for (j = 5*us; j> 0; j--) ;
}

WS2811B驱动使用及使用说明应用相关推荐

  1. python的Firebird驱动:FDB使用说明

    水平所限,有很多不准确的地方. 原文在这里:http://www.firebirdsql.org/file/documentation/drivers_documentation/python/fdb ...

  2. Android 开发之 ---- 底层驱动开发(一) 【转】

    转自:http://blog.csdn.net/jmq_0000/article/details/7372783 版权声明:本文为博主原创文章,未经博主允许不得转载. 驱动概述 说到 Android  ...

  3. 基于V4L2的视频驱动开发(2) 华清远见 刘洪涛

    基于V4L2的视频驱动开发(2) 华清远见 刘洪涛 三.            V4L2 API及数据结构 V4L2是V4L的升级版本,为linux下视频设备程序提供了一套接口规范.包括一套数据结构和 ...

  4. android 设备驱动

    驱动概述 说到 android 驱动是离不开 Linux 驱动的.Android 内核采用的是 Linux2.6 内核 (最近Linux 3.3 已经包含了一些 Android 代码).但 Andro ...

  5. 基于V4L2的视频驱动开发

    基于V4L2的视频驱动开发 编写基于V4L2视频驱动主要涉及到以下几个知识点: ●摄像头方面的知识 要了解选用的摄像头的特性,包括访问控制方法.各种参数的配置方法.信号输出类型等. ●Camera解码 ...

  6. 基于V4L2的视频驱动开发(2

    三.            V4L2 API及数据结构 V4L2是V4L的升级版本,为linux下视频设备程序提供了一套接口规范.包括一套数据结构和底层V4L2驱动接口. 1.常用的结构体在内核目录i ...

  7. proteus中仿真arduino驱动模拟器件(蜂鸣器继电器电机)

    模拟器件如蜂鸣器.继电器.直流电机等在arduino电路中,如果我们接在数字管脚上来驱动往往可能因为驱动电流不够而达不到预期效果,或者没有动作或者没有动静.这篇博文我们专门来讨论一下如何驱动他们. 文 ...

  8. STM32F103驱动RJMU401实现SM2加解密、签名与验签

    目录 前言 一.什么是加密.硬件加密以及加密芯片品牌? 二.开发记录 1.开发环境 2.开发流程 3.常见问题汇总 总结 前言 项目需要加密并且需要采用硬件加密,加密方式为非对称–SM2,之前只接触过 ...

  9. NVIDIA显卡驱动安装和ZED摄像头驱动安装及使用

    ZED驱动安装及使用说明 步骤1:安装nvidia 显卡驱动 1).到英伟达官网搜索,下载电脑相应的显卡驱动.run文件 https://www.nvidia.com/Download/index.a ...

  10. blink usb无线网卡驱动 linux,blink802.11n

    blink802.11n无线网卡驱动是最新推出的一款网卡应用,可以帮助大家把驱动和无限网卡与电脑一起连接在一起,就可以上网了,如果你平时上不了网的话,不妨试试小编这个方法哦! blink802.11n ...

最新文章

  1. 5-510寝室课后习题4.35
  2. 剥开比原看代码08:比原的Dashboard是怎么做出来的?
  3. 大学计算机专业选哪个,这么多大学都有计算机专业 究竟选哪个好呢?
  4. java 9999 符号_java 9999(示例代码)
  5. bzoj 3343: 教主的魔法
  6. .net 把一个对象赋值给一个参数_Java GC回收算法-判定一个对象是否可以回收
  7. python settings_python settings如何配置sqlite?
  8. 诺基亚n9支不支持java_诺基亚N9支持720p播放吗
  9. 百度文库无需VIP和下载券直接下载
  10. 版本管理SVN的使用——SmartSVN使用
  11. 2019web前端开发视频教程资料(汇总整理)
  12. Spark 学习【一】
  13. 计算机应用技术 快捷键,几个实用的电脑使用技巧和快捷键
  14. 求web嘎嘎厉害的朋友
  15. 大唐杯5G练习题(二)
  16. 机器人流程自动化 - RPA
  17. VB6编程:DirectX 2D图形学习日志20伽玛校正
  18. 【OCR系列之一】字符识别技术总览
  19. 漫谈腾讯微服务平台 TSF Mesh 统一容器和虚拟机之路
  20. 2010上海世博会吉祥物--海宝昨晚揭晓

热门文章

  1. 周立功USB-CANII(linux版)与Qt线程结合
  2. Oracle开窗函数
  3. 深圳雷赛智能自动控制软件使用说明(运动控制卡)
  4. xrd连续扫描和步进扫描_XRD样品制备与分析
  5. KEIL5下载程序失败解决办法
  6. python+django天天生鲜超市购物系统
  7. 解决VST插件无法加载之sam音架的配置
  8. 手机通达信正在连接服务器,通达信服务器全部连接超时
  9. ai里怎么做阴影效果_使用ai制作出文字阴影效果的详细方法
  10. mysql5.7手册官方下载_MySQL官方手册5.7 PDF 下载