二哲科技

  • 227 主题
  • 768 帖子
  • 2344 积分
  • 身份:版主
  • 论坛新秀 灌水之王
  • E币:1590

STC8单片机驱动ws2812b

2021-9-21 14:58:59 显示全部楼层
看见X宝 卖的ws2812灯带觉得挺好玩,闲来无事买了一条1米60灯的。自己写了个驱动 :功能 1 灯全亮(可调7色),2流水灯(可调7色),3 灯全亮闪烁(可调7色)
制作出来的实物图如下:
1.jpg

2.jpg

3.jpg


单片机源程序如下:
  1. #include <ws2812b.h>

  2. bit BUS_1MS ;
  3. u8 RR=0XFE;
  4. u8 GG=0XFE;
  5. u8 BB=0XFE;
  6. u8 mode;
  7. u8 Loop_Speed=120; //流水灯延时变量
  8. unsigned char bdata LED_DAT; //可位操作的数据发送缓存变量
  9. sbit bit0=LED_DAT^0; //被发送数据的各位定义
  10. sbit bit1=LED_DAT^1;
  11. sbit bit2=LED_DAT^2;
  12. sbit bit3=LED_DAT^3;
  13. sbit bit4=LED_DAT^4;
  14. sbit bit5=LED_DAT^5;
  15. sbit bit6=LED_DAT^6;
  16. sbit bit7=LED_DAT^7;

  17.         

  18. /******************IO口初始化*************************/
  19. /* 功能 : 设置P1 P2 P3 口为双向IO口*/

  20. void IO_init(void)
  21. {
  22.     P1M1 = 0;   P1M0 = 0;   //设置为准双向口
  23.     P3M1 = 0;   P3M0 = 0;   //设置为准双向口
  24.     P5M1 = 0;   P5M0 = 0;   //设置为准双向口
  25. }
  26. /*****************************************************/
  27. void Timer0Init(void)                //1毫秒@24.000MHz
  28. {
  29.         AUXR |= 0x80;                //定时器时钟1T模式
  30.         TMOD &= 0xF0;                //设置定时器模式
  31.         TL0 = 0x40;                //设置定时初始值
  32.         TH0 = 0xA2;                //设置定时初始值
  33.         TF0 = 0;                //清除TF0标志
  34.         TR0 = 1;                //定时器0开始计时
  35.         ET0 = 1;    //打开定时器0
  36.         EA =1 ;     //打开总中断
  37. }

  38. void timer0() interrupt 1 //1毫秒@24.000MHz
  39. {
  40.         BUS_1MS = 1;
  41. }
  42. //*******************发送数据**********************//
  43. //数据格式G7-G0;R7-R0;B7-B0;//

  44. void SendData(u8 dat)
  45. {
  46.         LED_DAT = dat;
  47.         if(bit7==1){CODE_1} else{CODE_0}
  48.         if(bit6==1){CODE_1} else{CODE_0}
  49.         if(bit5==1){CODE_1} else{CODE_0}
  50.         if(bit4==1){CODE_1} else{CODE_0}
  51.         if(bit3==1){CODE_1} else{CODE_0}
  52.         if(bit3==1){CODE_1} else{CODE_0}
  53.         if(bit1==1){CODE_1} else{CODE_0}
  54.         if(bit0==1){CODE_1} else{CODE_0}

  55. }


  56. /******************流水灯函数******************************/
  57. /* 功能 : 流水灯函数 */        

  58. void loop_LED()
  59. {
  60. unsigned char i,j,k;
  61.         if(++k>=Loop_Speed)
  62.         {
  63.                 k=0;
  64.                 if(++j<=60)
  65.                 {               
  66.                         for(i=j;i>0;i--)  //关闭所有灯
  67.                         {
  68.                                 SendData(0x00);
  69.                                 SendData(0x00);
  70.                                 SendData(0x00);
  71.                         }
  72.                                 SendData(RR);
  73.                                 SendData(GG);
  74.                                 SendData(BB);        
  75.                 }        
  76.                 if(j==60) j=0;
  77.         }
  78. }

  79. /******************七彩全亮闪烁模式函数******************************/
  80. /* 功能 :全部LED 间隔50毫秒闪烁 */        

  81. void twinkle_LED()
  82. {
  83. unsigned char j,k;
  84.         k++;
  85.         if(k>100) k=0;
  86.         if(k==0)//Loop_Speed)
  87.         {
  88.                 for(j=0;j<60;j++)
  89.                 {               
  90.                         SendData(RR);
  91.                         SendData(GG);
  92.                         SendData(BB);        
  93.                 }               
  94.         }
  95.         if(k==50)//Loop_Speed)
  96.         {
  97.                 for(j=0;j<60;j++)
  98.                 {               
  99.                         SendData(0x00);
  100.                         SendData(0x00);
  101.                         SendData(0x00);        
  102.                 }               
  103.         }        
  104. }
  105. /******************七彩全亮模式函数******************************/
  106. /* 功能 : 点亮60颗LED */        

  107. void ON_LED()
  108. {
  109. unsigned char j,k;
  110. if(++k>=100)
  111. {
  112.          k=0;
  113.                 for(j=0;j<60;j++)
  114.                 {               
  115.                         SendData(RR);
  116.                         SendData(GG);
  117.                         SendData(BB);        
  118.                 }               
  119.         }
  120. }
  121. /******************七彩全灭模式函数******************************/
  122. /* 功能 :关闭全部LED  */        

  123. void OFF_LED()
  124. {
  125. unsigned char j,k;
  126. if(++k>=250)
  127. {
  128.          k=0;
  129.                 for(j=0;j<250;j++)
  130.                 {               
  131.                         SendData(0x00);
  132.                         SendData(0x00);
  133.                         SendData(0x00);        
  134.                 }               
  135.         }
  136. }
  137. /******************按键扫描******************************/
  138. /* 功能 : 设置S6按键长短按识别小于20MS短按 长于3S长按 */        
  139. void keyScan()
  140.         {
  141.                 static unsigned char i;
  142.     static unsigned int key_press_time = 0;  // ……请记得标为静态变量
  143.                 static unsigned int key_press_time2 = 0;  // ……请记得标为静态变量
  144.     if(s6==0)
  145.                         {
  146.         if(++key_press_time <=0 ) --key_press_time;//计量按键时间,并避免数据溢出
  147.         if(key_press_time==3000)
  148.                                 {
  149.             //在此写下按键长按3s时要做的事情
  150.                                         LED2_REV();
  151.                                 Loop_Speed=        Loop_Speed-15;                        
  152.                                 }
  153.                         }
  154.                         else
  155.                         {
  156.         if(10<=key_press_time && key_press_time < 3000)
  157.                                 {
  158.             //大于20ms小于3s,视为短按,在此写下写短按的处理代码
  159.                                         LED1_REV();
  160.                                         i++;
  161.                                         switch(i)  //s6按键LED7色控制
  162.                                         {
  163.                                                 case 0 : {RR=0X00;GG=0X00;BB=0XFE; break;}
  164.                                                 case 1 : {RR=0X00;GG=0XFE;BB=0X00; break;}
  165.                                                 case 2 : {RR=0XFE;GG=0X00;BB=0X00; break;}
  166.                                                 case 3 : {RR=0XFE;GG=0XFE;BB=0X00; break;}
  167.                                                 case 4 : {RR=0X00;GG=0XFE;BB=0XFE; break;}
  168.                                                 case 5 : {RR=0XFE;GG=0X00;BB=0XFE; break;}
  169.                                                 case 6 : {RR=0XFE;GG=0XFE;BB=0XFE; break;}
  170.                                                 case 7 : {i=0;                                                                                 break;}
  171.                                         }
  172.         }
  173.         key_press_time=0;
  174.                         }
  175.                         
  176.                         if(s2==0)
  177.                         {
  178.         if(++key_press_time2 <=0 ) --key_press_time2;//计量按键时间,并避免数据溢出
  179.         if(key_press_time2==3000)
  180.                                 {
  181.             //在此写下按键长按3s时要做的事情
  182.                                         LED2_REV();
  183.                                                 
  184.                                 }



您需要登录后才可以评论 登录 | 立即注册

最新评论

楼层直达:
快速回复
0
0
广告
关闭 热点推荐上一条 /1 下一条
快速回复 返回列表