找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 36|回复: 1
打印 上一主题 下一主题
收起左侧

用STC32G144K246驱动WS2812(PWM方式)

[复制链接]
跳转到指定楼层
楼主
ID:71233 发表于 2026-7-17 11:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单片机在频率较高的情况,完全可以使用软件延时的方式来驱动WS2812,但网上一般都不采用这种方式。
本人在参考STC官方例程和查阅手册的基础上,终于实现了使用PWM模式来驱动WS2812,效果如下:
https://www.bilibili.com/video/BV1b6KE6JEsx/
下面是PWM初始化函数:
  1. void PWMA5_Init(void)
  2. {
  3.         P4M1 &= ~0x40;P4M0 |= 0x40;//P46
  4.         PWMA_PSCRH = 0;PWMA_PSCRL = 0;//分频

  5.         PWMA_CCMR5 = 0x60;
  6.         PWMA_CCER3 = 0x03;

  7.         PWMA_ARRH = 0x00;
  8.         PWMA_ARRL = 30;
  9.         PWMA_CCR5H = 0x00;
  10.         PWMA_CCR5L = 0x55;

  11.         PWMA_ENO2 |=0x01;
  12.         PWMA_PS2 = 0x00; //选择P4.6

  13.         PWMA_BKR = 0x80;
  14.         PWMA_CR1 |= 0x09;
  15. }
复制代码

发送八位数据函数:
  1. void SendData(u8 dat)
  2. {
  3.         u8 i;
  4.         for(i=0;i<8;i++)
  5.         {
  6.                 if(dat & 0x80)
  7.                         PWMA_CCR5L   = 8;               
  8.                 else
  9.                         PWMA_CCR5L   = 22;       
  10.                 PWMA_CR1    |= 0x01;  
  11.                 dat = dat<<1;
  12.                 while(PWMA_CR1 &0x01);
  13.         }
  14. }
复制代码

发送24位数据函数:
  1. void WS2812_rand_color(u8 R,u8 G,u8 B)
  2. {
  3.         SendData(G);
  4.         SendData(R);
  5.         SendData(B);
  6. }
复制代码

延时函数:
  1. void Delay1ms(void)        //@48.000MHz

  2. {

  3.         unsigned long edata i;

  4.         _nop_();

  5.         _nop_();

  6.         _nop_();

  7.         i = 11998UL;

  8.         while (i) i--;

  9. }

  10. void delay_ms(unsigned int ms)   //@48.000MHz

  11. {

  12.         while (ms--) Delay1ms();                    

  13. }
复制代码

主函数:
  1. void main(void)
  2. {

  3.         EAXFR = 1; //扩展寄存器(XFR)访问使能
  4.         CKCON = 0; //提高访问XRAM速度
  5.         PWMA5_Init(); // 初始化 PWMA5
  6.         while(1)
  7.         {
  8.                 WS2812_rand_color(1,0,0);
  9.                 delay_ms(500);
  10.                 WS2812_rand_color(0,1,0);
  11.                 delay_ms(500);
  12.                 WS2812_rand_color(0,0,1);
  13.                 delay_ms(500);
  14.         }
  15. }
复制代码

欢迎各位大神指教,谢谢!
2026.7.17


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:277550 发表于 2026-7-17 17:01 | 只看该作者
扩展到几百颗


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表