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