【51单片机】STC15F104W同系列芯片驱动WS2812彩灯!!

使用的芯片为STC15F104W同系列的IRC15F107W,只有该型号的芯片能驱动WS2812的RGB彩灯!

因为该型号的芯片使用内置24Mhz时钟,而WS2812的时序要求精确到ns级别,于是对时钟的最低要求就是24Mhz

而且IRC15F107W同STC15F104W,只有8个引脚的简单封装,并且内部自带震荡源无须外部晶振,插上电直接就能用

最重要的是和其它C51单片机通用头文件,所以引用的时候只需要包含reg52.h文件即可!
所以该单片机非常适合新手入门,即便是小白看了也能学会!

IRC15F107W 管脚(默认内部震荡源24Mhz)

1 P3.4
2 VCC 3.8–5.5V
3 P3.5
4 GND
5 P3.0 接烧录器的TXD
6 P3.1 接烧录器的RXD
7 P3.2
8 P3.3

这是WS2812时序图

WS2812时序图

然后是代码部分,我用的双色流水灯做的范例:

#include "reg52.h"
#include "intrins.h"
#define WS2812_NUM 60  //灯的数量
sbit Led_Pin = P3^0;    //控制灯的引脚
unsigned short G_0=191;//流水灯第一个颜色定义
unsigned short R_0=98;
unsigned short B_0=10;
unsigned short G_1=11;//流水灯第二个颜色定义
unsigned short B_1=45;
unsigned short R_1=14;

然后就是用STC烧录软件自带的延时计算器一键推出的延迟函数

void delay_ms(unsigned int ms)        //@24.000MHz
{
        unsigned char data i, j;
  while(ms--){
        _nop_();
        i = 24;
        j = 85;
        do
        {
                while (--j);
        } while (--i);
}
}
void Delay75us(void)        //@24.000MHz
{
        unsigned char data i, j;

        i = 2;
        j = 189;
        do
        {
                while (--j);
        } while (--i);
}

然后是WS2812写入0和1的程序

void ws2812_writebit1(void){
Led_Pin=1;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
        Led_Pin=!Led_Pin;
//_nop_();_nop_();_nop_();
}

void ws2812_writebit0(void){
Led_Pin=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
Led_Pin=!Led_Pin;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
}

然后是按G,R,B顺序依次传输单一颗灯颜色信息的程序

void ws2812_writecolor(unsigned short dat){
//由于STC8G1K08执行左移或者右移等移位操作耗时太久(2us,无符号短整型都这样),导致时序严重落后,所以用原始的if-else代码进行代替
        if(dat&0x80)
  ws2812_writebit1();
else
  ws2812_writebit0();
if(dat&0x40)
         ws2812_writebit1();
else
  ws2812_writebit0();
if(dat&0x20)
         ws2812_writebit1();
else
  ws2812_writebit0();
if(dat&0x10)
         ws2812_writebit1();
else
  ws2812_writebit0();
if(dat&0x08)
         ws2812_writebit1();
else
  ws2812_writebit0();
if(dat&0x04)
         ws2812_writebit1();
else
  ws2812_writebit0();
if(dat&0x02)
         ws2812_writebit1();
else
  ws2812_writebit0();
if(dat&0x01)
         ws2812_writebit1();
else
  ws2812_writebit0();
}
void ws2812_writeled(unsigned short green,unsigned short red,unsigned short blue){
ws2812_writecolor(green);
ws2812_writecolor(red);
ws2812_writecolor(blue);
}       

然后是WS2812执行到最后一颗灯用的结尾程序,以及清屏程序

void ws2812_rest()
{
        Led_Pin=0;
       
        Delay75us();
}
void ws2812_clear()
{
        static int j=0;
        for(j=0;j<WS2812_NUM;j++)
        {
                ws2812_writeled(0,0,0);
        }
        ws2812_rest();
        ws2812_rest();
        ws2812_rest();
}

流水灯主程序

void WS2812_DIS()
{
        static int j=0;
        int i;

        j%=WS2812_NUM;
        j++;

        for(i=0;i<WS2812_NUM;i++)
        {
                if(i>j&&(i<j+10))
                {
                        ws2812_writeled(G_0,R_0,B_0);
                }
                else
                {
                        ws2812_writeled(G_1,R_1,B_1);
                       
                }
        }
       
}

void main(void)
{
        ws2812_clear();
        while(1)
  {
                WS2812_DIS();
                delay_ms(50);
        }
}

希望大家能学到东西!完整代码在压缩包里!

最后附上一张效果图:
效果图:

  • 11
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于51单片机开发的小程序,学习资料,用于学习51单片机的嵌入式开发,应用案例 基于51单片机开发的小程序,学习资料,用于学习51单片机的嵌入式开发,应用案例 基于51单片机开发的小程序,学习资料,用于学习51单片机的嵌入式开发,应用案例 基于51单片机开发的小程序,学习资料,用于学习51单片机的嵌入式开发,应用案例基于51单片机开发的小程序,学习资料,用于学习51单片机的嵌入式开发,应用案例基于51单片机开发的小程序,学习资料,用于学习51单片机的嵌入式开发,应用案例基于51单片机开发的小程序,学习资料,用于学习51单片机的嵌入式开发,应用案例基于51单片机开发的小程序,学习资料,用于学习51单片机的嵌入式开发,应用案例基于51单片机开发的小程序,学习资料,用于学习51单片机的嵌入式开发,应用案例基于51单片机开发的小程序,学习资料,用于学习51单片机的嵌入式开发,应用案例基于51单片机开发的小程序,学习资料,用于学习51单片机的嵌入式开发,应用案例基于51单片机开发的小程序,学习资料,用于学习51单片机的嵌入式开发,应用案例基于51单片机开发的小程序,学习资料,用于学习51单片机的嵌入式开发,应用案例基于51单片机开发的小程序,学习资料,用于学习51单片机的嵌入式开发,应用案例基于51单片机开发的小程序,学习资料,用于学习51单片机的嵌入式开发,应用案例
STC15F104W是一款集成了8位单片机和丰富外设的芯片,而WS2812是一种数字可编程LED灯,下面我用300字中文为您详细介绍一下这两者。 STC15F104W是深圳市思特奇科技有限公司生产的一款高性能单片机芯片。它采用了8051内核架构,主频可达到12MHz,具有8K字节的闪存和256字节的RAM,内存容量较大,适用于各种嵌入式系统。此外,STC15F104W还带有多个通用IO口、定时器、UART等丰富的外设,方便用户进行各种数据处理和通信功能的实现。 而WS2812是一种数字可编程LED灯,也被称为NeoPixel。它采用了内部智能控制器和RGB三基色LED组合集成在一个芯片上。WS2812的最大特点是数字可编程,每个LED点都可以独立编程控制亮度和颜色。此外,WS2812还具有低功耗、驱动电压范围宽、色彩饱满、变化丰富等特点,因此在各种LED灯带、屏幕和艺术装饰中广泛应用。 结合STC15F104WWS2812,可以实现丰富的LED灯效控制。STC15F104W可以作为控制器,通过与WS2812的串行通讯,向WS2812发送控制指令,来控制LED灯的亮度、颜色和模式。用户可以根据需要编写相应的程序,使WS2812显示出不同的光效效果,如呼吸灯、流水灯、彩虹灯等。同时,STC15F104W还可以通过其他外设如传感器、按键等与WS2812进行交互,实现更多复杂的控制功能。 综上所述,STC15F104WWS2812搭配使用,可以实现丰富多样的LED灯效控制,广泛应用于各种装饰和显示设备中,为我们的生活带来更多的乐趣和美感。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值