800ns 400ns 可通过示波器进行自主调节,简单易用易学
单片机源程序如下:
- #include <STC8.H>
- #include "intrins.h"
- sbit ws2812b_IO=P3^3; //控制WS2812数据输出口
- u8 Loop_Speed=120; //流水灯延时变量
- unsigned char bdata LED_DAT; //可位操作的数据发送缓存变量
- sbit bit0=LED_DAT^0; //被发送数据的各位定义
- sbit bit1=LED_DAT^1;
- sbit bit2=LED_DAT^2;
- sbit bit3=LED_DAT^3;
- sbit bit4=LED_DAT^4;
- sbit bit5=LED_DAT^5;
- sbit bit6=LED_DAT^6;
- sbit bit7=LED_DAT^7;
- //*******************发送1码**********************// 1, 18n ,0,6n //STC烧录器设置24M,,,不同单片机 选择不同个数的NOP。
- //一个)_NOP_()为40ns 高码850ns低码400ns
- #define CODE_1 {ws2812b_IO=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();ws2812b_IO=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}
- //*******************发送0码**********************//1 ,9n,0,15n
- //一个)_NOP_()为40ns 高码400ns低码850ns
- #define CODE_0 {ws2812b_IO=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();ws2812b_IO=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}
- void SendData(u8 dat)
- {
- LED_DAT = dat;
- if(bit7==1){CODE_1} else{CODE_0}
- if(bit6==1){CODE_1} else{CODE_0}
- if(bit5==1){CODE_1} else{CODE_0}
- if(bit4==1){CODE_1} else{CODE_0}
- if(bit3==1){CODE_1} else{CODE_0}
- if(bit3==1){CODE_1} else{CODE_0}
- if(bit1==1){CODE_1} else{CODE_0}
- if(bit0==1){CODE_1} else{CODE_0}
- }
- void ON_LED(u8 GG,u8 RR,u8 BB)// 先绿色 后红 后蓝
- {
- SendData(GG);
- SendData(RR);
- SendData(BB);
- }
- void Delay1ms(u16 k) //@24.000MHz Delay1ms(50);//实测50ms
- {
- unsigned char i, j, m;
- for(m=0;m<k;m++)
- {
- _nop_();
- i = 32;
- j = 40;
- do
- {
- while (--j);
- } while (--i);
- }
- }
- void Delay1us(u16 v) //@24.000MHz Delay1us(50);//重置最小时间,实测60us
- {
- unsigned char i ,m;
- for(m=0;m<v;m++)
- {
- i = 6;
- while (--i);
- }
- }
- void init ()
- {
- P3M0=0;
- P3M1=0;
- P5M0=0;
- P5M1=0;
- }
- void main()
- {
- init();
- while(1)
- {
- ON_LED(0X00,0XFF,0X00);//一行代码对应一个灯, 三个255数字对应3灯亮度,可以组合任意颜色 ,重置发送数据时间间隔 Delay1us(50);就重新从第一个地址为发送。
- ON_LED(0X00,0XFF,0X00);
- ON_LED(0X00,0XFF,0X00);
- ON_LED(0X00,0XFF,0X00);
- ON_LED(0X00,0XFF,0X00);
-
- ON_LED(0X00,0X00,0XFF);
- ON_LED(0X00,0X00,0XFF);
- ON_LED(0X00,0X00,0XFF);
- ON_LED(0X00,0X00,0XFF);
- ON_LED(0X00,0X00,0XFF);
-
- ON_LED(0XFF,0X00,0X00);
- ON_LED(0XFF,0X00,0X00);
- ON_LED(0XFF,0X00,0X00);
- ON_LED(0XFF,0X00,0X00);
- ON_LED(0XFF,0X00,0X00);
-
- ON_LED(0X00,0XFF,0XFF);
- ON_LED(0X00,0XFF,0XFF);
- ON_LED(0X00,0XFF,0XFF);
- ON_LED(0X00,0XFF,0XFF);
- ON_LED(0X00,0XFF,0XFF);
- while(1);
- }
- }
复制代码
|