示例采用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){} ;
- }
复制代码 |