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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
51单片机驱动WS2811彩灯源程序和实物图, W, @8 T1 Y( _2 e# @) f7 G( N; f  E( s

) \2 Z1 m/ |- b

+ o2 u6 K) u6 Q( ], `# }2 o7 ~7 E4 O: IWS2811是一款可以级联的RGB三色LED灯。只需要一根数据线就可以控制多颗LED。现在发上来整理的库函数,可以直接调用显示函数。
# |: }/ `3 q9 \( W: O& J. Q2 a
5 v; O$ X) Q: [; C8 p1 F4 x& ~  z* B3 M) q( \2 R
WS2811.h

/ N0 `6 ?7 X9 X3 z
3 T( \  E0 Z! M

: s) u; G; P, O- M# u7 N: N#ifndef __WS2811_H; ~& R8 D; }7 p$ g
#define __WS2811_H         - E; v6 K. ?' q
#include "sys.h"
: N$ D( b& b( q! i3 {; u+ U
8 F- M) d) z1 J7 L- l6 s! g( ^
8 k4 r- Z4 t* Q( U. e, o

9 l  D/ ]& a2 Q' q; B

9 I' O' _6 @1 s* k+ |1 w8 d#define White       0xFFFFFF  // 白色; e6 ]& v  \% @- y2 Y* s1 U. }
#define Black       0x000000  // 黑色) p2 S7 H/ _) A5 [! W% z
#define Red         0x00ff00  // 红色
( _$ c6 w6 n: w#define Green       0xff0000  // 绿色
3 T3 [. l* G5 [& z#define Blue        0x0000ff  // 蓝色4 i0 l7 q+ H6 o0 M

/ \1 A/ X; C# a  w4 ~; Y
# {/ p, _4 N( ?5 o
" F4 d% ^0 G9 U* l, }# z

) \* K% n8 S9 b* c6 Q. `#define nWs 16                // 有多少颗WS2811级联
% W" g# _5 {' [1 c$ R1 v
/ E" q. X5 j4 n! ?' ^; L6 ^

) b+ v8 {+ |: W, C9 t. B6 Dextern unsigned long WsDat[];
. ?, u( v/ s9 M! J/ U) v$ x! S" N) d# i+ S: q
6 r; J4 p# j4 y) w; u2 S. Q6 o
extern void WS_Init(void);
# m& I( s  V% T* Xextern void WS_SetAll(void);
, u5 v, u! R* t  ]extern u32 ColorToColor(unsigned long color0, unsigned long color1);
7 j! U+ o8 }$ Y8 g" R: V9 C7 E* i% t! P; w

9 S* _9 e& H1 i; ?# v, W- ?( c$ |                                                     $ E! N  N, D! q2 V2 V* g$ S0 Q; ^
#endif$ ?& @, J- l- ~8 R
' c- Y! q. Y1 c9 T+ H% d6 T; n0 H
" C/ ?' A) M9 h+ \' x5 s( p

