資源簡介
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
評論
共有 條評論