|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
51单片机驱动WS2811彩灯源程序和实物图7 |1 f3 ~& R+ R# I2 A4 n* m
B2 J5 S- ?( h4 K
* w! ^4 l% i: I9 ZWS2811是一款可以级联的RGB三色LED灯。只需要一根数据线就可以控制多颗LED。现在发上来整理的库函数,可以直接调用显示函数。( J4 v @0 B1 P5 J
% Q, R: D) g) ^& q/ @5 A R+ E* }9 k
$ n) S$ O& K2 B" z" J- PWS2811.h
9 D' o" D! W/ T1 p2 T1 |9 }3 c
4 ~- Z% u$ g9 k( _8 W5 d" z$ g; y' B* C6 t" \0 E- D3 s+ J; F" Y0 Q
#ifndef __WS2811_H
# n% q8 n2 D J/ A A6 e+ d' |/ ~#define __WS2811_H
- }& [- l5 n i: }- f1 W#include "sys.h"
1 |& t, `! z) Y7 a- G) l& O% N$ ?8 {, v9 }
; S5 r4 X2 r- n8 y, n# n7 W
3 g; [" P. w- K7 v7 k; V( Y w# f
; ?" H+ s5 n" X& J% ^#define White 0xFFFFFF // 白色
1 \3 U. m& E8 x; C9 Z* r#define Black 0x000000 // 黑色! u) I0 f1 w) h0 W+ O; J. z% c5 J
#define Red 0x00ff00 // 红色9 B ~9 l/ w: O- c c! }
#define Green 0xff0000 // 绿色
% ?2 w( f0 M ]# \. f#define Blue 0x0000ff // 蓝色- M$ L& K8 u3 a& k! @6 G
$ l+ h- X D5 r. n' Y# F$ M
/ `* Q8 ]- G7 J8 y6 A1 U; }
2 R! U% w. F4 i" z$ v2 }: c% E
$ f( n! _$ n& [* ^& P#define nWs 16 // 有多少颗WS2811级联; e8 U- S9 @ n1 j
& |" d. m" r9 ~. q, {1 M. r0 d' b+ y q
: P, S* f, ]2 v# R* ~1 b
extern unsigned long WsDat[]; ^7 U0 N6 s2 Z$ Q/ `9 P3 R
* u$ J; o3 y5 q0 Y7 X8 T, v
* N7 j* T3 a8 ?; _( V/ l; P' _8 n* Kextern void WS_Init(void);
; X! ?1 \% L O) p5 a1 t' Eextern void WS_SetAll(void);
# v! `: Q7 ?+ n4 _extern u32 ColorToColor(unsigned long color0, unsigned long color1);4 @. G8 V |' ^/ i/ ^, M
2 G; r) l" U" O) o" Q+ [ m; k" N2 X! v; S& T* f
. v5 a7 y9 b' a4 [
#endif
* t1 y ~4 h9 k" L8 v# S4 Y! ^$ _2 d" r" w" B# U! X: F! u
% m" A! d4 f7 }0 V5 a' v7 w
- N4 L% m$ M" h) k- n z. I/****************************************************************************************8 k2 Q* J, x" [' v2 q
* WS2811 彩灯驱动函数9 x3 a1 H Z o
*! H9 \5 t: M0 t/ }% Q
* 调用方法:
q3 S* `3 v. r X+ b z* 修改宏定义: #define nWs 1 // 有多少颗WS2811级联
9 \1 R7 t* v/ z3 Z6 y7 m* WS_Init(); // IO初始化
+ C$ s; _. T m& q6 ]0 L4 {; x* WsDat[0] = 0x808080;//显存赋值' E; d, G& t! @, w: M3 N
* WS_SetAll(); // 发送数据
) t, F1 b! g ?6 @* ColorToColor(unsigned long color0, unsigned long color1);// 颜色渐变算法- R+ B8 E: q2 \% V1 A) l* g
*
+ d& Q) k8 H4 j, u* 作者:星希望(已校验)+ s: v" H$ x7 }, c6 {6 t7 s
* 日期:2015年6月24日* `7 h" I r ^' [# n4 C. u
****************************************************************************************/
' S, T1 N8 {9 Y5 Y8 R#include "sys.h"0 G/ U& T# X- g- {' { ~, {( A
#include , N U6 Z! K. p! x) p
#include "WS2811.h"2 [6 c0 d& G" Y3 r1 `
#include "delay.h"0 _7 G% r7 F/ E4 C% u+ H& I
1 { o$ Q( r& ]# V/ x* p/* 显存 */8 n: k4 B2 K1 i: I
unsigned long WsDat[nWs];
, i6 {" O |! o0 d: {2 J0 Z
" _! J/ o; Q I) t0 @+ z2 I; G3 B( u& H% N; f# b
/ {. x$ L2 H* ^) W1 |. D& k! y8 N/ S2 ~3 x5 H8 V
/**************************************************************************************% i. k( z) f k$ T
* IO初始化(移植时请修改)
) c+ d8 ~$ b8 {" y**************************************************************************************/
4 x+ g- _# @3 n7 w X' G/ X' p9 H, o" nvoid WS_Init()" B. ~( V- z( R
{
E6 c. J' {) J! T( v GPIO_InitTypeDef GPIO_InitStructure; {1 v4 r+ O( Z& q
: H6 |0 m% k7 w5 S h; v! p p //端口时钟,使能- N3 M% p- u) a% J5 y
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE ); / F/ R* @% Q% p8 s3 X
3 C6 O( G2 B" p- G. L+ g# M. Q; f6 [
$ z' N4 g8 Y& i" v0 a* M& c // 端口配置
1 I7 F/ O' Z5 @" Y2 Z2 \% _( [ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; // PIN" A: j2 Z( @2 P* {5 o# P6 @
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出4 K( T7 w( k' }* C% S: x; B/ C7 p
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // IO口速度为50MHz( i! V9 w5 @. m3 r* k7 [
GPIO_Init(GPIOA, &GPIO_InitStructure); // 根据设定参数初始化
" ]8 W7 k! ]9 c" Q. {" U}% f* U, T4 c% ?1 f: a) t; q
3 S: g# Q' a7 r8 c& U8 }6 F# ]. |7 ?) L
/**************************% s; j" n! o1 O$ L8 G; `
* 内部延时# j0 x+ Z7 D' a& P7 W, T* U6 K6 m
***************************/: y. X/ G" b4 E0 g# Q W: J+ h* [
void delay2us()8 a& m2 i6 `5 t( z3 x
{4 m* B% r( N/ K
unsigned char i;
2 _# U5 I( y( B; U5 \8 x' C for(i=0; i<12; i++);3 ~: r; C$ t0 Q
}
# h- s- ]& Y: M4 e, ?" A9 \) I8 Ovoid delay05us()
+ L; I" ]/ E1 H; u{
) Y+ q, L4 [! w unsigned char i;
* V8 I5 v" h$ A$ s) b3 W7 I for(i=0; i<1; i++);
' `+ g! o6 T6 j6 ?}9 b7 K% g; S* M: [; p
& u- Z: s/ @9 `. ] W! l, F+ e- q/ V; i
/***************************3 x8 N% G5 X+ A0 [$ J- v. \
* 发送一比特+ _2 ?- Z# T n/ L/ y+ c" P8 U0 }4 A
****************************/
5 |5 w# t) Q Nvoid TX0() { PAout(0) = 1; delay05us(); PAout(0) = 0; delay2us(); } // 发送0% Q0 {. q% m- Q% b2 |
void TX1() { PAout(0) = 1; delay2us(); PAout(0) = 0; delay05us(); } // 发送1
' V: X P( ` hvoid WS_Reset() { PAout(0) = 0; delay_us(60); PAout(0) = 1; PAout(0) = 0; }
$ N' T6 y5 Z1 Q" _3 a4 Y ^3 j" K7 c' v4 n, L" y8 m
( I3 P& C. ^3 t/**************************************************************************************
7 i$ d( q9 K% s5 n( G8 @! L* c& Z$ w* 发送一字节
2 K1 ]1 Y/ s' l9 _! w! O9 W**************************************************************************************/9 ~7 V9 X7 _, [; i# @$ X4 C9 U
void WS_Set1(unsigned long dat). h( D) ]6 Y7 u+ T$ T! `
{9 P7 j, P( d3 `" K6 x
unsigned char i;5 n. `$ o s4 | H' U% w# A
! J4 d4 u2 g( D& x4 f for(i=0; i<24; i++)
: }2 n8 t% }- P, C {! t, W w; V4 b
if(0x800000 == (dat & 0x800000) ) TX1();2 a# n8 o; Q6 f( X- u
else TX0();7 h* f* F0 r; p" O$ R5 G9 e
dat<<=1; //左移一位
" T% F: a2 F; n }
" x! N% }2 @& {9 a6 g}( t" B. R/ w# }" O
$ c8 @: O+ Y, S7 b5 n) ^ i' u% ^7 w( F. A8 Q- `
/**************************************************************************************7 N8 e% F9 f. S; L8 n! a
* 发送所有字节% t, V# z3 f0 B* E3 s! R$ H
**************************************************************************************/. r9 Z# U6 A$ ?, d" M
void WS_SetAll()! k+ {8 ]* U8 F9 C1 j
{
& Y4 x6 G; Z; f" B unsigned char j;
1 T8 b6 g2 I5 N3 l ' w( U- @1 T: ~- N; L
for(j=0; j<nws; j++)2 x4 i5 S$ q+ n3 A) E
{
0 j( N8 [: R6 z( Z3 V! v# C WS_Set1(WsDat[0]); // j / 09 j# }% N! b$ _# U" e# l6 ]
}
5 j3 F8 v2 ?, d0 ]! Q WS_Reset();
6 W, J B% d' ~9 ?1 E$ s# ]: l, U- G/ j}
% [. Y; _6 h0 S/ g2 H7 \- Z4 E1 n" x. K3 E7 @1 P
+ _2 U% g& D# v9 Z) ~6 o% d% a
9 w+ j% p1 e! v
9 P1 u! T! U5 \8 {% e% V0 C
0 ^1 V+ J" G" Z# W5 }) ^3 V# h) K, I: T; ?% y# R
% t# x6 q8 Y% k7 V% i* v3 l5 U& H* e7 Z) f
& ?# N% S3 d2 |) w( H: }; G5 `) @
" q x: d' t2 y( o0 }" N! h
3 b0 W5 j, p/ a) {, p1 \7 _1 W1 P9 z8 o% b: S
) {; S$ I3 e1 Z. e: R# _% p) z _* c$ m F; r7 s7 |( b
! v1 U3 `, }* K6 \) r1 C) g6 n% h
' B, @# J9 b# P, W5 U& g; n: ?5 a9 a. l- B% J6 ?* v
% z7 t, S( f& B( a) J p3 p/********************************************
7 d) c8 J& m& `, Y/ T9 e! W( }* 求绝对值* P7 E* {6 [# o, G4 a
********************************************/
" m% w7 G8 x0 G" Y& p" M/ m7 Yunsigned char abs0(int num)1 E5 F1 c+ `6 @/ L5 n* ^
{
7 l' E/ |0 I' t1 g7 w$ x if(num>0) return num;# J: D- H6 z! x! E
( X" a F$ k! I' h
num = -num;) G7 S8 n: |" b1 {
return (unsigned char) num;- Y( m$ V9 v) Y. h, T) Z0 \
}2 N( R! M: n! P" Y, W9 z
4 ?# S# Y q% t, x8 n, B
* K' { @7 K' r9 [' H \
/***********************************************************************************
/ n) l, T4 K! s% ~- K* 颜色渐变算法2 V W! X% z: u% f8 ?1 @
* 误差 <= 2# O& @: H" L5 \: ~* j& T
************************************************************************************/: M h) K. q1 A$ K* X+ f+ A
u32 ColorToColor(unsigned long color0, unsigned long color1); }; U3 l2 L4 d' w4 s, O# i
{
, v2 h0 Z' @2 w unsigned char Red0, Green0, Blue0; // 起始三原色
8 ^% _' g1 H) g unsigned char Red1, Green1, Blue1; // 结果三原色6 j. O* K7 z" B0 s5 `0 g
int RedMinus, GreenMinus, BlueMinus; // 颜色差(color1 - color0)
4 D7 Z- e$ j9 K6 y# L; h9 Q unsigned char NStep; // 需要几步
- d* D$ f+ [( v# m% j' Q: c float RedStep, GreenStep, BlueStep; // 各色步进值
5 a$ [# b' S$ b' p unsigned long color; // 结果色
9 I# u3 ]$ M1 l1 w$ F+ R& E unsigned char i;; G! m @# d8 e% ~/ |
1 ^' @6 z4 S! q1 X0 m! C
// 绿 红 蓝 三原色分解
& Z* i9 i* `8 |7 U9 |6 m Red0 = color0>>8;
9 ~3 T) y/ g' Y9 G4 ]; x6 i( a0 M Green0 = color0>>16;( ?8 }+ Z$ F: B
Blue0 = color0;6 d# R% |" { ?- D" ~, ^
4 H+ ~5 e" K6 Q) f% ?) E, I( ~
Red1 = color1>>8;
' G' ]- ?* w2 ? Green1 = color1>>16;
9 V h: Q4 J/ d% o7 r7 ^! N+ L; H Blue1 = color1;3 | w0 w8 g' X% x5 `) Z5 J
. i! O+ l2 V6 |4 V' s; i
// 计算需要多少步(取差值的最大值)
( }" d- H) l$ f" n, j$ @* w5 w RedMinus = Red1 - Red0;
$ a/ ~" F& u/ j5 b GreenMinus = Green1 - Green0;
3 I8 i% o6 j8 T# c. S6 e' u BlueMinus = Blue1 - Blue0;6 S) d: i4 Z& c* f, V
2 [! O: ?% q k5 z2 E) j NStep = ( abs0(RedMinus) > abs0(GreenMinus) ) ? abs0(RedMinus):abs0(GreenMinus);
9 j$ ]% ~( P. O' M NStep = ( NStep > abs0(BlueMinus) ) ? NStep:abs0(BlueMinus); ^; H9 \; e4 \; i1 E( b2 C6 K
8 k6 A2 V' B0 \. v0 j5 ~ // 计算出各色步进值
, R/ m' l/ m& A# l- c( h( N4 u4 T1 b$ g+ N+ q$ I) n. a" g
# f: [. W- I- @' y
R4 n% C, y6 l: E+ @7 |6 s0 W
" P" U( w+ x' U…………余下代码请下载附件…………2 T' d+ ]/ b8 ?4 v" j: s
3 j# {& N* R6 ]
S- l/ l3 g" \& U$ \5 n, K# \8 v4 q" g/ E* m
% v8 E) v$ j% r- |
% H, _ B6 Z$ K4 J/ R! Q) b F; _2 w
下载:
$ {- q% |- N- N; k+ H1 B- S- u0 J( z; |" V" O2 Y2 C
( @# v1 n0 f' |
* f" A6 \! D1 N- y/ G" ` |
|