( J: ~( B. j- Q% _: ^/****************************************************************************************. f) ~7 Q$ [3 F$ b  w; E# M
* WS2811 彩灯驱动函数
2 s& l7 t$ `& S9 D3 n*3 x, H% r0 Y% n, T) P/ b
* 调用方法:
7 [8 |0 \! U- g) s2 F*        修改宏定义: #define nWs 1        // 有多少颗WS2811级联
2 f6 y' v: W6 P*        WS_Init();        // IO初始化! J% K) E; x9 N8 N- Q
*        WsDat[0] = 0x808080;//显存赋值
7 m' \  U( L: J( i*        WS_SetAll();  // 发送数据3 n- a6 b3 G/ x4 {1 G2 x
*        ColorToColor(unsigned long color0, unsigned long color1);// 颜色渐变算法: n( v: U0 q1 ~  A2 K& w# P# S/ ^
*+ ^4 X' C3 d# H/ p$ W
* 作者:星希望(已校验)  J8 b+ M1 `6 v! {* W" m/ l
* 日期:2015年6月24日$ [( q: d  }% b
****************************************************************************************/
% R' a, _1 }$ M. t; D#include "sys.h"
& |/ G4 q+ P  r; x#include 0 }0 c1 q4 a! X- A% R; B# [4 L. s
#include "WS2811.h"" d4 r' p: K- u# m! j
#include "delay.h"; Z! ^$ `7 V8 o. @( M
        ; \2 R, U, |% `$ x  ]/ C& Z7 B2 L
/* 显存 */
* R0 V& }  B8 F$ z/ Sunsigned long WsDat[nWs];
6 N5 ]* D4 M5 G/ y# r$ s2 Y7 P6 b# j) S

3 I7 a- Z+ F1 W- a, u* r
# T" G  c5 M) V6 X7 [) p
% _( J9 y% D6 l- K
/**************************************************************************************
  Y2 G! H5 b( W4 J* P/ \* IO初始化(移植时请修改)
" `& l% i! h! f! |9 Z% |/ C) Z**************************************************************************************/: ?0 A2 P, s" [4 n/ o/ x
void WS_Init()
! g* s" k. M1 g- G9 @; s/ p4 q6 B{: d: Y3 B* V8 f, y7 ^$ L
        GPIO_InitTypeDef  GPIO_InitStructure;        / e2 [$ s" L' }
        
. w) e# f4 y6 `4 C5 c7 e        //端口时钟,使能! A9 j, O. ^/ U) w1 y6 ?) V+ v
        RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE );         
! A6 S5 y% V- k- `% S! b8 B3 o! I( \8 i- ?( y
9 J6 k( Q+ v- @  P) j7 _* z  O
        // 端口配置
6 Q- H! j+ m/ ~, o, L        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;                                // PIN
6 M" w3 z$ W% ~2 ]( e/ `4 e        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                 // 推挽输出
5 y. r1 s* v! z1 p0 t        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                // IO口速度为50MHz' T+ w( p) I5 z; I+ a9 A4 u2 ^
        GPIO_Init(GPIOA, &GPIO_InitStructure);                                        // 根据设定参数初始化
2 Y  @% w* n& _4 T) ^: H}5 [! M7 I1 t  ^
, O0 n; U# [, P5 y9 W1 g

$ K# ?. [+ E$ }  V) X/**************************" I+ E9 T2 i6 d; J& D3 ^6 l0 [
* 内部延时
3 n, s  K. ]! @7 x***************************/6 p, ]. W( G4 l" k2 T# `1 `
void delay2us()
- A% D: m" ]& d( j" p" L- O8 o{
7 r' j* l) z" g0 P        unsigned char i;" e" |, x; K; {' K5 w" k2 `
        for(i=0; i<12; i++);' G! z7 Y4 f% L4 [
}$ Q$ S4 X. c0 ^  W* |, \
void delay05us()/ G+ V5 X9 z) d0 b/ Z/ V
{) p. |5 s" q( O0 x5 R& }
        unsigned char i;
- ~5 |5 T" C. I) `        for(i=0; i<1; i++);) w5 [0 _* U8 a, v) J
}
+ @1 P( a' i  h; D6 e5 M+ [
' l' D  t. W7 ^) {  F2 t/ f
5 [, b* A1 }, ~7 L8 V
/***************************
0 m" [& h  ^" _3 H' f& N) }* 发送一比特" J, F5 D$ X) V  u% R% c4 h! \! N
****************************/6 W+ R1 ]7 H4 t
void TX0()          { PAout(0) = 1; delay05us(); PAout(0) = 0; delay2us(); } // 发送0+ ^! Z# x4 M; |1 I# U/ Z  f
void TX1()          { PAout(0) = 1; delay2us();  PAout(0) = 0; delay05us(); } // 发送1& Q5 p5 @; h$ y9 B
void WS_Reset() { PAout(0) = 0; delay_us(60);  PAout(0) = 1; PAout(0) = 0; }
9 k( k7 q# U6 n: \& X. P5 y6 B$ y0 q+ ^" |2 L: p
% p+ t$ q, c1 E
/**************************************************************************************, y& Q; C5 m; x, ~# M5 N, V
* 发送一字节- |- _3 g+ X. _% F% I
**************************************************************************************/
2 f/ `" e, u8 ^5 K9 D% F* t! M0 Evoid WS_Set1(unsigned long dat)
# o7 O& c& `1 _3 a{
& q. o) Y3 x# S3 v; N& r        unsigned char i;3 N+ j" q1 I/ g6 H# m2 q
        
8 _6 C& F4 Z6 i1 U" J) l- H        for(i=0; i<24; i++)
" T$ d; G1 V$ u: x        {5 ]! E% B/ Q1 Y+ ^1 S' ]
                if(0x800000 == (dat & 0x800000) )        TX1();2 o8 A1 ]* o- a
                else                                                                TX0();. w& H, l/ L& l$ D' V
                dat<<=1;                                                        //左移一位
