基于stc8实现ws2812点灯

基于stc8h实现ws2812b的点灯

先说结论:由于精度限制,51单片机大多达不到ns级别的延时操作,因此可以考虑手动增加耗时操作进行软件延时

前言

在使用stc8h8k64u时,通过矩阵键盘的学习,突发奇想,查看是否可以通过stc8实现客制化小数字键盘,考虑到这款芯片最多支持8通道的同时控制,远远不够去做一个可以实现10路以上的呼吸灯,经过一番查找,发现可以使用ws2812b这款可编程RGB发光二极管

ws2812b

这款灯珠是单线传输的三通道 LED 驱动控制芯片,采用单极性归零码协议,因此对电平的要求较高,需要将近ns级别的延时操作

时序图

在这里插入图片描述

电平格式

在这里插入图片描述

通过对上述图中信息的分析,翻译成人话就是用过引脚快速修改高低电平,实现不同数据的输出

输出格式

在这里插入图片描述

首先拉低引脚电平(80us以上),然后开始正常传输数据,顺序是每8bit可以代表一种颜色的深度(高位拉高更亮),如图每次满24bit才点亮1盏灯

存在的问题

最初想法是直接通过delay函数相关的方法来进行拉高拉低等待,但是发现这里的主频24MHz,通过逻辑分析仪发现,在ns单位下的计时并不够精准,因此无法实现.

解决办法

既然无法通过正规的延时实现,那只能使用一些’‘非常规方法’'了,首先我发现在直接进行引脚电平修改而不使用任何延时操作时,时间大概在22ns左右,

在这里插入图片描述

那么我们就可以利用这一点,增加一些无意义的耗时操作,让其刚好处于200-350ns那么就很nice,经过将近一个上午的调试最终试出了一个比较完美的持续时间,刚好使高电平持续时间为333ns

在这里插入图片描述
'1’码高电平

1码高电平
'0’码高电平
0码高电平

于是,就有了以下的代码(计算操作都是在凑延时):

在这里插入图片描述

完美实现高低电平的控制,剩下的就是自己对不同数据的处理了,如果没有跑起LED,可以根据这个思路自己对自定义的耗时操作进行修改,然后通过逻辑分析仪查看是否符合要求

展示图:
在这里插入图片描述

要使用STC8H控制WS2812B,你需要了解WS2812B是一个数字RGB LED,它可以通过单个数据线进行控制。下面是一个基本的控制WS2812B的步骤: 1. 确定WS2812B的电源和地线,可以是5V电源和GND引脚。 2. 连接STC8H的I/O引脚到WS2812B的数据输入引脚。请注意,WS2812B的数据输入引脚应该是一个支持PWM输出的I/O引脚。 3. 使用STC8H的PWM输出模块来生成WS2812B所需的数据信号。 4. 发送数据信号到WS2812B,以控制其显示颜色和亮度。 下面是一些示例代码,可以帮助你开始编写控制WS2812B的程序: ```c #include "reg_stc8.h" // 定义数据线引脚 sbit LED_PIN = P1^0; // 定义颜色数据,颜色数据格式为GRB unsigned char color_data[3] = {0x00, 0xFF, 0x00}; void delay_us(unsigned int us) { unsigned int i; while(us--) { for(i=0;i<12;i++); } } void send_bit(unsigned char bit) { if(bit) { LED_PIN = 0; delay_us(0.8); // 发送位0的时间为0.8us LED_PIN = 1; delay_us(0.45); // 发送位1的时间为0.45us } else { LED_PIN = 0; delay_us(0.4); // 发送位0的时间为0.4us LED_PIN = 1; delay_us(0.85); // 发送位1的时间为0.85us } } void send_byte(unsigned char byte) { unsigned char i; for(i=0;i<8;i++) { send_bit(byte & 0x80); byte <<= 1; } } void send_data(unsigned char* data, unsigned int len) { unsigned int i; for(i=0;i<len;i++) { send_byte(data[i]); } } void main() { // 初始化数据线引脚为输出 LED_PIN = 1; // 发送颜色数据到WS2812B while(1) { send_data(color_data, sizeof(color_data)); } } ``` 该代码示例中,使用了STC8H的GPIO模块控制I/O引脚,并通过手动编写的函数来发送控制信号。在实际使用中,你可以使用STC8H的PWM输出模块来更方便地生成控制信号,并且可以使用更高级的算法来生成更复杂的颜色效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值