示例采用HC89S003F4單片機和7燈Ws2812燈帶。HC89S003F4是1T增強型51單片機,如用其他51單片機,需調整晶振頻率。示例僅進行7燈的單次驅動,可在聲明和數組中改變燈珠數量和數據,主函數中修改后可實現流水燈效果。
/*
*HC89S003F4驅動WS2812彩燈演示(7只Led)
*CPU:HC89S003F4 16K bytes flash ROM, 256+256 bytes data RAM
*HC89S003F4是1T增強型51單片機,如用普通51單片機,晶振頻率需增大
*/
- #define ALLOCATE_EXTERN
- #include "HC89S003F4.h"
- #include <intrins.h>
- #define WS2812_IO P2_2 //定義驅動引腳
- //xdata unsigned char col[21];
- //7只LED,共21個數據,每組GRB排列
- const unsigned char col[21] = {0x22,0x00,0x00,
- 0x00,0x22,0x00,
- 0x00,0x00,0x22,
- 0x22,0x22,0x00,
- 0x00,0x22,0x22,
- 0x22,0x00,0x22,
- 0x22,0x22,0x22,
- };
- void ws2812_rst(void)
- {
- u8 i; //
- WS2812_IO = 1;
- i = 100; // 如果主頻較高適當增加
- while(i--);
- WS2812_IO = 0;
- i = 100; // 如果主頻較高適當增加
- while(i--);
- }
- void ws2812_write_byte( u8 dat)
- {
- u8 i = 8;
- dat <<= 1; //最高位進入CY
- while(i)
- {
- //高電平時間小于0.45uS為邏輯0,大于時為邏輯1
- WS2812_IO = 1;
- //如果主頻較高可在此處適當增加_nop_();
- WS2812_IO = CY;
- //如果主頻較高可在此處適當增加_nop_();
- _nop_();
- WS2812_IO = 0;
- dat <<= 1; //最高位進入CY
- i--;
- }
- }
- /**************************************************************************************
- void main()
- {
- unsigned char i;
- /************************************系統初始化****************************************/
- WDTCCR = 0x00; //關閉看門狗
- //本例程為方便測試關閉看門狗,實際使用中,建議客戶打開看門狗,詳見WDT復位例程
- CLKSWR = 0x53; //選擇內部高頻RC為系統時鐘,內部高頻RC 8分頻,Fosc=4MHz
- CLKDIV = 0x01; //Fosc 1分頻得到Fcpu,Fcpu=4MHz
- P2M1 = P2M1&0xF0|0x08; //P22設置為推挽輸出
-
- /****以上為HC89S003F4單片機專用的SFR,普通單片機不用設置,但需提高晶振頻率*****/
- ws2812_rst();
- for( i= 0; i< 21 ;i++)
- {
- ws2812_write_byte( col[i]);
- }
- while(1){} ;
- }
復制代碼 |