|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
WS2811灯光程序 单片机22路全彩控制器- `: h8 s/ x- t4 S6 C7 }/ l' S5 t
6 m9 s; X) M6 N* H5 n" R2 e% u% x
7 o4 e# X7 X& V& n6 i. d6 ?源程序:& u, W' C1 g) V# A# X! Z
/******************************************************************************
+ z7 _* j! F+ U$ n7 l/ [. z//*版权信息:深圳市天微电子有限公司7 u7 u o+ a6 d; T; H: D
//*文 件 名:TM1812-V1.0
5 ]6 c ^! H3 V, r* x! I5 v% z//*当前版本:V1.0
4 b/ \6 }/ G0 z z0 K; H& J) _//*mcu 型号:STC15W104
2 T4 ^' p2 d/ n. N$ n2 R//*开发环境:Keil uVision4: b S; j& }6 O# t0 Y/ ~
//*晶震频率:33MHZ(内部时钟)
0 ^5 L, _& p# k//*完成日期:07-10- q% U' ~6 {7 G3 W4 M% w e s
//*程序功能:1.该程序可实现2片TM1812幻彩变化。8 s+ Z' V1 K) R) \& K |
// 2.修改变量IC可修改TM1812数量。 r3 g. _9 E) ~: B: Q: v) \
//*免责声明:1.此程序为TM1812驱动LED点亮演示程序,仅作参考之用。. G+ M& L0 G* S: I Y+ Z% W( G
// 2.如有直接使用本例程程序造成经济损失的,本公司不承担任何责任。
* \) Q0 K |( i/*******************************************************************************/ Y5 C( o% g+ L7 `0 R0 U' T" z
#include <reg52.h> //MCU头文件 C; P# j" m: n' A7 {( v
#include "intrins.h" //包含nop指令头文件
4 ]/ R: l4 f4 \ ~+ }3 z% G$ Z& y; ] }9 P( Q
' O" s+ X7 g& c% z7 h1 x7 X#define nop _nop_(); Q; F3 n( b6 x2 A7 K% t
//宏定义" E- a) o+ y8 `, W8 ?# f7 U W
/********************************定义控制端口***********************************/6 \! c) V( G5 c2 q# [
sbit DO=P3^3; //定义信号输出DO
; l! a7 u) S$ l/ g8 x* |' z% I/ I5 @! V* k- s, x& q9 }) ^6 ?
7 D4 X) ^* H- w Z1 `
/**********************************定义变量*************************************/- G. C c! v! o$ u: x4 h
unsigned int IC=2; //控制TM1812个数
. d$ i3 {; P+ f8 x" h; K, aunsigned int LED_PX; //像素点数) b& q( O+ H% q4 k) k- \
unsigned char PWM=255; //TM1812灰度数据
& ^1 Y* U' l( o$ G0 B) I6 c" Wunsigned char Rda,Gda,Bda; //R、G、B灰度数据2 y- x; w% F) g5 z
unsigned char bdata LED_data; //可位操作的数据发送暂存变量声明
6 k" f3 b* G5 @) wsbit bit0=LED_data^0; //被发送的数据各位定义# p/ m T8 k- X: S' ~% R7 t; w8 P! }
sbit bit1=LED_data^1;! Q/ ?3 ^/ \- M" x
sbit bit2=LED_data^2;0 ?" |! B5 [. f& c3 v
sbit bit3=LED_data^3;
2 ]+ H6 W( X+ Q; N% ~! ]) h7 }sbit bit4=LED_data^4;3 l9 y6 I4 s2 A1 z
sbit bit5=LED_data^5;. L; Q9 Z8 T1 p$ o
sbit bit6=LED_data^6;/ \ k2 P$ r7 \" b3 M" o! d# L
sbit bit7=LED_data^7;
! e9 z5 R% Q# S9 O" O5 _- `% U5 T3 O- }bit flag=0; //定义一个标志位
% J$ X$ J0 I. B9 x0 s8 O
) q# C* J" m! ~2 C3 @! B) @% p" Q; @/ v x
/**********************************延时函数*************************************/- G5 O, V/ A' `8 e' h9 R
void delay(unsigned int n) //n=1,延时500us
! N) ]' j W, g! W8 E6 L{/ y0 n: q/ ]7 V( j6 a3 K9 F
unsigned int i;; J) Y( l" i* E- _6 J. h$ K+ \! c
while(n--)
1 P: J& m. s5 {9 E# A: p for(i=0;i<860;i++);
/ h( T2 q1 b4 x9 G- r}
: k8 w/ @$ R+ Z" J% B) c9 S4 Z1 @0 Q* D! S% v" ]
0 C5 M: |! C, U6 Z. L! a5 ^/********************发送0码函数,高电平400ns,周期1.25us************************/( U. I5 q7 R& O: Y- v% M' l4 |
void send_data_0() . Y& F6 ]$ S: [: V+ |, j
{$ @ {. N& |: d8 I/ |: e U% Y
DO=1;
& _) I$ r! H1 z3 x1 T- f nop;nop;nop;nop;nop;
7 \8 G* Q9 B# N nop;nop;nop;nop;nop; 5 F. K5 ~2 r [
DO=0; ! p* q# `1 c# H& n! ^$ l8 ]
nop;nop;nop;nop;nop;nop;nop;' g5 m7 E; X9 G5 y+ J
nop;nop;nop;nop;nop;nop;nop; 4 G: p5 x5 p7 F) E! `7 o
}: ?6 a) ~) [0 t5 G7 L& T8 }
/ V0 ?! F z& R+ o( p5 H, E
# G0 D: p7 k% k8 y/*******************发送1码函数,高电平800ns,周期1.25us*************************/
2 c, c/ R b( a) f/ t% W4 k: I; ~1 ~void send_data_1() ' @3 V1 Z7 j0 i4 z
{
" g% Y+ q; @0 R$ C* E3 F DO=1;
0 \8 k2 r$ q5 C+ V# o1 y% U+ N nop;nop;nop;nop;nop;nop; 0 [3 E& j5 {7 k. L
nop;nop;nop;nop;nop;
4 g' L7 M# {( t" h: o* d) ^3 A nop;nop;nop;nop;nop;nop; ' z0 ^! c. |. ^ ]5 ~
nop;nop;nop;nop;nop;
6 h& N3 X! G2 X8 |8 F) j" Z DO=0; 2 B t9 O+ w+ S5 P5 j; J: B
}# w5 ^: Q0 u8 {/ h0 f; ?
- f. N% j5 P* ?+ w& e4 Q+ l; S* D* H& P* C& a
/***********************发送1个字节数据,高位先发*******************************/& y8 G" L& H5 L3 M! x/ F
void send_data(unsigned char DATA)
9 h2 _& v. x. i0 A/ Y5 P/ g* }{' x' U3 D9 D+ Q
LED_data=DATA; ; @# w$ E+ N5 D/ t: n
if(bit7) send_data_1(); else send_data_0();
9 `7 B3 P$ k4 D) c' |" I if(bit6) send_data_1(); else send_data_0();
) M: B2 l- r7 b, E+ M- A4 q if(bit5) send_data_1(); else send_data_0();+ {' z' ^, e6 I0 }
if(bit4) send_data_1(); else send_data_0();0 w# B0 ~; q I/ y& J
if(bit3) send_data_1(); else send_data_0(); M7 G' q- y* _7 X0 R% L
if(bit2) send_data_1(); else send_data_0();
, [4 T0 q# I9 F" \* L$ O5 z if(bit1) send_data_1(); else send_data_0();- p, ~! |' `% ?! r: k) Q* X% _! e& k
if(bit0) send_data_1(); else send_data_0();
$ @; B) u) f1 ]2 I# y! x+ F}
, D2 |! F/ j* m% U7 g3 ]; d/******************************发送1帧数据*************************************/
5 {7 e/ a6 L6 ]1 m$ z& Hvoid send_px()) b4 i7 Z5 O( z& Z+ p, v
{
- i2 r- D+ B( o, v$ f unsigned int i;# o# a5 ]8 j, [4 c$ z& x
for(i=0;i<LED_PX;i++)
$ X" ^0 E0 D) b8 N O; F T {8 U* J* w, p f% ?$ a, i) C2 l3 B
send_data(Rda); //发送R灰度数据- U3 ]3 A9 I: K0 `1 o4 H
send_data(Gda); //发送G灰度数据+ }! b* {3 P2 X/ q
send_data(Bda); //发送B灰度数据) j* J% W A& s) _
}! R, K' ?" L+ V2 r7 G; D1 f
}) g& k8 r; L# S" O3 z
/*===============================主函数=======================================*/
0 ]% w- ]* `4 z6 hvoid main()( e+ Q* G, H1 w) ?0 ^* U
{
! F0 W$ ] k; s unsigned char i;+ {. Z J/ {; f
LED_PX=3*IC; //1个TM1812等于4个像素) [3 _' h; L8 |# T
Rda=Gda=Bda=0; //R、G、B灰度数据复位清零
. W! O; n2 w9 n) P8 V7 F" j5 d3 f while(1)* f a! f! M) l1 @4 c
{- S6 E+ g& y( g6 q' q7 B+ v
for(i=0;i<PWM;i++) //红色渐亮 $ V4 ?6 c; S9 n% ~& |
{
4 O8 i4 M4 b ~& w# W5 h Rda=i; //灰度计算
. S! f* {4 [- s5 V* \* j send_px(); //发送灰度数据7 v, ~% I' {8 E" z
delay(50); //复位延时! e% x$ f( R [& ^8 ?" V% O3 E
}
' w1 V) s8 b' n/ H7 v flag=1; //标志位置位/ C! g* O% ?! f5 L1 d: } d
while(flag) //标志位置位后循环函数% P+ V# {+ t+ c7 ~! I' q
{5 p4 n; D1 J, k9 f4 _2 Y8 l" g
for(i=0;i<PWM;i++) //红色渐灭,绿色渐亮
0 u. U2 m% Y4 E8 L+ u {! _+ N }# k0 {% [- G
Gda=i;& A1 [: D# U- |( g. ^" }, O
Rda=PWM-i; //灰度计算
3 C- h! {& L* d. @/ j+ A send_px(); //发送灰度数据9 f! D) i) w% F( W' A' G$ B5 _
delay(50); //复位延时
6 Y" Y8 E) P* w& {" S% a }+ P0 V, j% B( p1 L M
for(i=0;i<PWM;i++) //绿色渐灭,蓝色渐亮 : W! f3 J" [' t7 W2 `0 d
{3 S/ c0 {* O H( `7 i) @
Bda=i; % l- G4 V( k& n
Gda=PWM-i; //灰度计算
$ e# D& V6 _: s- M send_px(); //发送灰度数据
1 G3 X9 L X% Q7 J5 B g( n4 K& O% _ delay(50); //复位延时 g6 j: U) y+ x' w) g
}
- J1 l- i1 ]5 G3 }" K for(i=0;i<PWM;i++) //蓝色渐灭,红色渐亮 ( I, O6 B9 z; f
{$ s9 p4 d$ m+ _: A
1 b# x3 l8 s5 q0 ^1 q" w5 |/ i+ d( V1 X
; ^/ @- L. N3 S; u6 m3 ^
…………余下代码请下载附件…………( v, `$ ~2 S! q0 W! O
" |6 Y0 L, _' B, |# l$ R
下载:
% r1 E# H; ? x- A3 ]; ?, S8 {
: B+ E3 [6 V# W" t( k: [3 _
% k; ]: q* v0 {9 Z: O. r" t |
|