STC8A定时器控制WS2812B RGB彩灯

**!!**定时器中断法控制WS2812B不可行!!
         原因:即使在40MHZ不分频的情况下,WS2812B一个节拍16机器周期(即400ns),然而一个i++或i--需要5-7个机器周期,一个最简单的while至少需要13个机器周期,所以会导致定时器中断来临时,本该在上一个中断前执行完毕的程序执行不完甚至没有机会执行就发生了下一次中断并改变了上一个中断的执行条件。

最简单的while代码:

    i=1;//13个机器周期不包括赋值,赋值占4个机器周期
    while(i)
       {
          i--;
        }

时钟周期、振荡周期、机器周期

1.时钟周期=振荡周期=1秒/晶振频率

2.51内核单片机即兼容Intel8031指令系统的单片机统称,故51内核单片机每个指令所需机器周1T和12T是一样的,不同的只是机器周期占用时钟周期的长短。根据指令占用机器周期的多少分为1周期指令、2周期指令、4周期指令(只有乘法(MUL)和除法(DIV)),指令速查表如下。

3.单片程序执行最小时间单位(T--->time:次数):

1T单片机(STC8A系列):1机器周期=1时钟周期,即晶振跳一下执行一个基本动作,所以ST8A系列单片机又叫单时钟/机器周期单片机

12T单片机(80C51/80C52):1机器周期=12时钟周期;

4.老版本:一个机器周期包含六个状态例如,取指令、存储器读、存储器写等。即机器周期等于6个状态周期,而一个状态周期是2个时钟周期,因此一个机器周期又等于12个时钟周期,这就是12T的由来,但新改进的1T单片机在一个时钟周期就能把这六个状态一次执行完;

5.一般i--占5或7个机器周期;i++占6个机器周期。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要使用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输出模块来更方便地生成控制信号,并且可以使用更高级的算法来生成更复杂的颜色效果。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值