STC8G1K08A驱动WS2812B模块(原理+代码+完整工程)

一、WS2812B简介

WS2812B,是一款内置IC的RGB三色LED. 简单说,就是给它供电和数据,它就能按要求显示. 多顆燈珠還能通手牽手的方式连起来,只通过1个I/O口,控制多颗灯珠.
WS2812B共4个引脚: VCC,GND,VI,VO.

  • VCC和GND为电源的正负极(5V直流电供电).
  • VI为数据输入引脚(用于接受单片机的数据);
  • VO为数据输出引脚(多个WS2812B时使用);

二、模块原理图与实物

这里我使用的8颗灯的条形模块

实物图
原理图
原理图只画出3颗LED,实际原理都是相同的; 每颗LED的DI接上一颗的DO,如此重复.

三、模块接线

STC8开发板WS2812B
VCCVCC
GNDGND
P3.3IN

在这里插入图片描述

四、关键代码

  • main.c
#include "stc8.h" 
#include "WS28.h"

void DelayMs(int t);		//@24MHz

void main() 
{
	unsigned char bright= 0xFF;//定义亮度值 
	
	WS28_Init(); //引脚初始化
	
	while (1) 
	{	
			WS28_Reset();
			
			WS28_SetRGB(bright,0,0); //点亮第1颗灯 红色
			WS28_SetRGB(0,bright,0); //
			WS28_SetRGB(0,0,bright);

			WS28_Reset();
	
			DelayMs(100); //延时100ms
	 } 
}

  • WS2812.h
#include <intrins.h>

#define WS28_PIN P33//引脚定义

//初始化引脚
void WS28_Init() 
{
	//引脚P33初始化为输出
  P3M0 |= 0x08; 
  P3M1 &= 0xF7;
}


//模块复位
void WS28_Reset()
{
	unsigned char i=200;	
	
	//引脚拉低,然后延时一段时间
	WS28_PIN = 0;
	do
	{
		_nop_();_nop_();_nop_();_nop_();_nop_();
		_nop_();_nop_();_nop_();_nop_();_nop_();
		_nop_();_nop_();_nop_();_nop_();_nop_();
		_nop_();_nop_();_nop_();_nop_();_nop_();
		_nop_();_nop_();_nop_();_nop_();_nop_();

	}while(i--);

}

	
//模块写入一组数据
void  WS28_SetRGB(unsigned char r_data,//红色
									unsigned char g_data,//绿色
									unsigned char b_data)//蓝色
{
  unsigned char temp[3];
	unsigned char n,j;
	unsigned char dat;
	
	//注意顺序,按照数据手册为grb顺序排列
	temp[0]= g_data;
	temp[1]= r_data;
	temp[2]= b_data;
	
	for(n=0;n<3;n++)//循环3次(发送一组 rgb 颜色数据)
	{
		dat = temp[n];
		for(j=0;j<8;j++)//循环8次(发送1byte数据)
		{
				if(dat &0x80) //写入数据1
				{
					WS28_PIN = 1;
					_nop_();_nop_();_nop_();_nop_();_nop_();
					_nop_();_nop_();_nop_();_nop_();_nop_();
					_nop_();_nop_();_nop_();_nop_();_nop_();
					_nop_();_nop_();_nop_();_nop_();_nop_();
					_nop_();_nop_();_nop_();_nop_();
					WS28_PIN = 0;
					_nop_();_nop_();_nop_();_nop_();_nop_();
					
					dat = dat<<1;
				}
				else//写入数据0
				{
					WS28_PIN = 1;
					_nop_();
					_nop_();
					WS28_PIN = 0;
					_nop_();
					_nop_();
					
					dat = dat<<1;
				}
				
		}
	}
			

}

完整的工程请在 文末下载

五、注意事项

5.1 Keil工程的設置

  • Keil需要选择对应的单片机型号
    Keil型号选择 01
    keil型号选择 02

  • 关闭优化功能为Level0(避免编译器过度优化,导致时序不正确)
    编译器优化等级

5.2 代码编程

  • 需要**#include “stc8.h”**
  • 使用_nop_()函数前,需要**#include “intrins.h”**
  • 根据主时钟频率,调整延时函数的数量
    – STC8G1K08A最高支持35MHz
    – 这里使用24MHz
  • 使用下载时,注意选择型号配置时钟频率 (如下图)

在这里插入图片描述

5.2 程序调试

使用逻辑分析仪(也可以用示波器),检查VI引脚的输出信号.

  • 因为只有高低电平,这里就使用逻辑分析仪;
  • 使用游标功能,能测量出高低电平的长度是否符合要求;
  • 添加协议解析后,方便解析出数据并检查比较.
    高电平时间测量

WS2812B协议解码

5.3 实验结果

总结与拓展

  • 实现了多个WS2812B的串联控制
  • 实际测试中,发现有电平时间不太正确;知道怎样解决的老大麻烦留言指导一下
  • 以后可以将多个WS2812B按阵列的方式排布,作为点阵使用

完整工程

### 关于STC8G1K08A-36I-SOP8芯片的烧录方法 #### 准备工作 为了成功完成STC8G1K08A-36I-SOP8芯片的固件烧录,需准备以下材料: - 计算机一台并安装有STC-ISP软件[^1]。 - USB转TTL串口线一根用于连接计算机与目标开发板。 #### 连接硬件设备 按照下述方式连接各部件: - 将USB转TTL模块上的TXD端子接到单片机P3.0(RXD)引脚; - RXD端子连到单片机P3.1(TXD)引脚; -ISP应用程序,在程序界面内设置参数如下: - **MCU型号**: 选择`STC8G1K08A-36I-SOP8`; - **通信接口**: 设置为`COMX`(具体取决于实际使用的串口号); - **波特率**: 推荐初始设为默认值9600bps; - 如果遇到串口无响应的情况,可以尝试调整定时器配置来适配不同的波特率生成方案[^2]. #### 编译并加载HEX文件 编写好源代码之后编译成`.hex`格式的目标文件。通过STC-ISP中的“打开Hex/IicBin…”选项导入此.hex文件至编程器内存中待写入。 #### 开始烧录过程 点击界面上方工具栏里的绿色箭头按钮执行在线下载命令,等待进度条走完即表示已成功将新固件刷入指定位置。期间保持稳定电源供应以及良好接触状态非常重要。 ```python # 示例Python代码片段展示如何调用外部工具进行自动化操作(仅作示意用途) import subprocess def flash_firmware(hex_file_path): isp_tool_command = ["stc-isp", "-p", "com3", "-b", "9600", "-f", hex_file_path] result = subprocess.run(isp_tool_command, capture_output=True) flash_firmware('path/to/your/firmware.hex') ```
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值