STC15单片机驱动WS2812B七彩LED(汇编混合编程)

发布者:数字奇迹最新更新时间:2021-07-02 来源: eefocus关键字:STC15  单片机  七彩LED 手机看文章 扫描二维码
随时随地手机看文章

WS2812B七彩LED具有集成度高、使用方便等特点,但是800K的数据速率(IO变化速率高达2.4M),对单片机提出了较高的要求,通常是采用SPI+DMA方式驱动,  


也有人采用汇编实现,但是要预先把数据转换为按bit存放,在LED级连数量较多的情况下,需要占用极多的存储空间。


在驱动WS2812B上花费了太多的时间,走了不少弯路,记录下来:

  • 简易数字分析仪采样频率最高只有4M,即测量精度为250ns,而信号宽度要求为400ns和850ns,这样测量的结果存在较大的误差,让人误以为信号跳变无规律,
    迷失了方向;解决的办法就是利用STC单片机主时钟的内分频功能,语句:CLK_DIV |= 0x07; 将主频降低128倍,这样测量的波形就足够准确了。

  • STC15系列可以使用内置振荡电路,主频高达27M,高速才有足够的时间进行数据处理,最终选择的是24M的主频。

  • 汇编与C混合编程,开始以为很复杂,做了发现不是很困难,主要还是对汇编本身的理解。
    1、形式上,在C语言中通过#pragma ASM和#pragma ENDASM内嵌汇编语句;
    2、编译器在使用内嵌语句的文件右键菜单选择Option,选中Generate assembler SRC file 和 assemble SRC file;
    3、子程序调用时的参数传递上,一般是用R7,R5,R3,具体可以看编译生成的SRC文件;

  • 最初采用高级语言的两层循环嵌套,内层通过移位实现8个比特输出,外层依次处理每个比特,但是两层循环之间的时延较长,导致输出的波形不规则;
    最终打破结构化编程的框架,利用每个比特中850ns输出的长信号进行数据处理,实现了完美波形输出;

  • 在LED数量较多的情况下,发现会有闪烁,经常时间的查找,最后判断是信号输出期间产生硬件中断,导致输出的波形有跳变,导致不特定位置的LED出现闪烁;

s1

128分频下的输出波形

源代码:

void WS2812_SendArray(uchar xdata *pSource, uchar length) {
    EA    =    0;
#pragma ASM
    CLR      WS5050_DI
    MOV R1,#160
SA_DELAY25:
    DJNZ    R1, SA_DELAY25
    MOV R1,#160
SA_DELAY25_2:
    DJNZ    R1, SA_DELAY25_2

;    R5:length, R1:8bit, R4:临时存储A
    MOV        DPH, R6
    MOV        DPL, R7
    MOVX    A, @DPTR
    MOV      R1,#8        ;2
SA_BIT_PHASE0:
    SETB    WS5050_DI    ;4
    NOP                    ;1
    RLC      A            ;1
    JC        SA_BIT_1    ;3
    NOP                    ;1
    CLR        WS5050_DI    ;4
    CJNE    R1, #1, SA_BIT0_NOT8    ;4
;    当寄存器R1=1,说明是最后一位,则准备下一字节
    INC        DPTR        ;1
    MOVX    A, @DPTR    ;2
    MOV      R1,#9        ;2
    DJNZ    R5, SA_PHASE3    ;4
;    R5=0,结束
    SJMP    SA_END    ;3
SA_BIT0_NOT8:
;    R1>1,前七位
    XCH        A, R4        ;2
    MOVX    A, @DPTR    ;2
    XCH        A, R4        ;2
    NOP
    SJMP    SA_PHASE3    ;3
SA_BIT_1:
    CJNE    R1, #1, SA_BIT1_NOT8    ;4
;    当寄存器R1=1,说明是最后一位,则准备下一字节
    INC        DPTR        ;1
    MOVX    A, @DPTR    ;2
    MOV      R1,#9        ;2
    NOP
    DJNZ    R5, SA_BIT1_9TH    ;4
;    R5=0,结束
    SJMP    SA_END    ;3
SA_BIT1_NOT8:
    XCH        A, R4        ;2
    MOVX    A, @DPTR    ;2
    XCH        A, R4        ;2
    NOP
    NOP
    NOP
SA_BIT1_9TH:
    CLR        WS5050_DI
    NOP                    ;1
    NOP                    ;1
SA_PHASE3:
    DJNZ    R1, SA_BIT_PHASE0    ;4

SA_END:
    SETB    WS5050_DI
#pragma ENDASM
    EA    =    1;
    pSource = 0;
    length = 0;
}


关键字:STC15  单片机  七彩LED 引用地址:STC15单片机驱动WS2812B七彩LED(汇编混合编程)

上一篇:容易造成单片机内存溢出的几个陷阱
下一篇:单片机内存(ram)、flash、与数据存储和启动过程说明

推荐阅读最新更新时间:2024-11-10 17:32

