|
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.h6 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( z1 ], 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: X2 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) ^) |* z7 O3 Q; L- ~2 a9 \8 O7 `( r
6 q+ X& N) a- O j) J( _. m
. k, D9 k8 H8 b& A' @
|
|