欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 51單片機驅動WS2811彩燈源程序和實物圖 [打印本頁]

作者: peterkit    時間: 2017-3-20 19:49
標題: 51單片機驅動WS2811彩燈源程序和實物圖
WS2811是一款可以級聯的RGB三色LED燈。只需要一根數據線就可以控制多顆LED。現在發上來整理的庫函數,可以直接調用顯示函數。


WS2811.h
  1. #ifndef __WS2811_H
  2. #define __WS2811_H         
  3. #include "sys.h"


  4. #define White       0xFFFFFF  // 白色
  5. #define Black       0x000000  // 黑色
  6. #define Red         0x00ff00  // 紅色
  7. #define Green       0xff0000  // 綠色
  8. #define Blue        0x0000ff  // 藍色


  9. #define nWs 16                // 有多少顆WS2811級聯

  10. extern unsigned long WsDat[];

  11. extern void WS_Init(void);
  12. extern void WS_SetAll(void);
  13. extern u32 ColorToColor(unsigned long color0, unsigned long color1);

  14.                                                      
  15. #endif

復制代碼
  1. /****************************************************************************************
  2. * WS2811 彩燈驅動函數
  3. *
  4. * 調用方法:
  5. *        修改宏定義: #define nWs 1        // 有多少顆WS2811級聯
  6. *        WS_Init();        // IO初始化
  7. *        WsDat[0] = 0x808080;//顯存賦值
  8. *        WS_SetAll();  // 發送數據
  9. *        ColorToColor(unsigned long color0, unsigned long color1);// 顏色漸變算法
  10. *
  11. * 作者:星希望(已校驗)
  12. * 日期:2015年6月24日
  13. ****************************************************************************************/
  14. #include "sys.h"
  15. #include <stm32f10x.h>
  16. #include "WS2811.h"
  17. #include "delay.h"
  18.        
  19. /* 顯存 */
  20. unsigned long WsDat[nWs];


  21. /**************************************************************************************
  22. * IO初始化(移植時請修改)
  23. **************************************************************************************/
  24. void WS_Init()
  25. {
  26.         GPIO_InitTypeDef  GPIO_InitStructure;       
  27.        
  28.         //端口時鐘,使能
  29.         RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE );         

  30.         // 端口配置
  31.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;                                // PIN
  32.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                 // 推挽輸出
  33.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                // IO口速度為50MHz
  34.         GPIO_Init(GPIOA, &GPIO_InitStructure);                                        // 根據設定參數初始化
  35. }

  36. /**************************
  37. * 內部延時
  38. ***************************/
  39. void delay2us()
  40. {
  41.         unsigned char i;
  42.         for(i=0; i<12; i++);
  43. }
  44. void delay05us()
  45. {
  46.         unsigned char i;
  47.         for(i=0; i<1; i++);
  48. }

  49. /***************************
  50. * 發送一比特
  51. ****************************/
  52. void TX0()          { PAout(0) = 1; delay05us(); PAout(0) = 0; delay2us(); } // 發送0
  53. void TX1()          { PAout(0) = 1; delay2us();  PAout(0) = 0; delay05us(); } // 發送1
  54. void WS_Reset() { PAout(0) = 0; delay_us(60);  PAout(0) = 1; PAout(0) = 0; }

  55. /**************************************************************************************
  56. * 發送一字節
  57. **************************************************************************************/
  58. void WS_Set1(unsigned long dat)
  59. {
  60.         unsigned char i;
  61.        
  62.         for(i=0; i<24; i++)
  63.         {
  64.                 if(0x800000 == (dat & 0x800000) )        TX1();
  65.                 else                                                                TX0();
  66.                 dat<<=1;                                                        //左移一位
  67.         }
  68. }

  69. /**************************************************************************************
  70. * 發送所有字節
  71. **************************************************************************************/
  72. void WS_SetAll()
  73. {
  74.         unsigned char j;
  75.        
  76.         for(j=0; j<nWs; j++)
  77.         {
  78.                 WS_Set1(WsDat[0]);  // j / 0
  79.         }
  80.         WS_Reset();
  81. }









  82. /********************************************
  83. * 求絕對值
  84. ********************************************/
  85. unsigned char abs0(int num)
  86. {
  87.         if(num>0) return num;
  88.        
  89.         num = -num;
  90.         return (unsigned char) num;
  91. }

  92. /***********************************************************************************
  93. * 顏色漸變算法
  94. * 誤差 <= 2
  95. ************************************************************************************/
  96. u32 ColorToColor(unsigned long color0, unsigned long color1)
  97. {
  98.         unsigned char Red0, Green0, Blue0;  // 起始三原色
  99.         unsigned char Red1, Green1, Blue1;  // 結果三原色
  100.         int                          RedMinus, GreenMinus, BlueMinus;        // 顏色差(color1 - color0)
  101.         unsigned char NStep;                                                         // 需要幾步
  102.         float                  RedStep, GreenStep, BlueStep;                // 各色步進值
  103.         unsigned long color;                                                        // 結果色
  104.         unsigned char i;
  105.        
  106.         // 綠 紅 藍 三原色分解
  107.         Red0   = color0>>8;
  108.         Green0 = color0>>16;
  109.         Blue0  = color0;
  110.        
  111.         Red1   = color1>>8;
  112.         Green1 = color1>>16;
  113.         Blue1  = color1;
  114.        
  115.         // 計算需要多少步(取差值的最大值)
  116.         RedMinus   = Red1 - Red0;
  117.         GreenMinus = Green1 - Green0;
  118.         BlueMinus  = Blue1 - Blue0;
  119.        
  120.         NStep = ( abs0(RedMinus) > abs0(GreenMinus) ) ? abs0(RedMinus):abs0(GreenMinus);
  121.         NStep = ( NStep > abs0(BlueMinus) ) ? NStep:abs0(BlueMinus);
  122.        
  123.         // 計算出各色步進值
  124.         RedStep   = (float)RedMinus   / NStep;
  125.         GreenStep = (float)GreenMinus / NStep;
  126.         BlueStep  = (float)BlueMinus  / NStep;
  127.        
  128.         // 漸變開始
  129.         for(i=0; i<NStep; i++)
  130.         {
  131.                 Red1   = Red0   + (int)(RedStep   * i);
  132.                 Green1 = Green0 + (int)(GreenStep * i);
  133.                 Blue1  = Blue0  + (int)(BlueStep  * i);
  134.                
  135.                 color  = Green1<<16 | Red1<<8 | Blue1;         // 合成  綠紅藍
  136.                 WsDat[0] = color;
  137.                 WS_SetAll();                                                        // 輸出
  138.                 delay_ms(1);                                                // 漸變速度
  139.         }
  140.         // 漸變結束
  141.        
  142.         return color;
  143. }
復制代碼



作者: henaichener    時間: 2017-5-9 18:31
好東西  謝謝
作者: nizhneg    時間: 2017-7-29 11:36
不錯,很好,借鑒了。
作者: helloworld1123    時間: 2018-1-16 14:38
32的源碼,51的標題,,,樓主注意點嘛。。。
作者: liuxianglong    時間: 2018-3-27 18:09
謝謝樓主分析 謝謝
作者: fysisi    時間: 2018-3-27 18:50
謝樓主分析 謝謝
作者: liuxianglong    時間: 2018-3-28 08:33
謝謝樓主分享
作者: wulingqing    時間: 2018-3-28 09:28
學習,謝謝樓主分享
作者: 去問驅蚊器    時間: 2018-4-16 15:13
你可真厲害
作者: 去問驅蚊器    時間: 2018-4-16 15:13
我想下載
作者: baishifanzon    時間: 2018-4-18 13:22
正在需要,感謝樓主無私的分享!
作者: auleaf    時間: 2018-5-25 17:32
我要借鑒一下
作者: lqlq7878    時間: 2018-6-19 11:40
不完整啊,延時函數沒有,很多頭文件也沒有
作者: luhuimin    時間: 2018-6-28 19:30
不知道用STM8S003做驅動,能不能實現,內部晶振只有16M
作者: luhuimin    時間: 2018-6-28 19:31
用在STM8S003上面不行,頻率16M達不到
作者: zx8633    時間: 2018-6-28 22:02
不錯,很好,借鑒了。
作者: dhutcb    時間: 2018-8-1 14:54
沒有delay的頭文件啊?
作者: luoqingfeng    時間: 2018-8-6 15:32
頂一個
作者: 165864    時間: 2018-10-18 16:56
很棒鴨
作者: bulezdf    時間: 2019-2-8 19:45
感謝分享,用89C51單片機可以嗎?
作者: zbr3550    時間: 2019-2-26 10:59
多謝分享,支持一下,這個燈看起來不錯
作者: 天方秋色    時間: 2019-3-7 09:39
贊一個@!
作者: 372787907    時間: 2019-3-12 10:35
怎么都是這么久遠的。。。
作者: Gan12138    時間: 2019-3-19 17:19
為什么網上代碼都一個樣

作者: albertwong    時間: 2020-3-14 15:55
好東西,感謝分享
作者: 85434006    時間: 2020-6-24 08:45
不錯,




歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1