|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
WS2811灯光程序 单片机22路全彩控制器
( {5 ~9 W" ? l$ R( w% L3 r$ B! h# z; z
8 k7 G, m8 @5 b6 S1 F/ U
源程序: d9 Q; q1 y7 A% P7 r
/******************************************************************************9 a5 v+ K) ]. I
//*版权信息:深圳市天微电子有限公司8 S' y* D" H+ [- U @( n
//*文 件 名:TM1812-V1.0% b/ E" C( `! }1 v( @( \8 ~
//*当前版本:V1.0
5 d0 L* ~' x. C/ N. Q" z, h# L//*mcu 型号:STC15W104
- I7 G& q' J5 l/ c. k//*开发环境:Keil uVision4
3 r7 e3 f( T% E. ?$ v P$ e//*晶震频率:33MHZ(内部时钟) + f% z2 R# W5 G9 k# z l& Y. ~
//*完成日期:07-10" w9 G" H9 ^6 y
//*程序功能:1.该程序可实现2片TM1812幻彩变化。
3 D9 P8 y# N2 \& J. ~// 2.修改变量IC可修改TM1812数量。
6 @2 u6 j5 X, w6 z- c//*免责声明:1.此程序为TM1812驱动LED点亮演示程序,仅作参考之用。6 r ]3 j2 Y4 @7 S" P; x' f5 O
// 2.如有直接使用本例程程序造成经济损失的,本公司不承担任何责任。
3 j* W! o0 {1 H# }8 Q3 A9 S/*******************************************************************************/
1 A+ Y8 d+ q8 Y) ]0 ]# X#include <reg52.h> //MCU头文件
0 [( y1 f6 ?5 H9 P) t' G#include "intrins.h" //包含nop指令头文件
3 i* W& o9 G4 F1 k; \, w; `, Z3 ?9 s, i1 c2 T- N
( D0 e8 q% @% f- S& R2 U+ A
#define nop _nop_();
; p5 N2 u* a( Y, X, V. w# p //宏定义
) V3 [' J4 i, p& e ~; s/********************************定义控制端口***********************************/+ g- A) Q2 T$ Y
sbit DO=P3^3; //定义信号输出DO
8 A1 B4 g7 e7 \" n% H
; X1 o0 \6 K4 R2 D% S& c! ?4 }) v' `& v& A3 u2 y9 C9 k8 y
/**********************************定义变量*************************************/
0 S4 t# Z5 s( i( V$ Dunsigned int IC=2; //控制TM1812个数
3 D7 A* u4 r2 ?5 ~2 xunsigned int LED_PX; //像素点数
. T0 f1 r& H- E9 @- {! Y! [unsigned char PWM=255; //TM1812灰度数据 ! F0 `0 U1 D; H! P) [& B! N
unsigned char Rda,Gda,Bda; //R、G、B灰度数据3 L% \, a* s, x M& `& t5 J2 Y
unsigned char bdata LED_data; //可位操作的数据发送暂存变量声明
6 P0 [: U, U1 A4 Osbit bit0=LED_data^0; //被发送的数据各位定义+ A6 n2 W1 p7 B/ ` T7 q
sbit bit1=LED_data^1;
' S1 H2 W6 q4 q8 O! Z0 U% xsbit bit2=LED_data^2;9 K& \2 E8 U4 d5 \
sbit bit3=LED_data^3;
, _0 N& F' I. L; N$ E- F. h& g( i5 t" Ksbit bit4=LED_data^4;3 R6 q0 m1 }! j
sbit bit5=LED_data^5;
9 |3 b/ }) T$ g; _8 D1 Msbit bit6=LED_data^6;
* S1 z! D5 b* Q3 j1 x' vsbit bit7=LED_data^7;9 N/ @; X" J- F/ c( j
bit flag=0; //定义一个标志位
! l9 V: x( o; y% E4 j
- ^0 d$ @- T8 U2 q8 o' L, \1 ]4 Q1 Y f, z$ X8 m& l. ?9 h" D) @
/**********************************延时函数*************************************/
, e: D C+ ^( g9 m2 t" o- ^void delay(unsigned int n) //n=1,延时500us7 k1 }! e* i4 Q- ^4 j
{
& T, Q0 ^" \" r1 V unsigned int i;
9 y$ Z7 h! B' r) O8 D) H while(n--) , A4 J: z; b' | q3 r" h
for(i=0;i<860;i++);' z/ y# F3 d/ D( k" d: p- `
}# K' z$ y& e& S1 Z
: H" D6 U# F% i# ~" D; b
5 A7 [5 C2 h) i# j1 C$ p/********************发送0码函数,高电平400ns,周期1.25us************************/
6 U Q& q x, H+ N+ n! B& E; c$ s3 ovoid send_data_0() # p8 g, V4 Y% f6 a* |0 Y5 N+ l# g. i
{
' {9 H, G w8 @. _2 j i DO=1;
( L7 @7 c4 {1 u nop;nop;nop;nop;nop;
2 o/ B: x2 m* X# i+ ` nop;nop;nop;nop;nop; / ^% C' j8 P0 u) S6 x# v: ]
DO=0;
, q6 M6 s( q4 ^* O: {' R( D' Q, { nop;nop;nop;nop;nop;nop;nop;; m" {( f o! K# y$ B/ ?
nop;nop;nop;nop;nop;nop;nop; / K, l! `* n% T8 U: a
}
o% i: T/ J; j( D0 n* U8 C( H; G! a$ A' l5 N6 U6 P8 a4 m; S0 L
; [1 d. N: \- i* G& M/*******************发送1码函数,高电平800ns,周期1.25us*************************/% A8 X5 n0 O D \0 ]$ n! a3 h2 q
void send_data_1()
9 g. [ O5 m8 S* O% y, ?8 C{+ R: g: T7 ? m
DO=1;
0 O. a' p0 a* |* J# _; y nop;nop;nop;nop;nop;nop;
5 y6 Q9 ?% j/ n8 n5 R8 T' T" J# R nop;nop;nop;nop;nop;
/ J) g% B7 B; s nop;nop;nop;nop;nop;nop; # M" f. m+ t. g0 G* ?
nop;nop;nop;nop;nop;
5 |6 U/ b$ `# j DO=0;
' K1 d" ~2 C$ n, V7 b5 d}
* G$ |$ v; A( Z+ w! K M& T. b- o# _2 C& v/ Z0 z2 \
- x( f. \1 q3 N+ S+ l7 q$ w
/***********************发送1个字节数据,高位先发*******************************/
# U( u: K# ]% V- avoid send_data(unsigned char DATA)
; H$ Z# D' d' D0 H( t! _$ n{
4 a3 A' S* H0 j LED_data=DATA;
' X6 m* y* Q# k1 C% d if(bit7) send_data_1(); else send_data_0();
- D: O- L) T) w' _# E0 k! U if(bit6) send_data_1(); else send_data_0();
9 W$ Y% N3 ~6 V+ i5 G- c if(bit5) send_data_1(); else send_data_0();- d9 N: _7 @- T/ k% R4 C: X- Z$ s
if(bit4) send_data_1(); else send_data_0();
7 B( ?; a1 w y& _4 b if(bit3) send_data_1(); else send_data_0();6 l5 ?% j; ~& l# P
if(bit2) send_data_1(); else send_data_0();% a2 q, Q& [) ^. ]/ g
if(bit1) send_data_1(); else send_data_0();
& ~6 E0 r# Y9 \" V3 E5 ]: Z& S if(bit0) send_data_1(); else send_data_0(); # N( e% d: u I* ?1 Y4 m" z% M
}& K, p" G) h8 t/ `2 a
/******************************发送1帧数据*************************************/
' o. { q- ?" _6 Uvoid send_px()8 z$ N$ t6 D/ N* F/ u4 S
{
- F" o* a5 n+ l1 C. w unsigned int i;
* k' F5 o+ {: w2 h0 c for(i=0;i<LED_PX;i++). X, O, H/ E+ d4 `; o, d2 j
{7 ?9 B7 g- \" F* w
send_data(Rda); //发送R灰度数据* y0 u- s* `! G( {* C O. K# T L
send_data(Gda); //发送G灰度数据
- d* `" r- r2 A6 e( R send_data(Bda); //发送B灰度数据
& E! A Q/ a; ]4 q: U }
& V. ~$ j' x1 L% O6 K" k6 _6 v}
8 @& I2 m9 _" T7 A+ U8 r/*===============================主函数=======================================*/
6 l" p' X& o9 l) W+ @* l* S: ]void main()1 ], L$ s" S$ A8 a
{
# T0 _9 \* ^; w; x& U$ E unsigned char i;
$ ]5 ?" [# U. D, q4 Q) e9 l; B6 o LED_PX=3*IC; //1个TM1812等于4个像素
5 c1 j: x! o- D- Z$ Y- y Rda=Gda=Bda=0; //R、G、B灰度数据复位清零8 K/ ^! Z: I6 r k; ^
while(1)+ @' F( m5 b& C' `4 v
{3 o0 p8 B5 X2 T8 q
for(i=0;i<PWM;i++) //红色渐亮
0 r* K: C( T0 ?2 L" c! d1 g {
& M, \- o6 e; O# S4 ^$ ? Rda=i; //灰度计算! ?& m& Y T5 U6 w) r! v" `2 i
send_px(); //发送灰度数据2 G+ t4 v( B4 g2 m) N
delay(50); //复位延时
, [! s Q$ O+ J3 q }# F6 v+ J& w C3 [- b3 g- X: ]
flag=1; //标志位置位* j" E/ n, O9 C) v& R$ @! M
while(flag) //标志位置位后循环函数
8 m8 e9 T2 h: V# E1 B% o; x {/ |0 x2 F; Q0 u- o2 W* V- L. L
for(i=0;i<PWM;i++) //红色渐灭,绿色渐亮
7 c0 W. e, E0 o' G9 c/ ` {6 W2 I/ F8 K' D! d+ m: F, G
Gda=i;
& p4 }% g% n2 v Rda=PWM-i; //灰度计算0 R$ Q# s* S' I2 u/ i. }
send_px(); //发送灰度数据; s* j# M. J" O, |& ~2 n% A% ^
delay(50); //复位延时
% z' k% Z! T8 y, w }
$ _# i& W) t0 H' S3 ]' q for(i=0;i<PWM;i++) //绿色渐灭,蓝色渐亮
2 W8 j: @6 n+ ~) l# w$ r3 ` {. e/ G/ I0 i6 E- f" _3 i, f
Bda=i; ! t3 J2 ^: C5 z& j9 e# I
Gda=PWM-i; //灰度计算7 v7 b0 C! a+ X
send_px(); //发送灰度数据4 d) C. C# u/ r7 I/ w1 c z! T- l
delay(50); //复位延时- ?7 V7 ]8 j; u+ q0 o9 l. Y7 d
}
+ G# d& g: c! Q4 U2 g2 r5 } for(i=0;i<PWM;i++) //蓝色渐灭,红色渐亮
8 \9 `& P1 p; A+ ? {
; C \. t2 |3 G* y; {" e , r4 V! s2 k# u4 Z# Y4 E$ X
' S9 F7 W3 T7 ~* [ N) F( g
1 K% L8 W4 x% x6 {…………余下代码请下载附件…………) c8 W% Q$ _6 Z
+ O3 m! v% e* u& v N& D$ I
下载:2 G# T6 s. k' s' ~0 I; A
. h" H: A3 [! U. S' A1 H. q% h
1 e2 K" d- L& I8 p9 i3 y* z) d
|
|