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

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

[复制链接]

该用户从未签到

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

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) t
0 @+ 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" `

该用户从未签到

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

该用户从未签到

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

该用户从未签到

4#
发表于 2020-2-10 10:11 | 只看该作者
wwwwwwwwwwwwww
- S( R1 b0 y9 e6 {: g

该用户从未签到

6#
发表于 2020-12-9 10:10 | 只看该作者
基于单片机的微波炉课程设计 原理图 仿真和源程序都有
$ r0 n- l9 V( [- ]

该用户从未签到

7#
发表于 2020-12-11 21:39 | 只看该作者
看看                                ( [! k/ d" h# U1 w! A# S1 F
  • 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-8-24 01:30 , Processed in 0.140625 second(s), 26 queries , Gzip On.

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

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

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