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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
51单片机驱动WS2811彩灯源程序和实物图
* o2 Y7 ?( n* S5 l& h* C# ]! j
# z, Z; X& u; V* L- Q# b

/ _  d" C4 ?, i9 s6 F' WWS2811是一款可以级联的RGB三色LED灯。只需要一根数据线就可以控制多颗LED。现在发上来整理的库函数,可以直接调用显示函数。% @& x' G: K0 C: l4 e

% W% W9 {! T, {7 R, @8 u9 J7 y+ J
3 ^) f3 [7 Q% iWS2811.h

& f5 i" F3 [7 y% A  {+ |, J, E& P, l4 R+ v) |6 J+ b4 \

5 g, _3 ], p5 U8 @  `#ifndef __WS2811_H
0 M, L) \4 S, u#define __WS2811_H         * A. g/ g6 J0 v/ R' z- `0 c
#include "sys.h"4 s8 n/ @/ h$ `7 q
) p! k8 u) T) ]/ y+ y, P: F" O! k3 Y

* ]7 q+ P, k9 w$ X' G# d1 o
) [, |- Z7 E: U4 w* ^/ p! `6 ?2 l7 H

  w+ x" L0 {- y/ t& \( R' M. F$ R5 R#define White       0xFFFFFF  // 白色2 H! b4 H" {. {- W% E
#define Black       0x000000  // 黑色
7 n# Y& U' H1 e$ J4 ^6 [4 }#define Red         0x00ff00  // 红色
6 ~9 h% B2 w. \2 [3 }! m2 k9 \5 c#define Green       0xff0000  // 绿色$ j$ s' r% ]' J+ G! S9 ?
#define Blue        0x0000ff  // 蓝色
" ?- U9 U* c9 @! K4 d$ s6 j1 x+ \, h3 C0 a4 W+ c# [' Y) ~

9 Q) c8 f$ Y3 ~; S) `: ]* |$ D& j! z. O  R0 \, Z