- {) ~8 U1 I6 \0 A; B) G, T        }
# Q7 U( D8 B; D}
6 P  I. L& @# m6 o& i3 Z0 w) [1 O5 ?' |0 ?4 y' a9 O
1 `0 x" V) n) d, p
/**************************************************************************************! H2 X+ t+ `- J& y1 h
* 发送所有字节5 m& `; p" E+ L- C( b9 M
**************************************************************************************/# m7 d% |' v5 |$ X) k. e9 s$ Y
void WS_SetAll()
) o) @. ^( N" k4 F{
# \0 O/ o6 O( }' |        unsigned char j;
* p. C! O# F% K        
0 v8 E' C# p9 R. V* y: [        for(j=0; j<nws; j++)
$ X, I7 `2 j( u: s3 \0 n        {8 ?2 |8 N8 g) ?- e* n8 I
                WS_Set1(WsDat[0]);  // j / 0
! q/ Y$ C. i7 R& @        }1 c5 y0 c0 F/ b# E) y$ _, u6 ~! ~' [
        WS_Reset();
: H' N5 K, v6 e" `}
# J+ `. V6 e+ L  h6 u
2 x4 V1 }' F3 S" H; _- O8 S

" ]( h& b- J' _# o- q! ^6 w; q* k7 e2 J& k' p; M/ v' b

3 R; f1 w( g$ d
+ V$ d' w1 ?5 ]

, s% G' R) O1 u3 F, {. [$ \9 ]. T/ J* P, G: ^8 r$ v. T

$ ~# O# O+ u( ]1 a7 D2 L7 t$ G% q0 a" T
: P6 |6 |8 ^0 `* R7 V
, D# W$ \5 N3 ~$ ?, A& |. s
! v$ ?+ ^! |- V: @7 T
8 N) U7 C: L; \- ~3 M1 b

; e6 `3 c8 a  h+ N  h- o$ J9 l3 E4 X' v; ~& R7 Z+ n' T

" z; s' m& K, @
7 g/ T" a# b% b; `% F! t; z: T

( X5 _$ \3 j4 P" h- K/********************************************
8 v8 n% w6 C0 Q1 Y( k0 N  B* 求绝对值5 m- v& ^! f. b. ]3 `7 }3 m
********************************************/" t- v8 Q; J1 b4 ?: f1 i: B
unsigned char abs0(int num)! e' q0 [2 C8 Z# H' y  O3 X7 h
{5 s5 E3 Y# m1 L7 z
        if(num>0) return num;6 }- B7 ?" V  v2 k$ d: ]0 r
        / Z) |/ u0 D# f7 p. _1 G
        num = -num;
7 |5 o2 K! I9 E        return (unsigned char) num;
  ^1 d6 x0 j9 n6 H; ~6 p}
$ }. |# z( _- }4 f9 X( r6 O1 o, e, \/ y

! r. s. c$ t. B3 [/***********************************************************************************4 \+ ~4 E0 E0 K8 L5 V! o  F
* 颜色渐变算法6 w  Z8 U$ [, Q; ?2 F
* 误差 <= 29 W$ F) p6 t/ Z1 q" L
************************************************************************************/
9 c' {/ K. A) [) q- U  `u32 ColorToColor(unsigned long color0, unsigned long color1)
+ d4 J# w! e3 y1 r# E{
% ]' _% r7 m0 d        unsigned char Red0, Green0, Blue0;  // 起始三原色
3 U) E' e1 i8 O; G1 r! w8 h' B7 r        unsigned char Red1, Green1, Blue1;  // 结果三原色# u( ?5 [7 F' i& {
        int                          RedMinus, GreenMinus, BlueMinus;        // 颜色差(color1 - color0)
