|
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 |
|