標(biāo)題:
全彩WS2812驅(qū)動(dòng)實(shí)驗(yàn)(8腳單片機(jī))STC15F104W
[打印本頁]
作者:
MCKK520
時(shí)間:
2018-2-16 07:34
標(biāo)題:
全彩WS2812驅(qū)動(dòng)實(shí)驗(yàn)(8腳單片機(jī))STC15F104W
STC15F104W單片機(jī)源程序如下:
===========================
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
/*
,
全彩 LED ws2812 燈 驅(qū)動(dòng)程序,受到論壇 zhuls 的啟發(fā),
實(shí)現(xiàn)了在我的8腳芯片,STC15F104W芯片上的驅(qū)動(dòng),、
修改內(nèi)部晶振 @ 12MHZ, STC Y5內(nèi)核,一個(gè) _nop_(); 為 0.25 us時(shí)間為基準(zhǔn)來驅(qū)動(dòng)WS2812
此程序?qū)嶒?yàn)完美驅(qū)動(dòng)WS2812,無閃爍,無跳燈,
,
接下來想用很長一個(gè)WS2812燈帶,擺成88:88這樣一個(gè)數(shù)碼管形狀,
然后用單片機(jī)一個(gè)IO口驅(qū)動(dòng),實(shí)現(xiàn)全彩數(shù)字鐘,(多功能),比如說重要定時(shí)時(shí)間到了,狂閃+高亮紅色,RR=0xFF;;這樣
或者睡覺前,以漸色呼吸燈的方式,直到深夜,亮度自動(dòng)變暗,RR=0x01;, GG=0x01; BB=0x01;
,
*/
sfr P3M1 = 0x80; // 10 000000 全部設(shè)置為雙向IO口,弱上拉25K
sfr P3M0 = 0x80; // 10 000000
sbit LED1 = P3^0; // 5
sbit LED2 = P3^1; // 6
sbit LED3 = P3^2; // 7
sbit sda = P3^3; // 8
sbit KEY1 = P3^4; // 1
sbit KEY2 = P3^5; // 3
uint US100;
uint MS1;
uint ID;
bit FLAG1;
bit FLAG2;
bit FLAG3;
bit GF;
uchar i;
uchar j;
uchar d;
uchar RR; // 顏色變量0-255 就是FF以內(nèi)
uchar GG;
uchar BB;
//=============================================
void delayus(uint us) // 延時(shí)n個(gè)1us @12M晶振 STC15F104W芯片
{
uint us2;
for(us2=us;us2>0;us2--) { _nop_(); _nop_(); }
}
//==================================================延時(shí)代碼 12mHZ
void delayms(uint z) //X MS延時(shí)==@ 12MHZ
{
uint x,y;
for(x=z; x>0; x--)
for(y=920; y>0; y--);
}
//=========================================================================
void bit1() //H=0.7us.L=0.6us 數(shù)據(jù)1的表示 芯片STC15F104W @ 12MHZ
//1US= 4個(gè) _nop_(); 進(jìn)程序要用掉2個(gè)_nop_(); 出程序用掉2個(gè)_nop_();
{
sda=1;
_nop_();
_nop_();
_nop_();
sda=0;
_nop_();
}
void bit0()//H=0.35us.L=0.8us ==數(shù)據(jù)0的表示
{
sda=1;
_nop_();
_nop_();
sda=0;
_nop_();
_nop_();
}
//發(fā)送8位,=1顆燈的一種顏色,WS2812燈數(shù)據(jù)為24一串24位二進(jìn)制數(shù)–每種顏色8位二進(jìn)制數(shù)。先是綠色,然后是紅色,最后是藍(lán)色
void send_sda(uchar dat)
{
uchar count1; //位計(jì)數(shù)器,單字節(jié)為8位
for (count1=8;count1>0;count1--)
{
if(dat & 0x80) //取高位先發(fā),則dat & 0x80
bit1();
else
bit0();
dat<<=1; //數(shù)據(jù)右移,下一個(gè)位的數(shù)據(jù),若高位先發(fā)則dat<<=1
}
}
//=============================================
void Init (void) //中斷初始化
{
TMOD = 0x01; //12M 100us
TL0 = (65536-100)%256; //設(shè)置定時(shí)初值
TH0 = (65536-100)/256; //設(shè)置定時(shí)初值
EA=1;
ET0=1;
TR0=1;
}
//=============================================
void timer0(void) interrupt 1 using 1 //---定時(shí)器t0-----
{
TL0 = (65536-100)%256; //設(shè)置定時(shí)初值
TH0 = (65536-100)/256; //設(shè)置定時(shí)初值
US100++; TF0 = 0;
if(US100>=10 ) { MS1++; US100=0; }
if( MS1>=1000) //定時(shí)器實(shí)現(xiàn)七彩色時(shí)序
{
RR=0xFF; //
GG=0x00; //
BB=0x00; //
}
if( MS1>=2000)
{
RR=0x00; //
GG=0xFF; //
BB=0x00; //
}
if( MS1>=3000)
{
RR=0x00; //
GG=0x00; //
BB=0xFF; //
}
if( MS1>=4000)
{
RR=0xFF; //
GG=0xFF; //
BB=0x00; //
}
if( MS1>=5000)
{
RR=0xFF; //
GG=0x00; //
BB=0xFF; //
}
if( MS1>=6000)
{
RR=0x00; //
GG=0xFF; //
BB=0xFF; //
}
if( MS1>=7000)
{
RR=0x7C; //
GG=0xFC; //
BB=0x00; //
}
if( MS1>=8000)
{
RR=0x4B; //
GG=0x00; //
BB=0x82; //
MS1=0;
}
}
//=========================================================================
//========================== 主程序開始 ==================================
void main()
{
P3M1=0x80;
P3M0=0x80; //
RR=0x00; //初始化
GG=0x00; //
BB=0x00; //
Init();
while(1) //主循環(huán)。
{
for (i=0;i<5;i++) //發(fā)送5顆燈
{
send_sda(GG); //綠
send_sda(RR); //紅
send_sda(BB); //藍(lán)
}
sda=0;
delayus(70); // 高于50US的低電平信號(hào)=復(fù)位,
}
}
//=========================================================================
//========================= END ==================================
//=========================================================================
,
,
復(fù)制代碼
作者:
jmkl128
時(shí)間:
2018-2-27 00:25
人才,我頂。。!
作者:
gspt
時(shí)間:
2020-2-15 15:29
寫的真好,解決了我的疑惑
謝謝樓主大哥
作者:
CNGK
時(shí)間:
2020-4-2 23:47
大哥厲害哇,解決了我的疑惑!
作者:
13534702358
時(shí)間:
2020-12-18 00:25
厲害厲害。。。
作者:
dongfang08
時(shí)間:
2021-3-29 09:50
厲害。收藏備用,謝謝!
作者:
緣分五月八
時(shí)間:
2021-5-17 08:17
哪位大佬幫我寫一個(gè)stc15F104w單片機(jī)爆閃燈,p3.2和p3.3接爆閃燈,每個(gè)燈閃3次循環(huán)爆閃用按鍵可以調(diào)節(jié)爆閃頻
作者:
快樂a123
時(shí)間:
2022-1-2 15:27
發(fā)個(gè)接線圖
作者:
1111513
時(shí)間:
2022-3-24 17:29
沒效果是為什么
作者:
快樂眼淚
時(shí)間:
2023-2-28 20:12
已收藏備用,謝謝!
作者:
wkman
時(shí)間:
2023-3-1 16:28
ws2812的燈珠,就是塊頭大了點(diǎn),
其它都還好
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1