STC89C52RC控制WS2812B LED 調色調光(二)
阿新 • • 發佈:2018-11-25
前言
淘寶買的編碼器到貨,開始手動編碼除錯,踩了一些坑,不過最終還是搞定。
目標
上篇文章中是用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; } }
電路圖
電路圖如下:
最後,附上protues電路圖和原始碼(因程式碼是在一塊51整合板上做的開發,有一些程式碼是做一些關閉電路的操作):
https://download.csdn.net/download/yaleond/10777470