! X4 b1 c1 w, \/ k5 f, r#define nWs 16                // 有多少颗WS2811级联& R/ {0 K5 u2 n8 x6 L1 R2 `
7 ]1 f; Y: t/ O' J! p
/ q+ x- S0 B$ G& Z( |
extern unsigned long WsDat[];
( m  K9 y9 N4 k; Z6 O( d
, a7 s( `8 ]6 F. x
! h+ C$ p6 U7 `- N/ {. A8 q
extern void WS_Init(void);% {4 O! o( f4 M( T5 F1 H9 `" {
extern void WS_SetAll(void);9 y/ z( P/ G4 _" M2 Y/ [/ o0 Z
extern u32 ColorToColor(unsigned long color0, unsigned long color1);) e: D. b( ^8 x: v! [" @% {
2 W+ r  m; p+ Y9 \

/ \% P& g8 c1 H( K9 y" A                                                     5 H$ H" `8 e$ {, m; n( e7 l: U
#endif
' `5 P. g( D( c
6 Y9 U5 s" z+ x3 R& M3 i6 l* v3 J
$ t+ U/ h" x7 e! w$ z* N
: j& \' {  \0 o9 a: X/****************************************************************************************
( t1 h9 t, V; F* s* L; x* WS2811 彩灯驱动函数
3 e6 a3 J* k' ~*' c5 B4 ], V/ j3 K) G* o! b8 e" L, P
* 调用方法:
3 k0 n2 j* F5 a) W8 f*        修改宏定义: #define nWs 1        // 有多少颗WS2811级联
3 `% y4 g# t( D- L! r/ k*        WS_Init();        // IO初始化& ]1 {0 _& D& l/ ]) ]
*        WsDat[0] = 0x808080;//显存赋值
7 E, y. J! t  H; a*        WS_SetAll();  // 发送数据! g5 T* g- K- E$ X
*        ColorToColor(unsigned long color0, unsigned long color1);// 颜色渐变算法( A, N/ w8 E5 o' t! g; }# \
*
8 h4 A3 {7 U5 X' w8 O* C% K$ L* 作者:星希望(已校验)( D' W6 W! i( Z4 y, y
* 日期:2015年6月24日9 y0 X+ O" f5 K
****************************************************************************************/
5 C& H6 y" d5 @: n9 w9 x9 L  M#include "sys.h"
) q; K* l* ]6 P  k& f# O7 C#include ( B9 P0 y; B5 ~4 t$ }
#include "WS2811.h"
) i- I2 y2 W6 F0 a% [, x#include "delay.h"9 w1 ^, Y* `+ P
        
) S% a" C* B- T) Q& l1 D/* 显存 */1 h- T* j8 l% r( ~6 X
unsigned long WsDat[nWs];) `+ m9 p0 j$ X8 q' ?0 }, X: @; p8 x. U

( G2 S: a3 r0 e! {

0 @6 L8 V1 N+ Z6 f# a: V
  S: S" w1 s  R  Z( t1 R

- d, [9 U/ d- H4 N, t* t4 K7 x8 U& J/**************************************************************************************
" e$ c  B) }1 Y' m* IO初始化(移植时请修改)
5 E* r8 `- e, B, y0 C# @**************************************************************************************/
3 W0 y; L/ j5 w& y) Nvoid WS_Init()
" S! g2 J# i! D{
- d$ D* F4 M3 m        GPIO_InitTypeDef  GPIO_InitStructure;        - o& j, I5 s! C* o9 `
        
+ P, T6 n5 j2 Y+ i        //端口时钟,使能9 E& b. j/ h( j3 h8 b% q0 n8 f
        RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE );         
- b% T% \9 g* }/ G  Q9 S! R. Y. k) _% Z' E5 X
; s9 ?" B' ^4 _6 o  M! c+ e: `
        // 端口配置7 E$ U5 P7 r, }
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;                                // PIN3 m1 N" D4 }! b4 M$ P6 y
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                 // 推挽输出
8 ?3 u8 l% q/ l# E7 B        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                // IO口速度为50MHz
3 F! I9 K& Y# @/ x  h! J! s5 o        GPIO_Init(GPIOA, &GPIO_InitStructure);                                        // 根据设定参数初始化
; e/ X: Z) @% D8 T- [4 R- g}5 d8 N  H5 K: k7 o. r* {3 Z4 X5 {0 X
/ ~- @5 i- p" p2 {7 z/ l" x
+ V/ N% E0 m% f) f
/**************************
1 f# g/ X2 Z5 M! p7 z0 M2 b' b: P- ?* 内部延时
" ?1 a; d, O" ~$ q) W4 |***************************/
; [% l. o+ H* r4 Y4 u7 Rvoid delay2us()
# S& f2 u" @: T1 b1 D# a{
) f" D5 J5 L, V+ B        unsigned char i;0 H* R/ Y9 X1 v
        for(i=0; i<12; i++);9 x/ ^# J, t& t0 n& T- a% h" k
}
" @2 g3 N6 x: E2 M; ~void delay05us(); V& y. Y* M, C& V* t
{% g5 R8 ]7 X4 k1 F. Z% T% a+ e
        unsigned char i;; k- R/ Y; g# z4 q: E* N6 _: Q
        for(i=0; i<1; i++);6 n$ H6 i% s% R) x! O6 H! z' s
}7 F# d. B0 \2 x. C) C
8 M4 b1 |0 [0 a/ d

0 [8 c' ?; {: d: b% r6 M: Z/ ^/***************************
) y7 f. G( C: `. u1 I  Q* 发送一比特# J" h1 p; z6 J* o
****************************/
" Y* t) M( i8 X" ^/ ~void TX0()          { PAout(0) = 1; delay05us(); PAout(0) = 0; delay2us(); } // 发送0
6 w$ Z/ |( g" y- r  Z5 ~void TX1()          { PAout(0) = 1; delay2us();  PAout(0) = 0; delay05us(); } // 发送1( e4 y# e4 T) U
void WS_Reset() { PAout(0) = 0; delay_us(60);  PAout(0) = 1; PAout(0) = 0; }
' Y7 E* m* ]6 Y# ?$ V  p% x6 G* u8 _7 k  i: Y1 ?( D! o6 S
& H' r5 e0 d9 Y3 Q, c
/**************************************************************************************
# c# g# X. D: C" G3 W: `) F* 发送一字节
+ J, Z8 X! d: L  L" E- @**************************************************************************************/
4 U. ]5 W+ ~1 T2 n7 \" Yvoid WS_Set1(unsigned long dat)
6 p* d) y* D$ y. Q' H) ^{
4 ?& T& E5 i% g9 o7 [1 ~        unsigned char i;# z' @  n( i  f
        2 S+ y7 z: d$ ^9 Z! ?- E
        for(i=0; i<24; i++)
6 f2 g7 e8 i2 A4 K: z: R        {
3 R5 L& b7 p2 Q  t6 Q' J                if(0x800000 == (dat & 0x800000) )        TX1();4 v! v5 e. j2 ~! d# O) B4 I
                else                                                                TX0();
! `2 K9 u1 D5 p. a0 N                dat<<=1;                                                        //左移一位' p; |! J6 q5 E- |# g' S* d
        }" ^, j( C; Y' w8 ]
}2 z0 ?9 T. a) x2 V
: r& s: B& ^$ m0 G9 [: l
8 j. e# Z: c0 s: C0 P
/**************************************************************************************9 x% `  l0 R- S* J
* 发送所有字节" O; w5 e0 E& `; X* o/ T
**************************************************************************************/$ ^- F+ P  v7 P# T% w; i" K* h
void WS_SetAll()
: W/ l$ W  {8 L5 z/ v{! l) n' d" V2 N. S; J2 a6 _. }3 D
        unsigned char j;2 s1 J* \9 P5 R2 _3 A4 P2 f8 u6 f
        
6 p* U' r/ h! r, u        for(j=0; j<nws; j++)( o( _" c$ p% a2 O' l9 Q) @
        {8 J9 r/ K6 q+ Z$ W' ^
                WS_Set1(WsDat[0]);  // j / 0% M6 J, o( B: i( J8 U
        }
" ?: U0 {) ~( E& q  x7 @( E" F; E        WS_Reset();
: u# i8 I/ }3 b) V- _}
/ `( o3 A( N/ {, n
: G& W- D. [3 C. C3 t

) K  J  @; j0 e' N- m! b. Q9 x$ c7 X$ f& p* H
$ ]3 }. }# }4 }0 _  s4 s$ F9 s

' Y  j: p6 C& T

! ?# Y5 P& G$ P, A
$ O: P9 l/ ]- N) N! X2 a" X

9 X; `: c7 J2 T) B( S
: D( Y4 p8 M' c# Q% W

5 ~1 q6 x' F  I6 i5 }8 x3 h. u9 i. r' g- J+ z( G2 n
- W+ A4 H% M# r; m: p" ^" S7 ]
% j* F1 L- V1 O$ ]

- G7 {: M$ l3 b, V  W2 L: L8 _" L
; Y+ b+ u* V6 ]! b/ N% i( |
( L3 ]& ?, d) Q8 ?' b3 w

1 k! p3 M3 S- n, _; f6 c$ e& Q

; H, q0 B% h, n* ~# G0 b/********************************************  p: ^& E0 o# C' t
* 求绝对值
' b# d7 _+ X& j( T% \0 b********************************************/6 J/ E% ^( v3 B6 j
unsigned char abs0(int num)4 s* {6 g) e$ L- m8 f- c: u. X: N
{
$ x7 X8 R" P+ E1 ~  [        if(num>0) return num;
) N& j( |5 x* x' y        ; @1 d* ^% K- {; ?
        num = -num;
+ @- n$ E1 T2 s5 X9 O8 |        return (unsigned char) num;' ^) }: T2 u4 v. b: z
}, h( p! H$ j% Z# @' a
/ J2 w2 m& I4 U% c

5 |; u' U, \; X: d) e/***********************************************************************************4 @0 |! F' n6 f1 Y
* 颜色渐变算法
% {# p/ h" D* k8 D, v0 c, u* 误差 <= 21 _7 C$ [- X" p" }# T
************************************************************************************/4 k$ Z6 y( ?( Z, k) ~
u32 ColorToColor(unsigned long color0, unsigned long color1). A8 J; O9 k9 D4 W8 n/ e
{) o# `, S2 L: [1 a
        unsigned char Red0, Green0, Blue0;  // 起始三原色
+ \! [( F0 I1 C0 r, _7 A) M        unsigned char Red1, Green1, Blue1;  // 结果三原色  G; {+ d7 N2 g3 r6 g, g
        int                          RedMinus, GreenMinus, BlueMinus;        // 颜色差(color1 - color0)( z* G$ |0 b+ i" R, e: g
        unsigned char NStep;                                                         // 需要几步5 n- R" _1 z3 C% _& o. z: a7 ?9 D, {
        float                  RedStep, GreenStep, BlueStep;                // 各色步进值- w) }+ J, l8 r  r  f) k
        unsigned long color;                                                        // 结果色5 @5 p+ |0 }: f& R& a" b
        unsigned char i;, X- J/ Z! ?( W
        
4 f# ^- t2 |; |2 |" R        // 绿 红 蓝 三原色分解9 [* n# S! L. Z6 @8 @
        Red0   = color0>>8;
  _* u; x" e, j# l) g1 \9 j0 F+ d        Green0 = color0>>16;
* a+ m+ Y) l. c3 B+ ~/ L& n        Blue0  = color0;0 P# H- Z" N) m1 c* ?& t  [
        6 A7 x9 D1 X) ^8 `
        Red1   = color1>>8;. u) T( a1 D8 @, j
        Green1 = color1>>16;
7 Z1 [: I  D% O" R/ E$ S4 x* p        Blue1  = color1;
% z+ P$ }( K0 [/ G4 o( e        $ `: q" Z3 k5 v0 Z6 @) E# |' V
        // 计算需要多少步(取差值的最大值)
2 |6 D0 s: _* n! L        RedMinus   = Red1 - Red0; " H6 k! i1 [! Z" t- q4 y
        GreenMinus = Green1 - Green0;
- m0 s5 `1 N7 V        BlueMinus  = Blue1 - Blue0;) R6 I, H6 ~9 v
        + S/ }8 c5 p% _3 @6 ~
        NStep = ( abs0(RedMinus) > abs0(GreenMinus) ) ? abs0(RedMinus):abs0(GreenMinus);& m  c3 K6 @% ~4 k: K/ T
        NStep = ( NStep > abs0(BlueMinus) ) ? NStep:abs0(BlueMinus);% N" `4 W1 z1 D- h7 ]2 q' v% |. n
        $ q1 S0 G% |5 P/ R
        // 计算出各色步进值9 d& d+ s! w, X7 S: Z

2 p% s: n' y/ @9 V1 b

9 [8 E6 x2 u# }% U' j' c
- o" J3 f$ q$ Q, T( b4 j& b& B

" b9 c: P. m$ {, V; A: i+ {8 k' v…………余下代码请下载附件…………9 s2 B: V8 [8 D( V- n' N, a

2 p- F. T1 I& ^3 ?
* x' B& p& l  d+ ^5 P/ S
# N, Z1 F4 m" O1 H& S% L4 L
' Q+ J8 r% O# ^" R

9 @9 w9 s- f' f4 {  h" T  C
) L9 o. {( o9 _# y0 K- W
下载:; V. Z- }" I" l1 \' [+ b; i$ H
游客,如果您要查看本帖隐藏内容请回复
% S" F) {  k  a3 m4 V
2 w2 D# d  Q4 U1 Q* g

9 c4 {* y& n- m4 g

该用户从未签到

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

该用户从未签到

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

该用户从未签到

4#
发表于 2020-2-10 10:11 | 只看该作者
wwwwwwwwwwwwww
: B) K5 l2 q0 _

该用户从未签到

6#
发表于 2020-12-9 10:10 | 只看该作者
基于单片机的微波炉课程设计 原理图 仿真和源程序都有/ l" H* ]: }' N/ ^, {% m: Z  y  G

该用户从未签到

7#
发表于 2020-12-11 21:39 | 只看该作者
看看                                
8 B9 Y; M4 |3 c. J! J
  • 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-10-8 18:50 , Processed in 0.156250 second(s), 26 queries , Gzip On.

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

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

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