• 大小: 17KB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2021-05-16
  • 语言: 其他
  • 标签: 51  EC11  WS2812  

资源简介

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

评论

共有 条评论