找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

成功挑战 89C52驱动WS2812

查看数: 15616 | 评论数: 26 | 收藏 26
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2019-10-6 19:10

正文摘要:

本帖最后由 人人学会单片机 于 2019-10-6 19:11 编辑 https://v.youku.com/v_show/id_XNDM1MDczMDc0OA==.html WS2812是一个通信速度比较快的芯片,而89单片机是比较慢的单片机。 89单片机使用32M晶振、12T模 ...

回复

ID:579397 发表于 2024-12-4 18:28


  1. /**********接口说明**********/
  2. sbit led_in=P2^0;

  3. /**********全局变量**********/
  4. #define led_max 256
  5. xdata unsigned char Buff[led_max][3];

  6. /******************************
  7.                 发送比特到WS2812
  8. ******************************/
  9. void WS2812_Send(bit DI)
  10.         {
  11.                 if(DI)                //发送1码
  12.                         {
  13.                                 led_in=1;NOP25();                //580ns~1000ns
  14.                                 led_in=0;NOP12();                //220ns~420ns
  15.                                 }
  16.                         else                //发送0码
  17.                                 {
  18.                                         led_in=1;NOP12();                //220ns~380ns
  19.                                         led_in=0;NOP25();                //580ns~1000ns
  20.                                         }
  21.         }
  22.         
  23. /******************************
  24.                 发送字节到WS2812
  25. ******************************/
  26. void WS2812_SendByte(unsigned char dat)
  27.         {
  28.                 unsigned char i;
  29.     for (i=0;i<8;i++)
  30.                 {
  31.                         dat<<=1;                //左移一位
  32.                         WS2812_Send(CY);                //发送最高位
  33.                         }
  34.         }
  35.         
  36. /******************************
  37.                 发送RGB颜色到WS2812
  38. ******************************/
  39. void WS2812_SendColor(unsigned char red,unsigned char green,unsigned char blue)
  40.         {
  41.     WS2812_SendByte(green);
  42.     WS2812_SendByte(red);
  43.     WS2812_SendByte(blue);
  44.         }
  45.         
  46. /******************************
  47.                 刷新LED显示
  48. ******************************/
  49. void WS2812_Display(unsigned char red,unsigned char green,unsigned char blue)
  50.         {
  51.                 unsigned int i;
  52.     for (i=0;i<led_max;i++)
  53.                 {
  54.                         WS2812_SendColor(red,green,blue);
  55.                         }
  56.                 led_in=0;
  57.                 Delay(1);
  58.         }
  59.         
  60. /******************************
  61.                 清空缓存数组
  62. ******************************/
  63. void WS2812_BuffClear()
  64.         {
  65.                 unsigned int i;
  66.                 for(i=0;i<led_max;i++)
  67.                 {
  68.                         Buff[i][0]=0;
  69.                         Buff[i][1]=0;
  70.                         Buff[i][2]=0;        
  71.                 }
  72.         }
  73.         
  74. /******************************
  75.                 指定某点,某颜色写入缓存
  76. ******************************/
  77. void WS2812_D0T(unsigned char num,unsigned char red,unsigned char green,unsigned char blue)
  78.         {
  79.                 Buff[num][0]=red;
  80.                 Buff[num][1]=green;
  81.                 Buff[num][2]=blue;
  82.         }
复制代码

1.png (175.13 KB, 下载次数: 0)

1.png
ID:390416 发表于 2024-12-4 14:11
发表于 2024-6-11 09:42
static xdata u8 count=0;   为什么一定要用XDATA?不用会怎么样?

