资源简介
51利用EC11调节ws2812b亮度 EC11为360度无级旋钮,可以区分正转反转,并且可以通过向下按键来定义其它功能

代码片段和文件信息
/********************************************************/
/*作 者:yaleond
/*修改日期:2018.10.28
/*版 本:V1.0
/*程序功能:用stc89c52rc单片机控制ws2812 RGB输出,显示全色彩
/*备 注:51单片机晶振24M
/********************************************************/
#include
#include
#include“math.h“
#define uchar unsigned char
#define UDDEFAULT 10 //用于清除中断抖动的变量初始值
#define STEP 2 //清除抖动的阀值,含意为必须有两次同向转动中断才能触发,阀值不能太大,
//太大的话会让你旋钮转很多格数但是亮度调节动不明显
#define RGBSTEP 15 //调光时每次的递增/减量
sbit Send_Dat=P0^0; //数据输出,上拉后接ws2812 IN脚
sbit SJ=P1^4; //LED发光管的使能端
sbit p20 = P2^0; //开关
sbit p21 = P2^1; //B相
sbit p32 = P3^2; //A相
const uchar LEDSIZE = 4; //LED灯数
uchar upDown = UDDEFAULT; //清除中断抖动的变量
//存储一个转化后的RGB2进制数 共24bits
struct My_24bits //结构体
{
uchar G_VAL; //绿色 0-255
uchar R_VAL; //红色 0-255
uchar B_VAL; //蓝色0-255
};
volatile struct My_24bits led;
/*写入数据时序*/
void Send_A_bit(uchar VAL)
{
if (VAL==1)
{
Send_Dat=1;//
_nop_();
_nop_();
Send_Dat=0;
}
else
{
Send_Dat=1;
_nop_();
Send_Dat=0;
}
}
/*发送24位字符(包含RGB信息各8位)*/
void Send_24bits(struct My_24bits RGB_VAL)
{
uchar i;
for(i=0; i<8; i++)
{
Send_A_bit(RGB_VAL.G_VAL>>(7-i)&0x01);
}
for(i=8; i<16; i++)
{
Send_A_bit(RGB_VAL.R_VAL>>(15-i)&0x01);
}
for(i=16; i<24; i++)
{
Send_A_bit(RGB_VAL.B_VAL>>(23-i)&0x01);
}
}
void SendAllLeds() {
uchar c;
for(c=0; c Send_24bits(led);
}
/*小延时函数 一个指令大概是0.25us*/
/* 100us*/
void delay()
{
uchar ij;
for (i=0; i<4; i++)
{
for (j=0; j<100; j++);
}
}
void delays(uchar ms)
{
uchar ij;
for(j = ms; j > 0; j--)
for (i=0; i<4; i++)
{
delay();
}
}
/*系统初始化*/
void init()
{
P0=0;
SJ=1;
EA=1;//全局中断开
EX0=1;//外部中断0开
IT0=1;//下降沿有效
}
/*主函数*/
void main()
{
init();
Send_Dat=0;
led.G_VAL = 0xff;
led.R_VAL = 0xff;
led.B_VAL = 0xff;
SendAllLeds(); //发送led数据侦,一总发送四个灯的数据
while(1)
{
}
}
void interves(void) interrupt 0
{
//1ms延时,消抖
delays(1);
//中断到来时不直接去调亮度,而是先把这次脉冲记录下来
if(p21==0) {
upDown --;
} else {
upDown ++;
}
//当脉冲数量达到一定的阀值时再去做调节亮度
if(upDown == UDDEFAULT - STEP) {
if(led.G_VAL > RGBSTEP) {//uchar一直加会溢出到从0开始
led.G_VAL -= RGBSTEP;
led.B_VAL -= RGBSTEP;
led.R_VAL -= RGBSTEP;
} else {
led.G_VAL = 0;
led.B_VAL = 0;
led.R_VAL = 0;
}
SendAllLeds();
//做完后重置脉冲计数器,恢复计数
upD
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 16085 2018-11-11 11:05 Ws2812b Control.pdsprj
文件 4064 2018-11-11 11:02 control.c
相关资源
- 最新的北京地铁shp文件75146
- 程序员专用字体YaHei.Consolas.1.11b42517
- STC8951系列单片机中方指南
- 基于MCS_51单片机的工业屏柜散热方案
- 清翔电子MCS51开发板资料_新版 01_开发
- MCS_51单片机与8255A的接口设计
- Rtx51_tiny_RTOS中文版.pdf
- 51单片机PWM程序,占空比、周期可调整
- 51单片机多功能自行车测速仪
- proteus仿真 AT89C51输出各种波形
- 00
- 用51单片机实现G代码翻译
- 简易的电阻电容测量电路
- 51单片机基于protues的几个仿真实例
- 51单片机PCB设计图
- PC -- 单片机的串口数据传输系统设计
- 51模拟SPI读写SD卡(包括Fat和Fat32文件
- NRF24L01实现51与STM32双向通讯
- 基于c8051f020的AD转换程序及LCD显示程序
- 51单片机控制舵机程序
- 51单片机读取温度数据存储到SD卡中并
- 【单片机】51单片机数码管显示万年历
- 课程设计蔬菜大棚自动控制系统,包
- 基于AT89C51的数据采集系统设计新方法
- C51单片机汇编指令查询、学习工具集
- 基于8051单片机的红外接收程序
- 基于89c51的数字钟
- 8251 全双工异步通信
- 8051F040SMBUS多机通信
- 基于单片机交通灯设计
评论
共有 条评论