设为首页收藏本站淘宝杂货铺

从F到0 - From F to 0

 找回密码
 注册已关闭
搜索
查看: 2045|回复: 0
收起左侧

STC-Y3单片机ws2812B全彩RGB LED彩灯驱动程序 演示随机变色

[复制链接]
发表于 2020-7-1 18:40:48 | 显示全部楼层 |阅读模式
u=2495845425,3405643496&fm=26&gp=0.jpg

  1. //单片机型号:STC15F104E等STC-Y3系列 晶振频率:33Mhz

  2. #include "reg51.h"
  3. #include "intrins.h"
  4. #include "stdlib.h"
  5. #include "stdio.h"

  6. #define u8 unsigned char
  7. #define u32 unsigned long
  8. #define RED 0
  9. #define GREEN 1
  10. #define BLUE 2
  11. #define ws2812B_num        8                //ws2812B 级联数量
  12. sbit ws2812B = P3^4;                        //ws2812B 数据端口
  13. u8 ws2812B_VRAM[ws2812B_num][3];        //ws2812B 颜色值显存 (RGB值缓存) 占用字节数:级联数量*3

  14. void delay1s(){
  15.     u8 a,b,c;
  16.     for(c=223;c>0;c--)
  17.         for(b=212;b>0;b--)
  18.             for(a=173;a>0;a--);
  19.     _nop_();
  20.     _nop_();
  21. }

  22. void ws2812B_delay850ns(){
  23.     u8 a;
  24.     for(a=4;a>0;a--);
  25. }

  26. void ws2812B_delay400ns(){
  27.          _nop_();
  28. }

  29. void ws2812B_delay50us(){
  30.     u8 a,b;
  31.     for(b=117;b>0;b--)
  32.         for(a=2;a>0;a--);
  33. }


  34. void ws2812B_Reset(){        //发送帧复位信号
  35.         ws2812B = 0;
  36.         ws2812B_delay50us();
  37. }

  38. u32 rgb(u8 red,u8 green,u8 blue){        //易语言的 取颜色值()
  39.         return red|green<<8|(u32)blue<<16;
  40. }

  41. void ws2812B_SendColor(u32 rgb){        //发送颜色数据 参数1:颜色值(范围:0~16777215)
  42.         u8 i,j,k;
  43.         for(j=0;j<3;j++){
  44.         k=rgb>>(j<<3);
  45.         for(i=0;i<8;i++){
  46.                 if(k&0x80){        //从高位开始发送 发送1码
  47.                         ws2812B=1;                //T1H 1码高电平时间 850ns±150ns
  48.                         ws2812B_delay850ns();
  49.                         ws2812B=0;                //T1L 1码低电平时间 400ns±150ns
  50.                         ws2812B_delay400ns();
  51.                 } else {        //发送0码
  52.                         ws2812B=1;                //T0H 0码高电平时间 400ns±150ns
  53.                         ws2812B_delay400ns();
  54.                         ws2812B=0;                //T0L 0码低电平时间 850ns±150ns
  55.                         ws2812B_delay850ns();
  56.                 }
  57.                         k<<=1;                 //左移1位
  58.                 }
  59.         }
  60. }


  61. void ws2812B_SendVRAM(){        //发送显存(刷新显示)
  62.         u8 i;
  63.         for(i=0;i<ws2812B_num;i++){
  64.                 ws2812B_SendColor(rgb(ws2812B_VRAM[i][RED],ws2812B_VRAM[i][GREEN],ws2812B_VRAM[i][BLUE]));
  65.         }
  66.                 ws2812B_Reset();
  67. }

  68. void ws2812B_VRAM_Fill_Rand(){        //显存填充随机
  69.         u8 i;
  70.         for(i=0;i<ws2812B_num;i++){
  71.         ws2812B_VRAM[i][RED] = rand();
  72.         ws2812B_VRAM[i][GREEN] = rand();
  73.         ws2812B_VRAM[i][BLUE] = rand();
  74.         }
  75. }


  76. void main(){
  77.         while(1){
  78.                 ws2812B_VRAM_Fill_Rand();
  79.                 ws2812B_SendVRAM();
  80.                 delay1s();
  81.         }
  82. }
复制代码

相关帖子

您需要登录后才可以回帖 登录 | 注册已关闭

本版积分规则

QQ|手机版|Archiver|从F到0 ( 蒙ICP备17002595号-1 )
蒙公网安备15010402000325号

腾讯云安全认证

GMT+8, 2024-4-20 20:24 , Processed in 0.527030 second(s), 22 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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