如果其他的存储空间够用 那就不用xdata空间  
ID:85743 发表于 2024-6-11 09:42
static xdata u8 count=0;   为什么一定要用XDATA?不用会怎么样?
ID:1120202 发表于 2024-6-7 16:33
点赞!正要学习这个内容!!
ID:433219 发表于 2023-12-20 15:47
只要 注意50us 为时间处理间隙处理,,,
ID:1105362 发表于 2023-12-20 14:11
牛啊,小马拉大车
ID:317998 发表于 2023-12-16 22:49
这个程序最多只能点亮255个灯珠,请问:想点更多灯珠要改哪一项?
ID:256110 发表于 2023-10-18 10:35
WS2812灯带 控制
ID:1057863 发表于 2023-1-13 09:43
这个我之前弄就没弄好,感谢UP主
ID:390416 发表于 2023-1-8 10:32
hgig 发表于 2022-11-8 14:44
大神,求电路连接图

WS2812灯带 电路超级简单
ID:390416 发表于 2023-1-8 10:32
1111513 发表于 2022-3-24 18:40
在哪里修改灯珠数量

WS2812_Write_Data(WS2812_Write_Buffer+1,8);  这个8 就是8颗灯
ID:1055167 发表于 2022-12-2 10:37
12分频是375ns吧,不是整数啊
ID:1050867 发表于 2022-11-8 14:44
大神,求电路连接图
ID:27642 发表于 2022-9-12 22:14
感谢,刚好有这灯带
ID:212904 发表于 2022-7-19 13:37
试试看好用不
ID:390416 发表于 2022-4-19 12:39
1111513 发表于 2022-3-24 18:40
在哪里修改灯珠数量

WS2812_Write_Data(WS2812_Write_Buffer+1,8);  括号里面数字8 表示8个灯
ID:47286 发表于 2022-3-25 00:55
牛人 膜拜下
ID:977831 发表于 2022-3-24 18:40
在哪里修改灯珠数量
ID:615170 发表于 2021-4-12 10:16
精彩,刚好遇到了不知道如何调PWM的问题,学习下!
ID:390416 发表于 2021-2-23 16:56
xxd0708 发表于 2021-2-21 14:20
试试左移位和CY位直送IO口,应该运行周期会小一点,这样晶振频率可能会小一点。我用的函数可以参考一下:
...

嗯 CY 主要是汇编的指令 初学者容易看蒙圈
ID:885138 发表于 2021-2-21 14:20
人人学会单片机 发表于 2021-1-7 18:33
是的,分享这个代码 主要是挑战一下89系列的性能。小马拉着火车皮跑。测试的是89能不能拉得动

试试左移位和CY位直送IO口,应该运行周期会小一点,这样晶振频率可能会小一点。我用的函数可以参考一下:
void ws2812_write_byte( u8 dat)
{        
        u8 i = 8;
        dat <<= 1;         //最高位进入CY
        while(i)
        {
                 //高电平时间小于0.45uS为逻辑0,大于时为逻辑1
                WS2812_IO = 1;
                //如果主频较高可在此处适当增加_nop_();
                WS2812_IO = CY;
                //如果主频较高可在此处适当增加_nop_();
                _nop_();
        WS2812_IO = 0;
                dat <<= 1;         //最高位进入CY
                i--;                        
        }
}
ID:885138 发表于 2021-2-21 14:09
啤酒瓶子老大 发表于 2021-1-7 18:13
大师,如果用STC8H1K这种1T的单片机,是不是速度就够快了?

我用了另一种1T的单片机,4MHZ就可以了。参看http://www.51hei.com/bbs/dpj-202768-1.html

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

ID:390416 发表于 2021-1-7 18:33
啤酒瓶子老大 发表于 2021-1-7 18:13
大师,如果用STC8H1K这种1T的单片机,是不是速度就够快了?

是的,分享这个代码 主要是挑战一下89系列的性能。小马拉着火车皮跑。测试的是89能不能拉得动
ID:230742 发表于 2021-1-7 18:13
大师,如果用STC8H1K这种1T的单片机,是不是速度就够快了?
ID:724172 发表于 2020-8-20 15:29
太厉害了,一直都在找这个教程来做个模型加灯
ID:334047 发表于 2020-8-12 22:53
点赞!正要学习这个内容!!

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

Powered by 单片机教程网

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