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);
- }
- }
復制代碼
|