WS2812面板燈制作教程!
視頻效果展示:
功能描述 電腦上,使用MADRIX 2.0 軟件,讀取聲卡數(shù)據(jù)并轉(zhuǎn)換成頻譜圖像,通過USB口發(fā)送給MADRIX板子,轉(zhuǎn)換成DMX512協(xié)議,送入面板燈。再由STC8單片機(jī)解碼,發(fā)送給WS2812燈珠,顯示出和電腦上一模一樣的圖像。 同類方案廣泛應(yīng)用于超大型酒吧、室外廣場裝飾燈等。 所需材料: 1、MADRIX軟件(學(xué)習(xí)可以使用免費(fèi)版本,如需正規(guī)使用請聯(lián)系官方購買) 2、MADRIX控制器,輸出電腦信號轉(zhuǎn)換成DMX512信號即可 3、STC單片機(jī),1KB的RAM,1KB的ROM,最好是帶兩個串口,寬電壓的穩(wěn)定。 4、MAX490芯片,用于將DMX512協(xié)議的485差分信號轉(zhuǎn)換成TTL信號 5、WS2812燈珠 6、電源,輸出電壓恒壓5V,輸出電流根據(jù)燈珠數(shù)量選擇。 關(guān)于制作: 1、原理圖請參考《WS2812面板燈原理圖》 2、PCB根據(jù)自己需要,選擇燈珠的布局形式。標(biāo)準(zhǔn)的DMX512協(xié)議最多支持170顆RGB彩燈的灰度數(shù)據(jù)。 3、STC單片機(jī)的程序,請參考《DMX512轉(zhuǎn)WS2812 面板燈程序》 4、WS2812燈珠調(diào)試,請參考《全真彩WS2812芯片LED介紹》 關(guān)于MADRIX軟件的版權(quán) 1、軟件的下載:見附件 2、軟件的授權(quán):學(xué)習(xí)或者測試,可以直接下載上面的MADRIX軟件安裝使用。公司使用請務(wù)必到MADRIX官網(wǎng)購買正版授權(quán)證明。如貴公司侵權(quán)使用,所產(chǎn)生法律責(zé)任與本文無關(guān)!軟件在為授權(quán)的情況下,只能用于調(diào)試,并且會按一定時間自動黑屏!不能用于工業(yè)項目的客戶使用! 3、安裝軟件后需要安裝驅(qū)動才能正常使用MADRIX解碼板 4、我們的MADRIX板,只支持MADRIX 2.0版本,升級后將不能正常使用! MADRIX軟件的簡單使用  1、打開軟件,按F4,搜索MADRIX設(shè)備出現(xiàn)下列OUT設(shè)備,就表示找到設(shè)備! 2、再按F2,設(shè)置面板燈的布局方式,下圖是我們的13*13像素點(diǎn)的面板燈的設(shè)置 3、選擇花樣 S2LEQUAlizer就是頻譜顯示,可以調(diào)節(jié)聲音顯示幅度、燈珠亮度、顯示速度等參數(shù) 
電路原理圖如下:
0.png (101.05 KB, 下載次數(shù): 135)
下載附件
2018-4-18 03:47 上傳
級聯(lián)169顆燈珠,排列成13*13矩陣,總電流7A
適當(dāng)距離需要增加0.1uF電容作為電源濾波,推薦50顆電容分開放
單顆燈珠電流40毫安,單顆燈珠功耗0.2瓦
單片機(jī)源程序如下(主程序):
- //***********************************************************************************
- //1、程序適用時鐘為24M
- //2、DMX512的串口2,每48微秒進(jìn)入一次中斷,中斷服務(wù)里使定時器0重新計時。
- //3、接收完513字節(jié)后,超過1000微秒保持高電平不進(jìn)串口中斷,定時器溢出使status_flag翻轉(zhuǎn)一次。
- //4、如果status_flag是1,那么接下來的DMX512丟棄不用!把DMX接收的數(shù)據(jù)拷貝并發(fā)送給WS2812。
- //5、發(fā)送完WS2812數(shù)據(jù)后,再次允許串口2中斷,status_flag再翻轉(zhuǎn)一次,保持DMX512數(shù)據(jù)。
- //6、核心目的是留一幀丟一幀,保證DMX512解碼和WS2812發(fā)送,在時間上錯開。
- //***********************************************************************************
- #include "all.h"
- bit status_flag=1;
- void Timer0_Init(void) //1000微秒 24M時鐘
- {
- AUXR &= 0x7F; //定時器工作在12T模式
- TMOD &= 0xF0; //設(shè)置為定時器模式
- TMOD |= 0x01; //設(shè)置為定時器模式
- TL0 = 0x30; //定時器初值
- TH0 = 0xF8; //定時器初值
- TF0 = 0; //清除TF0標(biāo)志
- TR0 = 1; //啟動定時0
- ET0=1; //允許定時器中斷
- }
- void Timer0_Routnie (void) interrupt 1 using 1
- {
- static u8 WS2812_Write_Buffer_old; //無信號等待用
- static u16 count; //無信號等待用
- u16 i;
-
- status_flag=~status_flag; //幀標(biāo)志位,一次DMX取反一次
- if(status_flag==1) //如果是奇數(shù),下次DMX512丟棄,而發(fā)送WS2812數(shù)據(jù)
- {
- WS2812_DAT=0; //先發(fā)送低電平復(fù)位時間
- IE2&=0xfe; //關(guān)閉DMX的串口2中斷
- for(i=1;i<Pixel_Data_Num;i++)
- {
- WS2812_Write_Buffer[i]=DMX512_Read_Buffer[i];//DMX數(shù)據(jù)復(fù)制給WS2812
- }
- if(WS2812_Write_Buffer_old!=WS2812_Write_Buffer[1])//如果數(shù)據(jù)改變
- {
- count=0; //計數(shù)從0開始
- WS2812_Write_Buffer_old=WS2812_Write_Buffer[1];//刷新數(shù)據(jù)。
- }
- else //如果數(shù)據(jù)不改變
- {
- count++; //計時
- if(count>2417) //如果長時間數(shù)據(jù)不改變
- {
- for(i=1;i<Pixel_Data_Num;i++)
- {
- WS2812_Write_Buffer[i]=0; //說明通信故障,自動黑屏
- DMX512_Read_Buffer[i]=0; //說明通信故障,自動黑屏
- }
- }
- }
- WS2812_Display_Ser(); //傳輸數(shù)據(jù)到WS2812
- IE2|=0x01; //串口2中斷再次允許,下次保存DMX512,不發(fā)送WS2812數(shù)據(jù)
- }
- }
- void main()
- {
- u16 i;
- for(i=0;i<Pixel_Data_Num;i++)
- {
- WS2812_Write_Buffer[i]=0; //開機(jī)先黑屏
- DMX512_Read_Buffer[i]=0; //開機(jī)先黑屏
- }
- DMX_Init();
- P1M0=0;P3M0=0;
- P1M1=0;P3M1=0;
- WS2812_Init();
- Timer0_Init();
- EA=1;
- while(1);
- }
復(fù)制代碼
DMX512_Drive.c
- #include "all.h"
- u8 xdata DMX512_Read_Buffer[Pixel_Data_Num];
- //**********************************************
- // DMX512初始化串口與定時器 24M
- //**********************************************
- void DMX_Init()
- {
- S2CON = 0xD0; //9位數(shù)據(jù),波特率可設(shè)置
- AUXR &= 0xFB; //定時器2工作在12T模式
- T2L = 0xFE; //定時器2初值
- T2H = 0xFF; //定時器2初值
- AUXR |= 0x10; //啟動定時器2
- IE2|=0x01; //串口2中斷允許
- }
- //**********************************************
- // 串口2的中斷服務(wù)函數(shù) S2RI=1才能進(jìn)入中斷服務(wù)
- //**********************************************
- void Uart2_Routnie (void) interrupt 8 //using 1
- {
- static u16 data DMX_count;
- TL0 = 0x30; //定時器0重裝初值,防止定時器0中斷發(fā)生
- TH0 = 0xF8; //定時器0重裝初值,防止定時器0中斷發(fā)生
- switch(S2CON&0x05) //判斷S2RB8以及S2RI
- {
- case 1:DMX_count=0;S2CON&=0xf0;break; //如果S2RB8是0,S2RI是1,清除S2RI
- case 5: //如果S2RB8是1,S2RI是1
- {
- if(DMX_count<Pixel_Data_Num) //只保存需要的最多字節(jié)數(shù)量
- {
- DMX512_Read_Buffer[DMX_count]=S2BUF;//保存
- }
- DMX_count++; //計數(shù)器增加
- }
- S2CON&=0xf0; //清除S2RI
- break;
- }
- }
復(fù)制代碼
WS2812_Drive.c
- #include "all.h"
- u8 xdata WS2812_Write_Buffer[Pixel_Data_Num];
- //**********************************************
- // WS2812初始化
- //**********************************************
- void WS2812_Init()
- {
- WS2812_DAT=1; //拉高
- }
- //**********************************************
- // WS2812 發(fā)送數(shù)據(jù) 0.5625us是高電平的界限。發(fā)0高電平不能超過0.5625
- //**********************************************
- void WS2812_Write_Data(u8 *Point,u8 len)
- {
- u8 data i,j,k,Value;
- for(i=0;i<len;i++) //多少個RGB燈就發(fā)送多少次
- {
- for(j=0;j<3;j++) //每個燈是R G B 三種顏色數(shù)據(jù)
- {
- switch(j) //紅綠調(diào)換位置。
- {
- case 0:Value=*(Point+1);break;
- case 1:Value=*(Point);break;
- case 2:Value=*(Point+2);break;
- }
- for(k=0;k<8;k++) //每個數(shù)據(jù)是8位
- {
- WS2812_DAT=1;
- if(Value&0x80) //判斷數(shù)據(jù)是不是1
- {
- _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
- _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
- WS2812_DAT=0; //0.35us
- //_nop_();_nop_();
- }
- else
- {
- WS2812_DAT=0; //1.36us
- _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
- _nop_();_nop_();_nop_();_nop_();_nop_();
-
-
- }
- Value<<=1;
- }
- }
- Point+=3;//指針加加
- }
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
0.png (55.78 KB, 下載次數(shù): 138)
下載附件
2018-4-18 03:52 上傳
所有資料51hei提供下載:
WS2812面板燈制作資料.zip
(7.71 MB, 下載次數(shù): 289)
2018-4-18 15:51 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|