资源简介
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
相关资源
- STC89C52RC使用电位器控制WS2812B调光
- C51单片机电子琴
- AT89X51.H头文件
- c8051f320 主机从机 SPI程序
- 带串口通信的温度控制器(带proteus仿
- 基于51单片机的智能家居系统程序
- AD9833驱动程序
- 基于C51 的16*64LED点阵
- 基于C51单片机音乐盒设计[1]
- 89C51单片机控制HT1621B驱动LCD(C程序)
- 51单片机 lcd1602测试C程序
- 基于51单片机LCDLM041L显示贪吃蛇小游戏
- microsoft calendar control 11.0.5510.0
- C 语言实现湿度传感器SHT30(51代码)
- 51 单片机串口通信程序,RS232串口通信
- protel DXP 2004画51常元件库
- GPS STC15程序,51程序
- nRF24L01详细中文资料+51程序
- WS2812驱动程序SPI+DMA
- Processing_1.51原创
- ARCENGINE要素编辑74051
- 20161024192515055.rar
- 基于51单片机的串行通信程序
- 51单片机 pwm波产生.zip
- 《51单片机原理及应用:基于KeilC与
- 非调试版本-C Runtime Library11.0.51106.1
- 51单片机 红外循迹 红外避障小车 双
- 51622414Battery_Dual_DCDC.rar
- 基于51单片机的等精度频率计
- 51单片机课程设计——智能电风扇
评论
共有 条评论