1. 程式人生 > >STC89C52RC控制WS2812B LED 調色調光(二)

STC89C52RC控制WS2812B LED 調色調光(二)

前言

      淘寶買的編碼器到貨,開始手動編碼除錯,踩了一些坑,不過最終還是搞定。

目標

      上篇文章中是用ADC轉換電位器阻值來對WS2812B來進行調光的,如果想分別調三基色的亮暗,那就得用三個電位器三個ADC,或是基於片選的一個ADC轉換和三個電位器,電路比較麻煩。如果使用EC11,則可以同時實現以上功能同時減少電器元件的使用。

思路

       EC11(此處有別人描述非常非常詳細的資料,相看自己去看,我就不貼了)有五個腳,其中兩個腳DE為開關,可以實現按鍵開關的用途,在本例中可以實現按一下切換調色選單;ABC三腳則可以實現調亮調暗。

       本文先實現ABC三腳進行白光的調亮調暗,下一篇再進行三基色的調亮調暗。

      ABC三相的電路思路:AB腳接上拉10K電阻,A相接51的外部0號中斷,設定為下降沿觸發,B相接51的P2.1引腳,用於A相中斷到來時通過B腳電平的高低來判斷是正轉還是反轉;C相接地。

       中斷初始化:

    EA=1;//全域性中斷開
    EX0=1;//外部中斷0開
    IT0=1;//下降沿有效

       中斷處理函式中,我們要判斷B相的電平高低來做調亮與調暗,比如高電平時為正轉,低電平時為反轉。但是實際除錯中發現如果你一直正轉或反轉時,中斷的時候總有那麼一個脈衝跟其他的脈衝是相反的,不知道是劣質元件還是我劣質的程式設計水平引起的。。。所以我們要引入一個變數來消除這個抖動的脈衝:

#define UDDEFAULT 10         //用於清除中斷抖動的變數初始值
#define STEP 2               //清除抖動的閥值,含意為必須有兩次同向轉動中斷才能觸發,閥值不能太大,
                             //太大的話會讓你旋鈕轉很多格數但是亮度調節動不明顯
#define RGBSTEP  15          //調光時每次的遞增/減量

以下為最終的中斷實現函式:

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();
        //做完後重置脈衝計數器,恢復計數
        upDown = UDDEFAULT;
    }
    if(upDown == UDDEFAULT + STEP) {
        if(led.G_VAL < 255 - RGBSTEP) {
            led.G_VAL += RGBSTEP;
            led.B_VAL += RGBSTEP;
            led.R_VAL += RGBSTEP;
        } else {
            led.G_VAL = 0xff;
            led.R_VAL = 0xff;
            led.B_VAL = 0xff;
        }
        SendAllLeds();
        upDown = UDDEFAULT;
    }
}

電路圖

    電路圖如下:

EC11調亮度電路圖
EC11接入51電路圖

 

最後,附上protues電路圖和原始碼(因程式碼是在一塊51整合板上做的開發,有一些程式碼是做一些關閉電路的操作):

https://download.csdn.net/download/yaleond/10777470