单片机源程序如下:
- #include "all.h"
- u8 xdata DMX512_Read_Buffer[Pixel_Data_Num];
- //**********************************************
- // DMX512初始化串口与定时器 24M
- //**********************************************
- void DMX_Init()
- {
- S2CON = 0xD0; //9位数据,波特率可设置
- AUXR &= 0xFB; //定时器2工作在12T模式
- T2L = 0xFE; //定时器2初值
- T2H = 0xFF; //定时器2初值
- AUXR |= 0x10; //启动定时器2
- IE2|=0x01; //串口2中断允许
- }
- //**********************************************
- // 串口2的中断服务函数 S2RI=1才能进入中断服务
- //**********************************************
- void Uart2_Routnie (void) interrupt 8 //using 1
- {
- static u16 data DMX_count;
- TL0 = 0x30; //定时器0重装初值,防止定时器0中断发生
- TH0 = 0xF8; //定时器0重装初值,防止定时器0中断发生
- 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) //只保存需要的最多字节数量
- {
- DMX512_Read_Buffer[DMX_count]=S2BUF;//保存
- }
- DMX_count++; //计数器增加
- }
- S2CON&=0xf0; //清除S2RI
- break;
- }
- }
复制代码- #include "all.h"
- u8 xdata WS2812_Write_Buffer[Pixel_Data_Num];
- //**********************************************
- // WS2812初始化
- //**********************************************
- void WS2812_Init()
- {
- WS2812_DAT=1; //拉高
- }
- //**********************************************
- // WS2812 发送数据 0.5625us是高电平的界限。发0高电平不能超过0.5625
- //**********************************************
- void WS2812_Write_Data(u8 *Point,u8 len)
- {
- u8 data i,j,k,Value;
- for(i=0;i<len;i++) //多少个RGB灯就发送多少次
- {
- for(j=0;j<3;j++) //每个灯是R G B 三种颜色数据
- {
- switch(j) //红绿调换位置。
- {
- case 0:Value=*(Point+1);break;
- case 1:Value=*(Point);break;
- case 2:Value=*(Point+2);break;
- }
- for(k=0;k<8;k++) //每个数据是8位
- {
- WS2812_DAT=1;
- if(Value&0x80) //判断数据是不是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;//指针加加
- }
- }
- //**********************************************
- // WS2812显示数据
- //**********************************************
- void WS2812_Display_Ser()
- {
- WS2812_Write_Data(WS2812_Write_Buffer+1,169);//发送169个灯的数据
- }
复制代码
详细教程:http://www.51hei.com/bbs/dpj-113653-1.html
所有资料51hei提供下载:
DMX512转WS2812 面板灯程序.zip
(56.77 KB, 下载次数: 47)
|