找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2461|回复: 1
打印 上一主题 下一主题
收起左侧

DMX512转WS2812面板灯单片机源程序

[复制链接]
跳转到指定楼层
楼主
ID:306515 发表于 2018-5-5 11:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单片机源程序如下:
  1. #include "all.h"
  2. u8 xdata DMX512_Read_Buffer[Pixel_Data_Num];
  3. //**********************************************
  4. //        DMX512初始化串口与定时器 24M
  5. //**********************************************
  6. void DMX_Init()
  7. {
  8.         S2CON = 0xD0;                //9位数据,波特率可设置
  9.         AUXR &= 0xFB;                //定时器2工作在12T模式
  10.         T2L = 0xFE;                        //定时器2初值
  11.         T2H = 0xFF;                        //定时器2初值
  12.         AUXR |= 0x10;                //启动定时器2
  13.         IE2|=0x01;                        //串口2中断允许
  14. }
  15. //**********************************************
  16. //        串口2的中断服务函数  S2RI=1才能进入中断服务
  17. //**********************************************
  18. void Uart2_Routnie (void) interrupt 8 //using 1
  19. {
  20.         static u16 data DMX_count;
  21.         TL0 = 0x30;                                                                        //定时器0重装初值,防止定时器0中断发生
  22.         TH0 = 0xF8;                                                                        //定时器0重装初值,防止定时器0中断发生
  23.         switch(S2CON&0x05)                                                        //判断S2RB8以及S2RI
  24.         {
  25.                 case 1:DMX_count=0;S2CON&=0xf0;break;        //如果S2RB8是0,S2RI是1,清除S2RI
  26.                 case 5:                                                                        //如果S2RB8是1,S2RI是1
  27.                 {
  28.                         if(DMX_count<Pixel_Data_Num)                //只保存需要的最多字节数量
  29.                         {
  30.                                 DMX512_Read_Buffer[DMX_count]=S2BUF;//保存
  31.                         }
  32.                         DMX_count++;                                                //计数器增加
  33.                 }
  34.                 S2CON&=0xf0;                                                        //清除S2RI                                                
  35.                 break;
  36.         }
  37. }
复制代码
  1. #include "all.h"
  2. u8 xdata WS2812_Write_Buffer[Pixel_Data_Num];
  3. //**********************************************
  4. //        WS2812初始化
  5. //**********************************************
  6. void WS2812_Init()
  7. {
  8.                 WS2812_DAT=1;                                                        //拉高
  9. }
  10. //**********************************************
  11. //        WS2812 发送数据  0.5625us是高电平的界限。发0高电平不能超过0.5625
  12. //**********************************************
  13. void WS2812_Write_Data(u8 *Point,u8 len)
  14. {        
  15.            u8 data i,j,k,Value;
  16.         for(i=0;i<len;i++)                                                        //多少个RGB灯就发送多少次
  17.         {
  18.                 for(j=0;j<3;j++)                                                //每个灯是R G B 三种颜色数据
  19.                 {
  20.                         switch(j)                                                        //红绿调换位置。
  21.                         {
  22.                                 case 0:Value=*(Point+1);break;
  23.                                 case 1:Value=*(Point);break;
  24.                                 case 2:Value=*(Point+2);break;
  25.                         }
  26.                         for(k=0;k<8;k++)                                        //每个数据是8位
  27.                         {
  28.                                 WS2812_DAT=1;                                          
  29.                                 if(Value&0x80)                                        //判断数据是不是1
  30.                                 {
  31.                                         _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  32.                                         _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  33.                                         WS2812_DAT=0;                                 //0.35us
  34.                                         //_nop_();_nop_();
  35.                                 }
  36.                                 else
  37.                                 {        
  38.                                         WS2812_DAT=0;                                 //1.36us
  39.                                         _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  40.                                         _nop_();_nop_();_nop_();_nop_();_nop_();
  41.                                        
  42.                                                                                     
  43.                                 }
  44.                                 Value<<=1;        
  45.                         }
  46.                 }
  47.                 Point+=3;//指针加加               
  48.         }        
  49. }
  50. //**********************************************
  51. //        WS2812显示数据
  52. //**********************************************
  53. void WS2812_Display_Ser()
  54. {
  55.         WS2812_Write_Data(WS2812_Write_Buffer+1,169);//发送169个灯的数据
  56. }
复制代码

详细教程:http://www.51hei.com/bbs/dpj-113653-1.html
所有资料51hei提供下载:
DMX512转WS2812 面板灯程序.zip (56.77 KB, 下载次数: 47)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:390416 发表于 2021-1-6 01:01 | 只看该作者
我靠 这不是我的代码吗?大家用过吗?欢迎评论
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表