剑杆织布机单片机C语言程序
#include reg52.h #include intrins.h sbit P3_7=P0^6; // 点动按钮 sbit P3_6=P0^5; // 单梭按钮 sbit P3_5=P0^4; // 启动按钮 sbit P3_4=P0^3; // 停止按钮 sbit P3_3=P2^6; // 经停信号输入 sbit P3_2=P2^7; // 纬停信号输入 sbit P3_1=P3^1; // 加 指示灯 sbit P3_0=P3^0; // 减 指示灯 //sbit P2_7=P2^7; // //sbit P2_6=P2^6; // sbit P2_5=P2^5; //
[单片机]
微芯PIC24F“GC”MCU满足更高的设计及成本需求
和数字电路的设计相比,模拟电路的设计往往会复杂的多。如何尽可能的降低产品设计的复杂性也是很多模拟器件提供商试图攻克的难关。Microchip Technology Inc.(美国微芯科技公司)公司通过其智能模拟集成技术帮助工程师调试噪音和通信,可以简化产品设计,实现数据的完整性。和分立式的产品设计相比,智能模拟技术优势明显:具有更快的数据路径,可以减少噪声;针对不同的应用,工程师不需要重新进行设计,通过软件就可以更改模拟参数、控制数据链的连接;简化电路板设计并缩小电路板尺寸,从而可以使用户实现更低的设计成本和更快速的上市的时间。 Microchip刚刚推出的全新单片机(MCU)系列PIC24FJ128GC010就是一款集成了一
[单片机]
基于嵌入式PC104工控机和C8051F047单片机实现机器人系统的设计
1.引言 高压输电线及杆塔附件长期暴露在野外,因受到持续的机械张力、电气闪络、材料老化的影响而产生断股、磨损、腐蚀等损伤,如不及时修复更换,原本微小的破损和缺陷就可能扩大,最终导致严重事故。因此,电力公司需要定期对线路设备进行巡检,及时发现早期损伤和缺陷并加以评估,根据评估结果安排必要的维护和修复,从而确保供电的安全可靠性。传统的人工巡检方法不仅工作量大而且条件艰苦,特别是对于山区和大江大河等的输电线路巡检存在很大困难,甚至一些巡检项目靠常规方法都难以完成。因此,采用机器人自动巡线成为保障高压输电线安全运行的一种必要手段。 高压输电线路巡线机器人属于特种机器人的研究范畴,主要完成高压供电线缆的无损探伤、悬垂绝缘子绝缘特性检测、
[单片机]
基于嵌入式PC104工控机和C8051F047<font color='red'>单片机</font>实现机器人系统的设计
在STM32单片机上运行除零运算的C程序代码时为何程序不崩溃?
众所周知,在 C 语言中,当一个数除以0的时候,会导致除法运算异常。程序也会因此崩溃。 为了避免程序崩溃,我们需要在代码中包含对 0 的判断。 但是呢,在 STM32 单片机上运行除零运算的C程序代码时,却不会出现程序崩溃的现象。这是怎么回事呢? 今天来简单聊一聊这个问题。 聊一聊 按照常规的认知,如果 C 语言程序代码中出现除以零的操作时,会进入异常处理,而导致程序出现异常。 有小伙伴遇到过这种场景,除零操作后续的代码可以正常执行。其单片机为STM32系列单片机。 我们查阅 Cortex-M3 指南,可以看到除以零操作会导致用法异常(Usage Fault)。 从中可以得知,进入Usage Fault 是有前提条件的,即
[单片机]
在STM32<font color='red'>单片机</font>上运行除零运算的C程序代码时为何程序不崩溃?
超声波测距单片机C程序
单片机源程序如下: #include reg52.h //STC89C52头文件 #define uchar unsigned char #define uint unsigned int unsigned int time=0; unsigned int timer=0; unsigned long S=0; //距离变量 bit flag =0; //超声波模块量程溢出标志( 5米时置1) sbit echo=P1^0; //超声波模块的发射端 sbit trig=P1^1; //超声波模块的接收端 sbit ds=P2^2; //DS18B2
[单片机]
超声波测距<font color='red'>单片机</font>C程序
赛普拉斯超低功耗PSoC® 6 MCU产品系列再添新成员
全球领先的嵌入式解决方案供应商赛普拉斯半导体公司(Cypress Semiconductor Corp.)(纳斯达克代码:CY)日前宣布,进一步扩充其物联网产品组合,为超低功耗的PSoC® 6 MCU产品系列再添新成员。全新的PSoC 6 MCU专为物联网设备而设计,能够满足其不断增长的边缘计算、连接和存储需求。全新的MCU采用1MB SRAM和2MB FLASH嵌入式存储器,支持计算密集型算法、连接栈和数据记录。 此外,赛普拉斯还推出两款面向PSoC 6系列的全新开发套件。开发人员能够利用业界功耗最低、最灵活、基于硬件安全的双核MCU,来延长电池续航时间,提供高效的运算和感知性能,并为用户的敏感数据提供保护。目前,PS
[物联网]
赛普拉斯超低功耗PSoC® 6 <font color='red'>MCU</font>产品系列再添新成员
51单片机实习-数码管动态显示4399(模块化编程)
#include reg52.h sbit wei0=P1^0; sbit wei1=P1^1; sbit wei2=P1^2; sbit wei3=P1^3; int zxm ={0x98,0x98,0xb0,0x99}; void delay(int i) { while(i--) { int j=0; for(;j 115;j++); } } void display() { int i; for( i=0;i 4;i++) { switch(i) { case 0: wei0=0,wei1=1,wei2=1,wei3=1;break; case
[单片机]
51<font color='red'>单片机</font>实习-数码管动态显示4399(模块化编程)
51单片机【二】LED闪烁及流水灯附带c语言位操作
void main(void) { while (1) { gLed1 = 0; // 点亮LED Delay(); // 延时一段时间 gLed1 = 1; // 熄灭LED Delay(); // 延时一段时间 } } void FlashLed1(void) { LED_PORT = 0x7f; // 0b01111111,左边数第1颗LED亮其他灭 Delay(); LED_PORT = 0xbf; // 0b10111111,左边数第2颗LED亮其他灭 Delay(); LED_PORT = 0xdf; // 0b11011111,左边数第3颗LED亮其他灭 Delay(
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved