欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
51單片機驅動WS2811彩燈源程序和實物圖
[打印本頁]
作者:
peterkit
時間:
2017-3-20 19:49
標題:
51單片機驅動WS2811彩燈源程序和實物圖
WS2811是一款可以級聯的RGB三色LED燈。只需要一根數據線就可以控制多顆LED。現在發上來整理的庫函數,可以直接調用顯示函數。
134437qkyykzc7echkxee1.jpg.thumb.jpg
(28.97 KB, 下載次數: 124)
下載附件
2017-3-20 20:25 上傳
WS2811.h
#ifndef __WS2811_H
#define __WS2811_H
#include "sys.h"
#define White 0xFFFFFF // 白色
#define Black 0x000000 // 黑色
#define Red 0x00ff00 // 紅色
#define Green 0xff0000 // 綠色
#define Blue 0x0000ff // 藍色
#define nWs 16 // 有多少顆WS2811級聯
extern unsigned long WsDat[];
extern void WS_Init(void);
extern void WS_SetAll(void);
extern u32 ColorToColor(unsigned long color0, unsigned long color1);
#endif
復制代碼
/****************************************************************************************
* WS2811 彩燈驅動函數
*
* 調用方法:
* 修改宏定義: #define nWs 1 // 有多少顆WS2811級聯
* WS_Init(); // IO初始化
* WsDat[0] = 0x808080;//顯存賦值
* WS_SetAll(); // 發送數據
* ColorToColor(unsigned long color0, unsigned long color1);// 顏色漸變算法
*
* 作者:星希望(已校驗)
* 日期:2015年6月24日
****************************************************************************************/
#include "sys.h"
#include <stm32f10x.h>
#include "WS2811.h"
#include "delay.h"
/* 顯存 */
unsigned long WsDat[nWs];
/**************************************************************************************
* IO初始化(移植時請修改)
**************************************************************************************/
void WS_Init()
{
GPIO_InitTypeDef GPIO_InitStructure;
//端口時鐘,使能
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE );
// 端口配置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; // PIN
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // IO口速度為50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); // 根據設定參數初始化
}
/**************************
* 內部延時
***************************/
void delay2us()
{
unsigned char i;
for(i=0; i<12; i++);
}
void delay05us()
{
unsigned char i;
for(i=0; i<1; i++);
}
/***************************
* 發送一比特
****************************/
void TX0() { PAout(0) = 1; delay05us(); PAout(0) = 0; delay2us(); } // 發送0
void TX1() { PAout(0) = 1; delay2us(); PAout(0) = 0; delay05us(); } // 發送1
void WS_Reset() { PAout(0) = 0; delay_us(60); PAout(0) = 1; PAout(0) = 0; }
/**************************************************************************************
* 發送一字節
**************************************************************************************/
void WS_Set1(unsigned long dat)
{
unsigned char i;
for(i=0; i<24; i++)
{
if(0x800000 == (dat & 0x800000) ) TX1();
else TX0();
dat<<=1; //左移一位
}
}
/**************************************************************************************
* 發送所有字節
**************************************************************************************/
void WS_SetAll()
{
unsigned char j;
for(j=0; j<nWs; j++)
{
WS_Set1(WsDat[0]); // j / 0
}
WS_Reset();
}
/********************************************
* 求絕對值
********************************************/
unsigned char abs0(int num)
{
if(num>0) return num;
num = -num;
return (unsigned char) num;
}
/***********************************************************************************
* 顏色漸變算法
* 誤差 <= 2
************************************************************************************/
u32 ColorToColor(unsigned long color0, unsigned long color1)
{
unsigned char Red0, Green0, Blue0; // 起始三原色
unsigned char Red1, Green1, Blue1; // 結果三原色
int RedMinus, GreenMinus, BlueMinus; // 顏色差(color1 - color0)
unsigned char NStep; // 需要幾步
float RedStep, GreenStep, BlueStep; // 各色步進值
unsigned long color; // 結果色
unsigned char i;
// 綠 紅 藍 三原色分解
Red0 = color0>>8;
Green0 = color0>>16;
Blue0 = color0;
Red1 = color1>>8;
Green1 = color1>>16;
Blue1 = color1;
// 計算需要多少步(取差值的最大值)
RedMinus = Red1 - Red0;
GreenMinus = Green1 - Green0;
BlueMinus = Blue1 - Blue0;
NStep = ( abs0(RedMinus) > abs0(GreenMinus) ) ? abs0(RedMinus):abs0(GreenMinus);
NStep = ( NStep > abs0(BlueMinus) ) ? NStep:abs0(BlueMinus);
// 計算出各色步進值
RedStep = (float)RedMinus / NStep;
GreenStep = (float)GreenMinus / NStep;
BlueStep = (float)BlueMinus / NStep;
// 漸變開始
for(i=0; i<NStep; i++)
{
Red1 = Red0 + (int)(RedStep * i);
Green1 = Green0 + (int)(GreenStep * i);
Blue1 = Blue0 + (int)(BlueStep * i);
color = Green1<<16 | Red1<<8 | Blue1; // 合成 綠紅藍
WsDat[0] = color;
WS_SetAll(); // 輸出
delay_ms(1); // 漸變速度
}
// 漸變結束
return color;
}
復制代碼
作者:
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