9 n$ e2 I! M- ]9 Y        unsigned char NStep;                                                         // 需要几步% n3 u2 ~! p5 B; |5 e- {( I) O2 W
        float                  RedStep, GreenStep, BlueStep;                // 各色步进值
( C6 }  q2 K! R5 g! J* V) t1 R        unsigned long color;                                                        // 结果色" B3 b" }5 {; a! B5 g6 R
        unsigned char i;. d7 T. M% a6 i$ P& {* D$ [
        
8 b1 w+ ^% `$ M! K3 [1 m( f4 }        // 绿 红 蓝 三原色分解
3 [; ^  U3 E8 E6 U4 p& g( J- n        Red0   = color0>>8;( X. B2 {: E% f" R! S. o) \
        Green0 = color0>>16;9 S( S  g6 g) s5 \4 k- R; n  ?
        Blue0  = color0;
/ o4 F, Y9 e+ Y! ]3 Y' p7 L( a' r9 E        
8 Z% C5 E- o& ~+ z& N3 s1 Q0 K6 J        Red1   = color1>>8;
0 I# I' f+ c9 w( Q+ I        Green1 = color1>>16;
4 s! s; T- \4 Q9 x  p9 a        Blue1  = color1;$ F/ U( n1 ^8 V" d
        ' H: T" ~8 _, `' K8 m+ C
        // 计算需要多少步(取差值的最大值)/ L6 ^- y. @  u4 P, Y( i
        RedMinus   = Red1 - Red0; : _4 i3 z! _/ S  r5 k
        GreenMinus = Green1 - Green0;
" T% I7 B) p$ q        BlueMinus  = Blue1 - Blue0;
+ z8 _+ P5 d( M7 G1 Z        " U. u2 A5 O* D; T* N& K
        NStep = ( abs0(RedMinus) > abs0(GreenMinus) ) ? abs0(RedMinus):abs0(GreenMinus);
# N+ F' {+ c0 ^        NStep = ( NStep > abs0(BlueMinus) ) ? NStep:abs0(BlueMinus);
6 X, c/ D; v1 D  W1 @! x+ e+ W, z        
! J* _0 x9 [; G+ B! [1 Z( m        // 计算出各色步进值/ y+ r. |+ N! i  g( T

- D) J( ^* a8 E5 _; x( A4 f+ A9 G: t

& U  ?/ Y; S' U! z, e) g9 R4 A* e" M+ P, B3 m8 x8 t/ Y

& e' k* i/ b' n; O' B…………余下代码请下载附件…………* p9 G% h# W( p- V

) D. X( t+ C+ K, _$ n/ ^

& o' V% E  B& Z$ i1 e1 A6 s- N, j, _

/ z$ U& `' c1 _0 M. v9 I8 u0 S3 B4 d# V
' S, u5 k% A; R% f5 R

! Z4 B- r) [6 D5 x# b下载:( o+ a' z6 I4 k5 Y- K" k
游客,如果您要查看本帖隐藏内容请回复
) {7 v) h5 O& F6 P8 P2 R
- K5 d) W& A! H# \- I" F9 o* d
4 g4 o6 H  a- G  D& r) w

该用户从未签到

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

该用户从未签到

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

该用户从未签到

4#
发表于 2020-2-10 10:11 | 只看该作者
wwwwwwwwwwwwww, I* V2 M2 o2 [' s  L. q

该用户从未签到

6#
发表于 2020-12-9 10:10 | 只看该作者
基于单片机的微波炉课程设计 原理图 仿真和源程序都有
3 O& `, @2 {( K5 p3 O5 N

该用户从未签到

7#
发表于 2020-12-11 21:39 | 只看该作者
看看                                * X0 ]/ R$ d  y6 ]
  • 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-15 05:39 , Processed in 0.093750 second(s), 26 queries , Gzip On.

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

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

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