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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
51单片机驱动WS2811彩灯源程序和实物图% ?$ s- n; p# X8 o" y
& ?, d9 X0 i2 X: i) z2 e. @
4 D6 ^* R& c; K! A
WS2811是一款可以级联的RGB三色LED灯。只需要一根数据线就可以控制多颗LED。现在发上来整理的库函数,可以直接调用显示函数。
+ l8 p) V1 q! ^ 2 z# f, h/ R8 P6 s' y1 ]% Q- T

) N9 L9 S7 r' D1 i9 A: x9 gWS2811.h

2 |9 W/ w  ~+ Z9 v0 J% r% O; q' {7 t: U; a
4 g# U4 [) f! n: p; v3 D3 k0 V1 O

' W1 {8 a  X# w: {6 x, P) ?#ifndef __WS2811_H
1 m% {  J) Q) W% l, }2 w) C0 C4 V#define __WS2811_H         
) d( z0 w) ?& R0 M#include "sys.h"
! \) p6 h1 s  x" D( Y4 ^. |& Q! X* d, \" U9 P& s5 l
4 H1 x* F7 M* c9 T6 L# |( l
% W. k5 X% R, E- f& L

1 |4 n' ^' Y  z( f) b; s# v#define White       0xFFFFFF  // 白色% |5 U9 L: V0 J% D- K
#define Black       0x000000  // 黑色
5 P0 d( f! c% t; ~2 u6 E' ?9 J#define Red         0x00ff00  // 红色
: @  Y4 _0 g6 i4 z8 ?#define Green       0xff0000  // 绿色
1 b& V4 j+ t! v' H#define Blue        0x0000ff  // 蓝色
8 x  t6 ^, _: ?" S. p: e- ]9 B

- ?6 N  G' g' `$ M- V4 z& Q( _& [* t# k% @$ N9 {9 S
% b8 b( j  V6 D9 f' r6 B9 i! K
#define nWs 16                // 有多少颗WS2811级联
: h: S3 @4 N" I. D. L3 f( o  E8 U. q% _) ^) A2 `: Z9 E
/ `0 x4 p. G* [3 E; s
extern unsigned long WsDat[];! t- |8 O5 t( ~4 U
  X( U2 y0 C0 T1 P3 O9 I" W

! W. a4 T: C; l& i- cextern void WS_Init(void);8 r6 S, t7 M* }# [
extern void WS_SetAll(void);4 L. }* J& L2 O! T! f8 V' r( A
extern u32 ColorToColor(unsigned long color0, unsigned long color1);7 u- u/ S# d$ F/ q, i5 x

  l1 J2 q; {4 H
0 {* u& P, m& \" S' Q, P; ]
                                                     4 J: L+ `) `: r, N4 v
#endif
$ x- s& V, @  u" u% o" I, B; \* b7 t
  `9 A6 H1 i. a- f4 m( s; a3 s' ?! I4 `0 j9 g$ d6 B; q

5 j3 r2 B+ x# D7 I/****************************************************************************************- W9 `/ F/ x3 k
* WS2811 彩灯驱动函数" ~0 e' K% c8 \1 s8 [9 d
*1 C) N: |  b) `: u7 {+ p5 p3 p
* 调用方法:, B: F' u. M5 H" F
*        修改宏定义: #define nWs 1        // 有多少颗WS2811级联. d! C# [, V+ Q/ P; ~2 W$ K# K9 |1 J
*        WS_Init();        // IO初始化
8 j6 H. z0 {5 }+ f0 _5 I*        WsDat[0] = 0x808080;//显存赋值4 _9 {2 e% f7 ?9 l! \. M; z+ W9 c
*        WS_SetAll();  // 发送数据
7 S7 u$ `9 F7 \( [3 p*        ColorToColor(unsigned long color0, unsigned long color1);// 颜色渐变算法
$ C; k* l5 r  S0 Z6 w. n6 f1 o*
/ T( P  H  D+ e/ i/ v* [& O9 L* 作者:星希望(已校验)# l7 u+ u5 ]1 w: Q" X% z
* 日期:2015年6月24日
) ~9 ~4 B1 N/ ~' w****************************************************************************************/- L  A% _+ B& ^0 m" m
#include "sys.h"7 y, c2 m+ W0 a/ N. p; K
#include
, v- |7 A, D: }7 @. Q1 c0 T#include "WS2811.h"' A2 |6 R8 W# t
#include "delay.h"
3 x4 {, L: V. X+ Q. }        % L+ P- V0 K! ?( g8 z
/* 显存 */& T2 S  ?. B* i' f/ A
unsigned long WsDat[nWs];
; M, }* w* u' u" |
  g2 t& \* O+ n/ w# l

0 k3 J% G7 A7 h: c% G+ b
' B" A$ o$ ], J9 O) J: [, v+ H
' ^$ D" S8 b, N" {5 p8 F) D! L
/**************************************************************************************$ _- z4 ?. X8 k9 N: r8 k$ [
* IO初始化(移植时请修改)
0 k* s6 M3 R2 h**************************************************************************************/6 A3 m( F" ^4 ]- ]* b  r
void WS_Init()
7 l# h# p6 X* c) f: Z{
* U( s' [4 e7 M# Q; }7 i% s        GPIO_InitTypeDef  GPIO_InitStructure;        
3 ^6 O: A) @/ K0 n        
. N6 Q& l7 {8 ^0 x        //端口时钟,使能$ Z4 G" [+ \+ }. g
        RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE );         2 r. k2 W9 B3 y3 v$ h3 X; f+ h

6 C5 C* z: F( {' ?+ q& u/ u

" ^* [3 G; _& d' q! f! b& v7 w        // 端口配置' o$ d5 L% @( g9 I/ a
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;                                // PIN( _, B! p! b  m' f
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                 // 推挽输出
' R9 f) n2 g4 G! _% F" C        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                // IO口速度为50MHz+ g$ t) q) ]+ |, i; R8 l
        GPIO_Init(GPIOA, &GPIO_InitStructure);                                        // 根据设定参数初始化
  g# Y) C8 |" L2 ^, e8 F}
, V9 H' X3 U5 G' {2 ^# K' n( M4 ~0 a& Y9 j  Q
7 _2 [) w2 l# Q" u* ?, u" _  D6 |
/**************************
+ u/ r# G9 Y% P5 l0 e: C- H* 内部延时9 Z$ O8 @) ?! o  _9 E
***************************/
2 U, H8 B5 g/ N3 t! zvoid delay2us()
" y( j' H  [: j9 t{8 `; E( N% R' W$ J  g
        unsigned char i;
% v: z- g+ x- d* `4 R        for(i=0; i<12; i++);# K2 E" C2 c7 x: k9 @! y# N9 t
}
7 M2 `5 }" D$ q4 d6 ^void delay05us()2 N: [: Z& @/ b9 k9 S
{$ i/ h) S% |1 n
        unsigned char i;
& E7 N" O: c0 C/ I) @  G        for(i=0; i<1; i++);( Y% E) N! x' c* k* b
}
# H! k8 z0 {9 p
! I( ^) N9 |1 J. T% t" T
0 }) T  n$ w7 }
/***************************
% @! Y' v, S0 P* 发送一比特
; V& [+ G; U# O% i9 f9 F4 q( w****************************/5 H3 ?' g$ v. b' A- Y7 v% J
void TX0()          { PAout(0) = 1; delay05us(); PAout(0) = 0; delay2us(); } // 发送03 A* b3 D! a- M$ m& v& v; i* A
void TX1()          { PAout(0) = 1; delay2us();  PAout(0) = 0; delay05us(); } // 发送1
4 W- t) S4 q6 xvoid WS_Reset() { PAout(0) = 0; delay_us(60);  PAout(0) = 1; PAout(0) = 0; }
' B# W# y/ C- C1 h. U8 A5 }" s/ [3 s+ ?! J$ B7 P8 c
+ |* S3 p" o" [) c
/**************************************************************************************
% p3 {- f" P+ b  L" }* 发送一字节1 I$ A/ l" e/ C; J- F% s
**************************************************************************************/
7 k) a( T" B. u& q0 Zvoid WS_Set1(unsigned long dat)
+ P! a  Q3 @6 \' y{  ?* ]- Z4 d& g, F- J# A
        unsigned char i;
5 i9 v" g4 j8 H1 i' R0 L* Z$ H        
/ S4 C* H# p0 }% N        for(i=0; i<24; i++)
! g8 r- d: g$ _* ~* F        {8 X; ~: Y- z3 v" m, d3 D0 C7 C
                if(0x800000 == (dat & 0x800000) )        TX1();
4 t* p5 K5 i% e; c7 e: F4 `; `0 J                else                                                                TX0();$ U2 p; U6 `. f  R( f' y
                dat<<=1;                                                        //左移一位
6 X- {: K3 M. ^8 }5 @0 J! C' I1 s% D        }
: ?" o; R4 l: `  w! D}
6 P) ^* N6 q3 `: @: h% l  D, |
9 E  k. o9 }# V$ N, h7 ~. m
/ k6 p; i1 p& H' x5 h7 P0 k
/**************************************************************************************9 A1 p: q' C3 u1 V  ?. H& o( u$ e
* 发送所有字节9 E% |) E: E; `
**************************************************************************************/
5 d4 c0 B/ X( N' ]5 l0 pvoid WS_SetAll()
# Q0 L/ A4 v  H3 W5 R) h{
" o! u3 s3 x" r" \) r        unsigned char j;
! c; D4 H) r# p! s        # B+ x! f" E2 [4 O0 p. k
        for(j=0; j<nws; j++)9 l% c, n- h+ I! v2 u
        {9 y% T- [# R& s4 |
                WS_Set1(WsDat[0]);  // j / 0
* a: W' G* y) y" T        }
5 j3 A4 a- U- [, B/ q6 d        WS_Reset();, B0 I. d1 ~8 p$ E
}
: a/ P2 o- G5 `  E2 W" {2 s
3 x1 \' _& N" _+ f7 u7 s# g
) I8 l9 f/ j3 ?! G$ _. s3 M
, J( F  h3 V0 ]% Z
& f) C" _) T( x; @! A

* G( m  @8 O9 E) \
- h3 A" N' e8 u% _

, |/ p! c# u( x1 w7 v4 J
( t. a4 \4 E% Y  n2 M3 j+ Y

% W1 X; `7 I& V& F5 F

  A: {% M) t. D. o$ I
3 E2 M4 t8 ^6 u) |

; _6 D* C9 t  w9 y  f( b1 C+ ^5 k5 I/ \( {9 A0 H

* U* I  x( w4 C* U
  T* G- S6 |- {+ @! q  X

% @! {$ n& Z5 ~* D3 M- V( M, ~
4 w* O: m1 o$ U- l7 @3 B1 F
  O( w5 x( a# D, w7 {
/********************************************
8 R$ f$ N. }# X8 d* 求绝对值4 m2 o- K, }  n# P
********************************************/- J+ _& d+ L( i  b& t. j
unsigned char abs0(int num)
' |) A9 a# Q. E* i# z$ q: {- B6 Q9 M{7 @1 g0 }: x% z9 l7 T% T+ R
        if(num>0) return num;! K2 }& N5 {3 m, @# T! L( i
        # U; Q" b, N4 j( B
        num = -num;
& ]) p% E6 ~2 c* \- G% {- t, E        return (unsigned char) num;
7 q/ `$ [. p# ~% L0 L2 ^}- L* u3 @4 ^- @) a6 l7 i

! C2 H/ b$ H& `7 F- W! C0 [
4 R5 H+ U5 _7 p1 ], W) E9 _
/***********************************************************************************" @. t0 ?8 C3 o2 b- x$ I: {0 a, H
* 颜色渐变算法
; h) L% i7 w$ U' c0 M; x: j* 误差 <= 26 ]% n7 ~# B& a( _
************************************************************************************/
' W/ l5 ]4 N' I  O5 su32 ColorToColor(unsigned long color0, unsigned long color1)& ^# Q2 V+ B* @8 @5 |4 z. h
{9 k/ n0 d/ i4 h
        unsigned char Red0, Green0, Blue0;  // 起始三原色# |) o* G, K! w! Z
        unsigned char Red1, Green1, Blue1;  // 结果三原色7 ?7 c% d% h) D2 q3 S- p
        int                          RedMinus, GreenMinus, BlueMinus;        // 颜色差(color1 - color0): n0 Y7 r+ Y& {: x/ @
        unsigned char NStep;                                                         // 需要几步
6 Q4 s# t5 A, X) t1 m        float                  RedStep, GreenStep, BlueStep;                // 各色步进值
/ b( p$ Z" n% f' ~, V( i2 [) z        unsigned long color;                                                        // 结果色
9 s1 g! U" Z$ n$ W        unsigned char i;
3 e! N6 p6 w% i# ]! O        
' e" z2 S0 d1 R9 @& g. `/ l( Z        // 绿 红 蓝 三原色分解
, D* U5 p3 w6 M        Red0   = color0>>8;
! z# Q) _' W3 f5 W, {        Green0 = color0>>16;
4 m& L% y" K$ I# ]$ a& c+ b: x# D        Blue0  = color0;# A- X& Q1 W- d0 G5 f
        0 L* ?* l7 d9 l. x  P& }# i+ Y
        Red1   = color1>>8;
/ W5 |4 p4 ]( a) l, O        Green1 = color1>>16;
( O0 d$ @% g/ I5 C; {        Blue1  = color1;
9 z6 M# q+ x' n        
" H% ~8 X9 z; R& H' T7 l        // 计算需要多少步(取差值的最大值)# H8 q: B* p1 t' n: _# E. y- L% Z
        RedMinus   = Red1 - Red0; 0 x. z: h' B  ~+ z( N/ J( ]
        GreenMinus = Green1 - Green0;
2 [) K6 G$ D% A0 B        BlueMinus  = Blue1 - Blue0;) j. ^4 Z* c, [" Y% }) x
        / t* ^0 W9 r( o5 k
        NStep = ( abs0(RedMinus) > abs0(GreenMinus) ) ? abs0(RedMinus):abs0(GreenMinus);
, p) f" A+ A- I: b* @        NStep = ( NStep > abs0(BlueMinus) ) ? NStep:abs0(BlueMinus);
6 J4 V5 q$ e3 c        
6 G; r$ b! Z. j( o- H4 B        // 计算出各色步进值
$ g6 k' V7 V# f+ ?3 ?" @, d2 M3 @

' T) R% c% F/ _. p  ]! H/ J
- s7 B, R# Y# U  o

4 M. E9 \, h2 V9 E  J% s7 Y3 v# j- w…………余下代码请下载附件…………* x7 B3 B, m3 H: @* J- G* [
/ S7 u3 a1 E" l2 \0 H" @
+ J: e4 T. g" j  \9 U
; U: S1 K3 z% |/ E) R5 C

/ o6 u6 O- E( q4 w( C) M  D" u! @; [% l( h* `  A8 F

4 ]+ B  ~4 V! a2 N  |下载:
# _; A6 p: b4 l  F4 a' P% a. r& V
游客,如果您要查看本帖隐藏内容请回复

* [$ T! y( Z4 Q$ ~* ~6 s/ E- g! l9 q& M% N0 r1 m/ ~0 V. p* O; _

/ }) P/ ~0 p% y. ?. j

该用户从未签到

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

该用户从未签到

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

该用户从未签到

4#
发表于 2020-2-10 10:11 | 只看该作者
wwwwwwwwwwwwww" u9 U& i$ [) t/ p  _0 ^+ t

该用户从未签到

6#
发表于 2020-12-9 10:10 | 只看该作者
基于单片机的微波炉课程设计 原理图 仿真和源程序都有8 P1 z/ B$ u( u0 ?7 h

该用户从未签到

7#
发表于 2020-12-11 21:39 | 只看该作者
看看                                - E. B/ k; ?6 W8 E
  • 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-13 15:38 , Processed in 0.093750 second(s), 26 queries , Gzip On.

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

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

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