找回密码
 注册
关于网站域名变更的通知
查看: 1451|回复: 10
打印 上一主题 下一主题

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

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-1-17 10:54 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
51单片机驱动WS2811彩灯源程序和实物图
- ~% u' L- R* i! V3 J: c
" k+ {+ L$ A0 f: r2 I7 d% B: k& z
, P& A6 g  y7 Q7 d6 y  v8 O3 {
WS2811是一款可以级联的RGB三色LED灯。只需要一根数据线就可以控制多颗LED。现在发上来整理的库函数,可以直接调用显示函数。  B7 G! A- ^/ ~' l
0 u6 j4 q5 Z1 s9 m
, J% R4 J9 V& U7 u( x: y8 J# |
WS2811.h
6 Z% T* W3 e! d  {' j
# N& Y2 J/ Q( r& j# F9 D4 t

" P( \. c% W* t( D#ifndef __WS2811_H
# t6 w  `5 K+ r6 x#define __WS2811_H         3 j( A! c3 L1 |. }" z! S& c1 q
#include "sys.h"
& k( ^6 {6 D. a( R% V; `8 k! y1 s3 l1 y/ }. F: i7 p
6 p# w. N5 ~3 b  U# p

9 @! r/ a4 \5 x
$ V2 i  y2 n. {2 Z
#define White       0xFFFFFF  // 白色' ?1 t$ _' [- y! H0 A/ ]: R
#define Black       0x000000  // 黑色6 y+ j* n) H5 v5 O" N& v4 p
#define Red         0x00ff00  // 红色
8 n4 J( D+ }  j0 ^' F) W#define Green       0xff0000  // 绿色
4 _2 S7 F9 X' A* \( ~1 z#define Blue        0x0000ff  // 蓝色
3 |4 T5 H  B* z0 c3 P0 B" E- ]7 w1 R* @3 e4 @& k" i- v1 Z

4 l& e7 x7 m8 y% E# H
! y6 f* Q$ o6 w5 D$ w) O( z
1 ], e2 i9 R+ A* D$ Y. V) J$ t9 a
#define nWs 16                // 有多少颗WS2811级联# |2 D$ K7 I) H$ a& u+ v; u
! `" @" `, }) H$ o, w

1 S$ U: B2 ?9 r8 P. Z, |6 ~extern unsigned long WsDat[];  r6 K5 W) ?; U$ J

* h! R9 ]1 g2 s& h, L9 \3 Z

* q8 v3 c! h+ V6 ]& textern void WS_Init(void);$ C! @! T, B' r, ~- J
extern void WS_SetAll(void);5 a- |  E- U, K: t
extern u32 ColorToColor(unsigned long color0, unsigned long color1);
) a' r* S2 N7 y, Y. Q) y, U! [7 ^: O" \9 W: e1 E  b
* ^2 a( U8 S7 U, Q# {, ^! p
                                                     
, m, {9 q; d' l/ M, n) p% W/ B& C#endif* q, U$ R: [1 N" Y" |

0 i9 {: N3 n- k+ ]  D5 b% O2 D8 g& P9 s/ {  K& O; p+ @1 W; K+ {) H7 p9 F
. @5 c0 `1 A% ~9 ^  c
/****************************************************************************************. J. c7 i+ @0 R% ^" Y
* WS2811 彩灯驱动函数. ]9 F1 {* M" c5 j" R
*6 L5 p5 c- z% A: f, z
* 调用方法:0 P( \6 S$ a6 h% r/ d+ G
*        修改宏定义: #define nWs 1        // 有多少颗WS2811级联& Z& q8 J! r) i+ W5 S0 G* M
*        WS_Init();        // IO初始化' J4 P* t  O3 j& c
*        WsDat[0] = 0x808080;//显存赋值
( d9 f9 m  o+ j  f' O5 j0 p*        WS_SetAll();  // 发送数据
( t2 r# W) l  u: ^2 A% _; l*        ColorToColor(unsigned long color0, unsigned long color1);// 颜色渐变算法
: o' l/ s" F5 b5 S( l( p5 W/ j*
# u- h  G6 s0 ^' H* 作者:星希望(已校验)! K' r$ W- @4 w1 k+ O7 {
* 日期:2015年6月24日
( {) E$ {5 y% J' s) _****************************************************************************************/
$ g# h* Y4 l" N' M8 Q#include "sys.h"2 D  Q: i$ r  a& G% F8 f; r5 m
#include : n% _( @8 W0 k
#include "WS2811.h"7 C- e+ P) v& r
#include "delay.h"9 B2 r! b( w8 D' }5 c( w
        
) O' V: b* k7 A. I6 d- s4 m7 _/ s$ q& E. W/* 显存 */5 d# a' |, r$ `: q
unsigned long WsDat[nWs];+ c" k# R( s( B- n0 r  t8 J2 ^
% J+ ]- h/ r5 B4 t
2 V5 s$ O$ G: Z

; y5 G* m% I8 w0 ^( O9 Z

  Q  j8 H$ K1 B' Q$ W. k/**************************************************************************************1 G, p2 w- e( u, [/ U3 O! M
* IO初始化(移植时请修改)$ Y: \' y' Z5 a9 ]1 H+ l, [
**************************************************************************************/
1 O: W. \8 ]4 w. V/ wvoid WS_Init()' Y, c3 \4 V& a7 @* x# b! N: J
{9 w3 N, A+ D* Q0 I9 A
        GPIO_InitTypeDef  GPIO_InitStructure;        / ]1 w+ P- _- h" a" @" u/ y
        / }3 T( o' \9 f, V( ^  c5 f1 q, F
        //端口时钟,使能
( p0 g; A, p. B        RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE );         
' ^1 I$ M8 p4 @( `. H
7 A. Y3 Q7 N6 ?" U  I6 q3 }

: p. {; }) P/ f. o4 b        // 端口配置& S' {1 P3 C' g2 H3 S" w4 M2 K
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;                                // PIN( u% N/ k+ d* f" ]
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                 // 推挽输出. J8 I! ?  V, d! v$ D
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                // IO口速度为50MHz
& V& U8 p9 `6 B1 s8 \        GPIO_Init(GPIOA, &GPIO_InitStructure);                                        // 根据设定参数初始化 - H$ J" x/ f' v* [
}. D# q" X9 {0 ^! v! \$ e1 K8 I; s
# h% A# B9 t& z
$ T" S' B8 g- e$ V1 [1 F3 }
/**************************
9 g$ W6 h, q8 ], S3 K* N3 J* 内部延时
% `3 q3 y" L: U/ J***************************/
# S( n5 b6 ~/ f- m7 Evoid delay2us()8 b, c0 x5 |4 t: l2 R; b% [3 Y
{
, {) R' }. O) y  P& L        unsigned char i;
0 R" u8 t3 j; a4 J; V. S6 ]# ]        for(i=0; i<12; i++);
! ?1 C: Y( g" `* X2 r9 ?& K}
9 U$ K: P" A; v$ b& ~5 Gvoid delay05us()
( C8 r; e# a& R! k" a{
8 p0 P8 e5 d/ j! }5 t! k( I        unsigned char i;8 Z+ O. U, x* ?, P2 ]$ {/ |
        for(i=0; i<1; i++);
& L  l; c$ o7 i  @7 S8 G& `}
4 h% o$ c, J+ v$ _* _( L* T# K8 q$ q4 T4 u

2 j0 \% I+ _# I; N8 c+ j8 q/***************************" u* x& u/ e1 B2 X! g. k
* 发送一比特" h% n& G) B6 A9 j( E) O. n8 Z
****************************/. m3 c% \" p9 S& ]2 \0 f
void TX0()          { PAout(0) = 1; delay05us(); PAout(0) = 0; delay2us(); } // 发送0+ @3 ^; s, ?5 \7 z/ F6 l
void TX1()          { PAout(0) = 1; delay2us();  PAout(0) = 0; delay05us(); } // 发送12 r2 [. o* \8 ^6 Y% M! Q& R. x
void WS_Reset() { PAout(0) = 0; delay_us(60);  PAout(0) = 1; PAout(0) = 0; }
! z8 M- p: a0 z- W" }1 ?% }& Y( H* M: @  s/ ]3 r8 R$ U' z$ M0 e
. Y- q9 }0 v/ _
/**************************************************************************************
5 u9 Q1 `2 r9 S- ]* 发送一字节
: s; @+ g8 g9 T# K8 n# A8 ~**************************************************************************************/
( [$ ^& b0 {+ ?6 L' }9 mvoid WS_Set1(unsigned long dat)
! t7 r! w0 G/ }' E{
2 U7 }0 c, b. s0 Q3 `        unsigned char i;
3 U4 r4 o- x; |. _4 z, h        
2 o! @' f+ C+ \" S: ?        for(i=0; i<24; i++)
5 v1 B9 f7 s: }/ `3 N5 {( o        {
  b0 k- c  V" D8 I                if(0x800000 == (dat & 0x800000) )        TX1();, s2 g8 W9 G# A3 B! u2 c
                else                                                                TX0();
4 n6 L- B- S( l9 N9 C, r$ Y- ~7 [' F' e                dat<<=1;                                                        //左移一位
! T8 k7 S. t: h+ G' Z0 F        }7 m) _# v) g$ S& X  Y1 J7 |
}# `- t4 [# g9 v, f2 D% f
0 ~1 K+ i7 f2 D6 r6 z% b4 _; v
2 \! I0 @* s$ r9 b7 _
/**************************************************************************************
( i* K1 e" z: C# w8 g+ x/ D) g! `. Y# P* 发送所有字节
, @& q4 J& B$ E( O  W( S**************************************************************************************/
; J4 X$ y8 t0 E' V% c1 Avoid WS_SetAll()3 P3 q. ]+ W: D) w: a. D! H/ i0 E
{
0 j, K: p* K. E9 Y# {" {+ G        unsigned char j;3 b" m# g6 }, Q8 ?# K/ q! k
        
5 B3 B' {0 l6 m! s        for(j=0; j<nws; j++)
7 o2 t2 r5 j. W  U$ i$ P        {% z' R2 o: l4 _2 z* A. h
                WS_Set1(WsDat[0]);  // j / 0. @) W  l; [+ c8 C* x$ [3 D
        }" x, b9 z7 ?: s# O- i. `- W
        WS_Reset();; Y, Y: l$ l: }
}
" u0 _' N5 U- B- X$ r- t# s0 i  }6 T3 T: B
- ~. ?7 s1 O' {8 _/ T2 V

: C& d6 x0 Y2 C: l, d- Q' D1 e0 i
- d! F3 I. s9 l
9 O* K! i% T1 y6 h! a, t

2 W3 M8 Z8 G- P( {% w# a+ E# r% g& J& K& A3 |# E- Q; A: n  D! Z# z

5 D/ A7 g5 T9 ]1 S3 l$ ^2 y0 J# J: V. T
9 n+ C; @" t3 S0 l+ F3 N" `

% U( i; d# i/ y

7 w, |7 p3 m; b$ ^' H2 x9 ~7 t( a' W% r1 Q2 p  k0 V+ ^
1 ~4 W, t+ o" Z- O/ I6 _- M

$ F0 K5 O- b1 X
+ z( L3 [1 a% @' V

8 A) B) g( x( K- u: c2 F# I5 v

% [1 O( h1 k) @& |/********************************************# b2 f: d. L  D- F
* 求绝对值9 t$ F1 s- p' J0 ?3 s% @
********************************************/
' x7 T" D6 K# vunsigned char abs0(int num)
  l; ~! R/ _$ H{
8 l5 y$ f: J4 W& p        if(num>0) return num;
* N1 w9 R. m1 N4 A& {        ) I+ i+ u, [; G! H- q1 ]
        num = -num;$ _; D2 W# U5 `) O5 Z0 c9 J: R' L0 {
        return (unsigned char) num;+ A' N0 _1 y% U% d
}
. X( G( t# |2 ?6 h% y
/ Q* W, @1 w3 @5 m& Q/ n$ [

. W6 u% }% B' R$ V/ t/***********************************************************************************( M, M+ r. a, A( n: @# }3 W- Z
* 颜色渐变算法2 `8 k# O* w$ [/ s( Y3 P# H9 e; G
* 误差 <= 2/ m$ W) o- f+ p4 \6 }$ e9 y
************************************************************************************/
; ^! E4 ^" n- q. ^, Xu32 ColorToColor(unsigned long color0, unsigned long color1)9 Y" }1 |; \$ L
{4 ?0 L5 T9 P$ J1 W# r7 S
        unsigned char Red0, Green0, Blue0;  // 起始三原色
& z7 L- J2 _1 t3 k9 S        unsigned char Red1, Green1, Blue1;  // 结果三原色( T1 g5 w6 u. |  B2 ~/ Z' @
        int                          RedMinus, GreenMinus, BlueMinus;        // 颜色差(color1 - color0)
9 D6 {9 M) f- U        unsigned char NStep;                                                         // 需要几步
; J& d7 l; V9 R/ L6 X% u/ D) u! {        float                  RedStep, GreenStep, BlueStep;                // 各色步进值) `: y: u5 B' B/ {' [- r" j4 P$ f6 \
        unsigned long color;                                                        // 结果色2 M$ E3 g0 I; Y8 j
        unsigned char i;5 ?0 o1 x; I$ a% D/ a0 r! l/ s
        
7 V/ |8 p' E5 I  S        // 绿 红 蓝 三原色分解" ]& ~3 `, |: n8 s, A! h
        Red0   = color0>>8;6 u* \% A# J' R2 e
        Green0 = color0>>16;
7 I+ X: u% d5 i1 E; }5 x' z        Blue0  = color0;
) m" J8 y7 ^+ h  Q4 y& _4 r        
! V  x) O6 ~2 Y$ d0 g6 H        Red1   = color1>>8;
" I( `' k* G9 c) h. T( e; d        Green1 = color1>>16;
4 s# h- X+ z: \( N' _        Blue1  = color1;
2 h$ G; @: o8 F0 g  g6 i7 D        
# q4 W8 O$ ]+ Z) K7 o        // 计算需要多少步(取差值的最大值)
  p! C, R; L6 \+ `$ O        RedMinus   = Red1 - Red0;
" o8 R; g6 d( i* }- C  H: B: D        GreenMinus = Green1 - Green0;
1 A' n: E. Q+ K9 L, x! L/ U        BlueMinus  = Blue1 - Blue0;
) w: C3 j: `, P: m* C' }: x        - J  S4 g+ ?+ e9 I2 E
        NStep = ( abs0(RedMinus) > abs0(GreenMinus) ) ? abs0(RedMinus):abs0(GreenMinus);
/ M) q5 A& d" I: N! n' f        NStep = ( NStep > abs0(BlueMinus) ) ? NStep:abs0(BlueMinus);
9 i3 _$ O" h. @        4 m  Y+ Y$ j2 }5 J4 |
        // 计算出各色步进值
- G2 l0 a- s" a, g1 J; e; `
! {0 b6 W; V! `
( L. f0 K& K7 a  X. X
" g* {7 o6 J" i3 D: f0 @# a
4 B6 p* }9 S9 V2 i8 k# e& v/ h
…………余下代码请下载附件…………0 `/ t4 ?  u; Q0 s. e

6 H# i5 v, I- Y) Y7 |( T: X
2 i2 X) `- Z8 k/ Y4 x  k2 d5 C8 b5 h
* Z  Q6 N. v' d# t+ [( ^
7 }: U$ [4 U: n8 C
; Z$ I/ l7 R: ]# U2 G" o, @# w$ W

% S( Q+ B5 a, u0 p下载:
0 r0 h' k8 K/ l) ^) |* z
游客,如果您要查看本帖隐藏内容请回复
7 O3 Q; L- ~2 a9 \8 O7 `( r
6 q+ X& N) a- O  j) J( _. m
. k, D9 k8 H8 b& A' @

该用户从未签到

2#
发表于 2019-1-17 17:55 | 只看该作者
楼主弄的这个不错

该用户从未签到

3#
发表于 2020-2-8 12:31 | 只看该作者
好帖子学习一下

该用户从未签到

4#
发表于 2020-2-10 10:11 | 只看该作者
wwwwwwwwwwwwww' ]  ~6 _9 K  ?: k  O3 f& B8 i& f

该用户从未签到

6#
发表于 2020-12-9 10:10 | 只看该作者
基于单片机的微波炉课程设计 原理图 仿真和源程序都有" }! l) T+ G5 S. A) i. u. `

该用户从未签到

7#
发表于 2020-12-11 21:39 | 只看该作者
看看                                
# T4 \" }( d7 [- C* S7 ^
  • TA的每日心情
    开心
    2024-8-2 15:57
  • 签到天数: 4 天

    [LV.2]偶尔看看I

    8#
    发表于 2020-12-12 17:05 | 只看该作者
    基于单片机的微波炉课程设计 原理图 仿真和源程序都有

    该用户从未签到

    9#
    发表于 2021-10-28 11:37 | 只看该作者
    非常感谢楼主分享,好东西。。
  • TA的每日心情
    开心
    2022-3-14 15:57
  • 签到天数: 105 天

    [LV.6]常住居民II

    10#
    发表于 2021-10-29 17:23 | 只看该作者
    好帖子学习一下

    该用户从未签到

    11#
    发表于 2022-11-13 07:08 | 只看该作者
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-6-18 04:57 , Processed in 0.093750 second(s), 26 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

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