标题: 成功挑战 89C52驱动WS2812 [打印本页]

作者: 人人学会单片机    时间: 2019-10-6 19:10
标题: 成功挑战 89C52驱动WS2812
本帖最后由 人人学会单片机 于 2019-10-6 19:11 编辑

https://v.youku.com/v_show/id_XNDM1MDczMDc0OA==.html

WS2812是一个通信速度比较快的芯片,而89单片机是比较慢的单片机。
89单片机使用32M晶振、12T模式,用IO口直接驱动WS2812灯珠。
以下视频是驱动WS2812的效果
部分源代码:
#ifndef WS2812B_Drive                //如果没有找到这个标签
#define WS2812B_Drive                //那么就打一个这个标签
sbit WS2812_GPIO=P2^0;
u8 data WS2812_Write_Buffer[25];
void WS2812_Write_Data(u8 *Point,u8 len)
{
        u8 data i,j,k;
        u8 bdata Value;
        for(i=0;i<len;i++)
        {
                for(j=0;j<3;j++)
                {
                        switch(j)
                        {
                                case 0:Value=*(Point+1);break;
                                case 1:Value=*(Point);break;
                                case 2:Value=*(Point+2);break;                        
                        }
                        k=0x80;
                        while(k)
                        {
                                if(Value&k)
                                {
                                        WS2812_GPIO=1;
                                }
                                WS2812_GPIO=1;
                                WS2812_GPIO=0;
                                k>>=1;
                        }
                }
                Point+=3;
        }
}
void WS2812_Display_Ser()
{
        static xdata u8 count=0;
        if(count<100)
        {
                WS2812_GPIO=0;
                count++;
        }
        else
        {
                EA=0;
                WS2812_Write_Data(WS2812_Write_Buffer+1,8);
                EA=1;
                count=0;
        }
}
#endif

51hei截图20191006190645.jpg (26.49 KB, 下载次数: 200)

51hei截图20191006190645.jpg

12 WS2812B彩灯.zip

38.57 KB, 下载次数: 428, 下载积分: 黑币 -5


作者: ddjjcc    时间: 2020-8-12 22:53
点赞!正要学习这个内容!!
作者: dilongking    时间: 2020-8-20 15:29
太厉害了,一直都在找这个教程来做个模型加灯
作者: 啤酒瓶子老大    时间: 2021-1-7 18:13
大师,如果用STC8H1K这种1T的单片机,是不是速度就够快了?
作者: 人人学会单片机    时间: 2021-1-7 18:33
啤酒瓶子老大 发表于 2021-1-7 18:13
大师,如果用STC8H1K这种1T的单片机,是不是速度就够快了?

是的,分享这个代码 主要是挑战一下89系列的性能。小马拉着火车皮跑。测试的是89能不能拉得动
作者: xxd0708    时间: 2021-2-21 14:09
啤酒瓶子老大 发表于 2021-1-7 18:13
大师,如果用STC8H1K这种1T的单片机,是不是速度就够快了?

我用了另一种1T的单片机,4MHZ就可以了。参看http://www.51hei.com/bbs/dpj-202768-1.html
作者: xxd0708    时间: 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--;                        
        }
}
作者: 人人学会单片机    时间: 2021-2-23 16:56
xxd0708 发表于 2021-2-21 14:20
试试左移位和CY位直送IO口,应该运行周期会小一点,这样晶振频率可能会小一点。我用的函数可以参考一下:
...

嗯 CY 主要是汇编的指令 初学者容易看蒙圈
作者: 爱DIY的小白    时间: 2021-4-12 10:16
精彩,刚好遇到了不知道如何调PWM的问题,学习下!
作者: 1111513    时间: 2022-3-24 18:40
在哪里修改灯珠数量
作者: dzbj    时间: 2022-3-25 00:55
牛人 膜拜下
作者: 人人学会单片机    时间: 2022-4-19 12:39
1111513 发表于 2022-3-24 18:40
在哪里修改灯珠数量

WS2812_Write_Data(WS2812_Write_Buffer+1,8);  括号里面数字8 表示8个灯
作者: 66249259    时间: 2022-7-19 13:37
试试看好用不
作者: d5642698    时间: 2022-9-12 22:14
感谢,刚好有这灯带
作者: hgig    时间: 2022-11-8 14:44
大神,求电路连接图
作者: likeagermany    时间: 2022-12-2 10:37
12分频是375ns吧,不是整数啊
作者: 人人学会单片机    时间: 2023-1-8 10:32
1111513 发表于 2022-3-24 18:40
在哪里修改灯珠数量

WS2812_Write_Data(WS2812_Write_Buffer+1,8);  这个8 就是8颗灯
作者: 人人学会单片机    时间: 2023-1-8 10:32
hgig 发表于 2022-11-8 14:44
大神,求电路连接图

WS2812灯带 电路超级简单
作者: 无名!!    时间: 2023-1-13 09:43
这个我之前弄就没弄好,感谢UP主
作者: zslllll    时间: 2023-10-18 10:35
WS2812灯带 控制

作者: 熊乔中    时间: 2023-12-16 22:49
这个程序最多只能点亮255个灯珠,请问:想点更多灯珠要改哪一项?
作者: JIYE03    时间: 2023-12-20 14:11
牛啊,小马拉大车
作者: wkman    时间: 2023-12-20 15:47
只要 注意50us 为时间处理间隙处理,,,
作者: maiambibo    时间: 2024-6-7 16:33
点赞!正要学习这个内容!!
作者: vectorxu    时间: 2024-6-11 09:42
static xdata u8 count=0;   为什么一定要用XDATA?不用会怎么样?
作者: 人人学会单片机    时间: 2024-12-4 14:11
发表于 2024-6-11 09:42
static xdata u8 count=0;   为什么一定要用XDATA?不用会怎么样?

如果其他的存储空间够用 那就不用xdata空间  
作者: 405616736    时间: 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





欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1