51单片机驱动WS2811彩灯源程序方案
WS2811是一款可以级联的RGB三色LED灯。只需要一根数据线就可以控制多颗LED。现在发上来整理的库函数,可以直接调用显示函数。
/****************************************************************************************
* 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;
}
51单片机驱动WS2811彩灯源程序方案相关推荐
- 基于51单片机的51单片机的LED彩灯霓虹灯控制器(心形流水灯)设计
基于51单片机的51单片机的LED彩灯霓虹灯控制器(心形流水灯)设计 必看!!视频讲解 基于51单片机的LED彩灯霓虹灯心形流水灯设计 这里写目录标题 1 开发环境 2 功能说明介绍 3 仿真图 4 ...
- 1-基于51单片机的音乐彩灯
具体实现功能 系统由51单片机+ADC0809模块+LM386功放模块+喇叭+音频接口+发光二极管+电源构成. 具体功能: (1)通过音频线输入可以播放电脑.手机.MP3里面的音乐. (2)AD对音频 ...
- c语言编程TLC2543AD采集,51单片机驱动12位AD转换TLC2543电路图+程序
51单片机驱动12位AD转换TLC2543电路图+程序 2015-06-18 16:51:15 来源:51hei void resultvolt() { volt=volt*5000.0/4334 ...
- 51单片机驱动——LCD1602
51单片机驱动--LCD1602 1.描述 51单片机控制LCD1602屏幕显示测量数据.固定字符串等,大家复制过去可以直接使用,相关注释我已标明. 2.子文件 LCD1602.c #include ...
- 用51单片机驱动蜂鸣器
用51单片机驱动蜂鸣器 #include<reg51.h>//头文件 sbit BEEP=P1^5;//位定义P1的第五个端口为蜂鸣器 void delay() //延时函数 {unsig ...
- 51单片机驱动DS18B20温度传感器测量温度
51单片机驱动DS18B20温度传感器测量温度 1.DS18B20温度传感器介绍: 2.51单片机驱动DS18B20测量温度 1.DS18B20温度传感器介绍: ①引脚定义 引脚 符号 说明 1 GN ...
- 使用51单片机驱动YM12232B型液晶显示屏
这是一个使用51单片机驱动YM12232B 液晶显示器的例子,本人水平有限,仅供参考. 本实例中将使用51单片机控制YM12232B LCD分别在主窗口和副窗口中显示"科"和&qu ...
- 基于51单片机驱动A4988实现步进电机逆时针转动
基于51单片机驱动A4988实现步进电机逆时针转动 一.简介 二.接线 典型接线图 实际接线 三.部分代码 引脚定义 定时器初始化 主函数 四.实验现象 五.注意事项 一.简介 A4988 是一款完全 ...
- 基于51单片机驱动HC-SR04超声波模块(LCD1602显示)
基于51单片机驱动HC-SR04超声波模块(LCD1602显示) 一.基本参数 二.通信时序 三.部分代码展示 四.实际效果 总结 一.基本参数 点击图片购买 HC- SR04+是一款宽电压工作的超声 ...
- 51单片机驱动HMI串口屏,串口屏的下载方式
51单片机驱动HMI串口屏,串口屏的下载方式 串口屏 串口屏的程序下载 51程序 总结 串口屏 串口屏是一个集成了单片机的屏幕模块,采用的是TTL串口协议,可以直接通过对应指令控制屏幕, 本文采用的串 ...
最新文章
- java B2B2C Springboot仿淘宝电子商城系统-负载均衡之ribbon+feign
- C++逐行读取文本文件的正确做法
- Linear_algebra_02_行列式
- apscheduler 绿色版
- Thread 和 Runnable创建新线程的区别,Runnable可以共享线程类的实例属性
- Batch入门教程(1)
- extjs 月份选择控件_Ext JS 4实现带week(星期)的日期选择控件(实战二)
- 从程序员到项目经理(16):原来一切问题都是可以解决的【转载】
- 十大程序员最实用的技术社区网站
- Python Qt GUI设计:菜单栏、工具栏和状态栏的使用方法(拓展篇—2)
- 幽默感七个技巧_培养幽默感的16种方法
- Kali Linux中显示“仓库没有数字签名”的解决方法
- oracle 支持多少并发量,如何估算一台数据库服务器能够承受的并发量
- 关于FLASH元件包含按钮的一个问题…
- Flex 布局语法教程
- i10在java中什么意思啊_Java的Integer和int有什么區別
- 万智牌天使恩典oracle,万智牌:每日套牌搬运 twitch 今日直播牌组
- 深度学习-参数和超参数介绍
- Mac M1 安装ubuntu虚拟机
- BTCOIL新能源线圈、扁线线圈、汽车新能源线圈关键词提取
热门文章
- 判断浏览器内核是否是IE8及其以下
- java过滤空号了停机号_手机号码空号检测
- 录屏软件推荐:bilibili哔哩哔哩直播姬录屏软件下载使用指南
- kettle教程,简单插入与更新
- mysql数据库更新数据库语句_MySQL数据库之UPDATE更新语句精解
- 图书管理系统-借书操作
- html中引入的图标库,动态引入阿里图标库
- 进销存excel_Excel进销存管理套表,自动库存显示应收应付,全函数快捷轻松
- STC单片机使用RS485下载程序方法
- 计算机指纹驱动程序,解决方法:联想笔记本指纹识别驱动程序安装教程[详细]...