找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1797|回复: 3
收起左侧

请问一下大神,ws2812单片机代码这里是什么意思?

[复制链接]
ID:586048 发表于 2019-9-2 12:19 | 显示全部楼层 |阅读模式

ws2812的发送1码时序

ws2812的发送1码时序


单片机源程序如下:
  1. 这里是ws2812的时序代码
  2. #include "IAP15F105W.h"
  3. #include "intrins.h"

  4. typedef unsigned char uchar;
  5. typedef unsigned int  uint;

  6. #define  Number 20

  7. sbit DAI=P3^2;

  8. void Delay (uint x)  // 1ms Delay
  9. {
  10.     uint t;
  11.     t = 0;
  12.     while (x--)
  13.     {
  14.       WDT_CONTR|=0x10;         
  15.       for (t = 0; t < 175; t++);
  16.     }
  17. }

  18. void send_2811_24bits(uchar dat1,uchar dat2,uchar dat3)   // 发24位数据,按G,B,R发送
  19. {
  20.         uchar a,b;
  21.         for(a=0;a<8;a++)         //dat1 G
  22.         {
  23.                 if(dat1&0x80)    //从高位端开始发送
  24.                 {
  25.                         DAI=1;                                // CODE "1",发送”1“码
  26.                         for(b=0;b<2;b++)
  27.                         {
  28.                                 _nop_(); _nop_();
  29.                         }
  30.                         DAI=0;        
  31.                 }
  32.                 else
  33.                 {               
  34.                         DAI=1;                                //CODE "0"
  35.                         for(b=0;b<1;b++);//这里是什么意思下面是不是省略了什么
  36.                         DAI=0;         
  37.                         for(b=0;b<1;b++);
  38.                 }
  39.                 dat1=dat1<<1;               
  40.         }
  41.         for(a=0;a<8;a++)                       //dat2 B
  42.         {        
  43.                 if(dat2&0x80)
  44.                 {                  
  45.                         DAI=1;                                              // CODE "1"
  46.                         for(b=0;b<2;b++)
  47.                         {
  48.                         _nop_(); _nop_();
  49.                         }
  50.                         DAI=0;                        
  51.                 }
  52.                 else
  53.                 {               
  54.                         DAI=1;                                //CODE "0"
  55.                         for(b=0;b<1;b++);
  56.                         DAI=0;         
  57.                   for(b=0;b<1;b++);
  58.                 }
  59.                 dat2=dat2<<1;        
  60.         }                                                
  61.         for(a=0;a<8;a++)                      //dat3 R
  62.         {        
  63.                 if(dat3&0x80)
  64.                 {               
  65.                         DAI=1;                                              // CODE "1"
  66.                         for(b=0;b<2;b++)
  67.                         {
  68.                                 _nop_();  _nop_();
  69.                         }
  70.                         DAI=0;
  71.                 }
  72.                 else
  73.                 {        
  74.                         DAI=1;                                //CODE "0"
  75.                         for(b=0;b<1;b++);
  76.                         DAI=0;         
  77.                         for(b=0;b<1;b++);
  78.                 }
  79.                 dat3=dat3<<1;               
  80.         }
  81. }

  82. void rst()
  83. {
  84.         uchar s;
  85.         DAI=0;
  86.         WDT_CONTR|=0x10;     
  87.         for(s=0;s<50;s++);  
  88. }
  89. void Flowing()
  90. {
  91.         uint i;
  92.         uint Stack;
  93.         Stack=0;
  94.         while(1)
  95.         {
  96.                 for(i=0;i<Stack;i++)
  97.                 {
  98.                         send_2811_24bits(255,255,255);
  99.                 }
  100.                 for(i=0;i<Number-Stack;i++)
  101.                 {
  102.                         send_2811_24bits(0,0,0);
  103.                 }
  104.                 rst();
  105.                 Delay(1000);
  106.                 Stack++;
  107.                 if(Stack>Number)
  108.                 {
  109.                         break;
  110.                 }
  111.         }
  112. }
  113. void main()
  114. {
  115.         P3M0=0x04;                 
  116.         P3M1=0x00;
  117.         P32=0;
  118.         WDT_CONTR=0x3F;         
  119.         while(1)
  120.         {
  121.                 Flowing();
  122.         }
  123. }
复制代码


回复

使用道具 举报

ID:586048 发表于 2019-9-2 12:20 | 显示全部楼层
图片上的
  1. DAI=1;                                //CODE "0"
  2.                         for(b=0;b<1;b++);
  3.                         DAI=0;         
  4.                         for(b=0;b<1;b++);
复制代码

是不是少了什么东西?
回复

使用道具 举报

ID:586048 发表于 2019-9-2 12:29 | 显示全部楼层
这是ws2812的参数,按图上来说应该发送时间最少的也要0.35微秒,可是程序这里是没有高于0.35微秒的,这是为什么,求大神解答内部晶振一般都设置大于27MHz
  1. void send_2811_24bits(uchar dat1,uchar dat2,uchar dat3)   // 发24位数据,按G,B,R发送
  2. {
  3.         uchar a,b;
  4.         for(a=0;a<8;a++)         //dat1 G
  5.         {
  6.                 if(dat1&0x80)    //从高位端开始发送
  7.                 {
  8.                         DAI=1;                                // CODE "1",发送”1“码
  9.                         for(b=0;b<2;b++)
  10.                         {
  11.                                 _nop_(); _nop_();
  12.                         }
  13.                         DAI=0;        
  14.                 }
  15.                 else
  16.                 {               
  17.                         DAI=1;                                //CODE "0"
  18.                         for(b=0;b<1;b++);
  19.                         DAI=0;         
  20.                         for(b=0;b<1;b++);
  21.                 }
  22.                 dat1=dat1<<1;               
  23.         }
  24.         for(a=0;a<8;a++)                       //dat2 B
  25.         {        
  26.                 if(dat2&0x80)
  27.                 {                  
  28.                         DAI=1;                                              // CODE "1"
  29.                         for(b=0;b<2;b++)
  30.                         {
  31.                         _nop_(); _nop_();
  32.                         }
  33.                         DAI=0;                        
  34.                 }
  35.                 else
  36.                 {               
  37.                         DAI=1;                                //CODE "0"
  38.                         for(b=0;b<1;b++);
  39.                         DAI=0;         
  40.                   for(b=0;b<1;b++);
  41.                 }
  42.                 dat2=dat2<<1;        
  43.         }                                                
  44.         for(a=0;a<8;a++)                      //dat3 R
  45.         {        
  46.                 if(dat3&0x80)
  47.                 {               
  48.                         DAI=1;                                              // CODE "1"
  49.                         for(b=0;b<2;b++)
  50.                         {
  51.                                 _nop_();  _nop_();
  52.                         }
  53.                         DAI=0;
  54.                 }
  55.                 else
  56.                 {        
  57.                         DAI=1;                                //CODE "0"
  58.                         for(b=0;b<1;b++);
  59.                         DAI=0;         
  60.                         for(b=0;b<1;b++);
  61.                 }
  62.                 dat3=dat3<<1;               
  63.         }
  64. }
复制代码


51hei截图_20190902122349.png
51hei截图_20190902122407.png
回复

使用道具 举报

ID:586048 发表于 2019-9-2 18:23 | 显示全部楼层
hzw854025403 发表于 2019-9-2 12:20
图片上的
是不是少了什么东西?

这里我懂了,后面的“;”是空语句,是延时作用吧
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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