三色灯渐变DIY制作

2023-06-08,,

   小编前几天查资料,怎么使用12864屏幕的用法,突然发觉微博是个好东西,随着自己的成长,学习了很多的知识,没有做笔记的习惯,只是习惯把用到的硬件,传感器,资料写到程序的备注内,但感觉,用到时不是那么方便,同时也算是,记录自己的学习,分享学习经验和过程,一起和大家共勉。

  前段时间,一直在研究51单片机PWM的用法,但由于51单片机内部资源限制,只能输出两路PWM(P1.3和P1.4),而我想用单片机控制RGB三色灯混出不同的颜色,所以,只靠51的两路输出PWM不能达到要求,由于,只是调光,所以对于PWM的精度要求并不高,随即,想到用软件程序来模拟三路PWM的输出,经过一段时间的研究借鉴和编写网上大佬的程序,可以实现三原色的互相混合,程序中又加入了自动调色和手动调色,通电后,默认是自动变色,从绿色起步开始渐变,直至下一个绿色为一个渐变循环;手动调色功能我是用水银开关来实现,当想要手动调色固定一个颜色时,只需把三色灯倾斜,此时即进入手动调色功能,当颜色渐变到想要的颜色时,摆正三色灯即可,把颜色固定下来,不会再变化,如若,又想让它自动变色,只需晃动下三色灯即可,进入自动渐变颜色的模式。可能是自己刚入门把,可能程序有些晦涩和繁杂,但后面都有我很多的备注。

                                                                                                                                                 2017-10-25

                                                                                                                                                                                           by: L H 

先附上几张图片,外表亚克力图案用的是学校激光雕刻机雕刻的,嘻嘻

 

 

 /*

  程序完结于:2017.10.22
by:LH
QQ:1336294189,可技术交流 功能:三色(R,G,B)可自动渐变,也可手动调至喜欢颜色,保持颜色. 此程序仅供娱乐制作,不可投入商用!!,初入51,大神看后勿喷,谢谢 /*
_ooOoo_
o8888888o
88" . "88
(| -_- |)
O\ = /O
____/`---'\____
.' \\| |// `.
/ \\||| : |||// \
/ _||||| -:- |||||- \
| | \\\ - /// | |
| \_| ''\---/'' | |
\ .-\__ `-` ___/-. /
___`. .' /--.--\ `. . __
."" '< `.___\_<|>_/___.' >'"".
| | : `- \`.;`\ _ /`;.`/ - ` : | |
\ \ `-. \_ __\ /__ _/ .-` / /
======`-.____`-.___\_____/___.-`____.-'======
`=---='
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
佛祖保佑 永无BUG
*/ /* STC15F104W重点介绍: (1) 定时器模块:T0(中断标号 interrupt 1)和T2(中断标号 interrupt 12 ),T0工作在方式0时是16位可自动重装初始值的定时计数器,方式2时是8位自动重装的计数器,方式3时是可分解的;T2的工作模式固定在16位自动重装初始值模式,故特别适应到LED行业,该芯片的定时器模块可产生更高精度的定时时间。
(2) 内核:采用Y5超高速CPU内核,比普通1T还快20%,详情见指令集。共111条指令。
(3) 管脚图:
|--------|
MCLKO/!INT2/T0/RST/P3.4--|1 8|--P3.3/INT1/RSTOUT_LOW
VCC--|2 7|--P3.2/INT0
!INT3/T0CLKO/P3.5--|3 6|--P3.1/T2
GND--|4 5|--P3.0/!INT4/T2CLKO
|--------- (4) P3.3是RSTOUT_LOW,上电和复位后输出低电平,也可由软件设置低或高电平,该管脚可以作为16位或32位单片机的复位电路使用;P3.4可以输出系统时钟,故可以作为16位或32位单片机的的时钟电路;该芯片还有很强的加密功能,可取代加密芯片,单价只有一块多,故可以推荐给客户。
STC15F104W无串口,具有中继广播方式,可以软件模拟I2C、串口、SPI、利用IO口充放电测量外部电压实现AD功能。
可在下载软件中设置P3.1直通输出P3.0的输入电平,类似15系列串口1的中继广播方式。
STC15W104SW——DIP/SOP16,在性能和价格上都优于STC11F04E,故,可以替代STC11系列和89C4051等芯片,重点推荐给LED行业 (5) STC15F104W的外部中断可以用,而且多一个掉电唤醒专用定时器。
*/ #include <STC15F2K60S2.H>//STC15F104W DIP-8型单片机,比STC12C5A60S2 1T 单片机快 20%
#define uchar unsigned char
#define uint unsigned int
unsigned char pwm_data_R,pwm_data_G,pwm_data_B,pwm_r,pwm_g,pwm_b;
sbit PWM_R=P3^;
sbit PWM_G=P3^;
sbit PWM_B=P3^; sbit k1=P3^; unsigned int count4=; //自动变色快慢控制
unsigned int count5=; //自动颜色循环值
unsigned int count6=; //手动颜色循环值
unsigned int count7=; //手动变色快慢控制
unsigned int count8=; //手动调节变色色表快慢控制位
unsigned int count9=; //手动调节变色色表种类值
unsigned int add=; //自动OR手动调节控制位 add=0 自动调色; add=1 受冻调色控制位
unsigned char flag=; //按键防抖控制位
unsigned char flag1=; //手动调节变色至自动变色的色值时,flag1=1;继续手动调色,则进入 色表 CO[] 颜色设定 unsigned char CO[][]= { //三基色混色数据表
{,,},//黄色 0
// {222,202,85},//香蕉色 1
{,,},//铬黄 2
// {230,139,83},//dougello 3
// {250,222,129},//froum gold 4
{,,},//金黄色 5
// {213,161,102},//黄花色 6
// {222,164,99},//瓜色 7
{,,},//胡萝卜色 8
{,,},//棕色 9
// {250,122,62},//肉色 10
{,,}, //黄褐色 11
// {184,140,140}, //玫瑰红 12 {,,}, //钴色 13
// {2,164,154}, //锰蓝色 14
{,,}, //孔雀蓝 15
// {0,195,137}, //土耳其玉色 16
// {63,102,250}, //品蓝 17
// {103,88,200}, //石板蓝 18
{,,}, //青色 19 // {132,201,230}, //天蓝色 20
{,,}, //靛青 21
// {62,219,203}, //青绿色 22
{,,}, //黄绿色 23
{,,}, //翠绿色 24
// {185,246,196}, //薄荷绿 25
{,,}, //紫色 26
// {149,46,245}, //湖紫色 27
// {213,109,209}, //淡紫色 28
// {216,156,216} //梅红色 29 }; void Init (void) //中断初始化 //内部时钟 12M晶振
{
TMOD = 0x00; //(不可位寻址)设定定时器 T0 工作方式 0(16位自动重装定时器)
TH0=(-)/; //装T0高位初值 /定时器周期为500US(频率2K) (做PWM频率)
TL0=(-)%; //装T0低位初值
ET0=; //(可位寻址)T0的溢出中断允许控制位,ET0=1允许T0中断; ET0=0禁止T0中断;
TR0=; //(可位寻址)允许定时器T0运行
EA=; //(可位寻址)开启总中断 T2H=(-)/; //装T2高位初值
T2L=(-)%; //装T2低位初值 定时器周期为2US(频率500K) (做PWM宽度调)
AUXR=0X94; //辅助寄存器开启定时器T2,启动定时器T2,配置T0,T2时钟为 1T模式 (比STC15C5A 1T 模式快 20%)
IE2=0X04; //IE2(不可位寻址):定时器T2\T3\T4中断控制寄存器(控制定时器T2中断允许) ET2=0:禁止定时器T2产生中断 ET2=1:允许定时器T2产生中断 }
void timer0(void) interrupt //***********定时器T0中断子函数************** (做PWM频率)
{
PWM_R=;
PWM_G=;
PWM_B=;
pwm_r=;
pwm_g=;
pwm_b=; if(k1==)
{
if((k1==)&&(flag==)) //短按键识别切换;add=0切换自动变色,add=1长按手动调色,调制理想色时,松手即可
{
add++;
flag=;
if(add==) add=;
}
} else flag=; if(add==)
{
count4++; //自动变色快慢
if(count4==)
{
count4=;
count5++;
if(count5==) //自动颜色循环值
count5=;
}
} if(add==)
{
if((k1==)&&(flag==))
{
count7++;
if(count7==) //手动调节变色快慢
{
count7=;
count6++;
}
if(count6>=)
{
count6=; //手动颜色循环值
flag1=; //flag1=1,时变换颜色为上面色表中的颜色
}
else flag1=; //flag1=0,时自动变换颜色 if(flag1==)
{
count8++;
if(count8==) //手动调节变色色表快慢控制位
{
count9++;
count8=;
if(count9==) //手动调节变色色表种类值
{
count9=;
count6=;
}
}
}
}
}
} void timer1(void) interrupt //***********定时器T2中断子函数************** (做PWM宽度调)
{ if(pwm_r<pwm_data_R) pwm_r++;
else PWM_R=; if(pwm_g<pwm_data_G) pwm_g++;
else PWM_G=; if(pwm_b<pwm_data_B) pwm_b++;
else PWM_B=; } void jianbianRGB(unsigned int count3) //颜色渐变
{ if(count3>=&&count3<) //绿变亮 G++
{
pwm_data_G=count3;
pwm_data_R=;
pwm_data_B=;
}
else if(count3>=&&count3<) /// R++
{
pwm_data_R=count3-;
pwm_data_G=;
pwm_data_B=; } else if(count3>=&&count3<) //B++
{
pwm_data_R=; //max 250
pwm_data_G=;
pwm_data_B=count3-;
} else if(count3>=&&count3<) // G--
{
pwm_data_R=; //max 250
pwm_data_G=-count3;
pwm_data_B=;
}
else if(count3>=&&count3<) //B--
{
pwm_data_R=;
pwm_data_G=;
pwm_data_B=-count3;
} else if(count3>=&&count3<) /// R--
{
pwm_data_R=-count3;
pwm_data_G=;
pwm_data_B=;
} else if(count3>=&&count3<)
{
pwm_data_R=;
pwm_data_G=;
pwm_data_B=count3-; //B++
} else if(count3>=&&count3<)
{
pwm_data_R=;
pwm_data_G=count3-; //绿变亮 G++
pwm_data_B=;
} else if(count3>=&&count3<) /// R++
{
pwm_data_R=count3-;
pwm_data_G=;
pwm_data_B=; } else if(count3>=&&count3<)
{
pwm_data_R=-count3; /// R--
pwm_data_G=-count3; // G--
pwm_data_B=-count3; //B--
} else if(count3>=&&count3<)
{ /// R++
pwm_data_R=count3-; //max 250
pwm_data_G=;
pwm_data_B=;
} else if(count3>=&&count3<) //B++
{
pwm_data_R=;
pwm_data_G=;
pwm_data_B=count3-;
} else if(count3>=&&count3<) //G++
{
pwm_data_R=;
pwm_data_G=count3-;
pwm_data_B=;
} else if(count3>=&&count3<)
{
pwm_data_R=-count3; /// R--
pwm_data_G=-count3; // G--
pwm_data_B=-count3; //B--
}
} void scankey()
{
switch(add)
{
case : jianbianRGB(count5);
count6=;
break;
case : if(flag1==) //自动渐变颜色
{
jianbianRGB(count6);
}
else //自定义颜色色表
{
pwm_data_R=CO[count9][];
pwm_data_G=CO[count9][];
pwm_data_B=CO[count9][];
}
count5=;
break;
default : jianbianRGB(count5); break;
} } //●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●//
void main()
{
// P3M1=0X00; //P3口设置为推挽模式,提高灯的亮度
// P1M0=0X38;
PWM_R=; //max 250
PWM_G=;
PWM_B=;
Init();
while() //主循环
{
scankey();
// PWM_R=1;
// PWM_G=0;
// PWM_B=0; }
} /*
MMMMM
MMMMMM
MMMMMMM
MMMMMMMM .
MMMMMMMMM
HMMMMMMMMMM
MMMMMMMMMMMM M
MMMMMMMMMMMMM M
MMMMMMMMMMMMM M
MMMMMMMMMMMMM:
oMMMMMMMMMMMMMM
.MMMMMMMMMMMMMMo MMMMMMMMMMMMMMM M
MMMMMMMMMMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMM. oMMMMMMMMMMMMMMM.M
MMMMMMMMMMMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
oMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM: H
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM . MMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM M MMMMMM
.MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM M MMMMMMMMMM
MM. MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM M MMMMMMMMMMMM
MM MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM .MMMMMMMMMMMMMM
MM MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MM MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
.MMMMMMMMM MMMMMMMMMMMMMMMMMMMMMMMM.MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
HMMMMMMMMMMMMMMMMMMMMM.MMMMMMMMM.MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMM MMM.oMMMMMMM..MMMMMMMMM:MMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMM MM..MMMMMMM...MMMMMMM. MMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMM ..MMMMMM...MMMMMM ..MMMMMMMMMMMMMMMMMMM
MMMMMMM:M.MMM.M.. MMMMM M..MMMMM...MMMMMMMMMMMMMMMMMM MMM
MMMM. .M..MM.M...MMMMMM..MMMMM.. MMMMMMMMMMMMMMMMMMMMMMMMMMMMMM .
MMMM..M....M.....:MMM .MMMMMM..MMMMMMM...MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMM.M.. ...M......MM.MMMMM.......MHM.M .MMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMM..MM. . MMM.....MMMMMM.M.....M ..MM..M MMMMMMMMMMMMMMMMMMM
.MMMMMHMM. ..MMMM. MMM............o..... . .MMMMMMMMMMMMMMM
MMM. M... .........................M..:.MMMMMMMMMMMM
oMMM............ .................M.M.MMMMMMMMM
.....MM........................ . MMMMMM
M.....M.....................o.MM.MMMMMMMM.
M........................M.. ...MMMMMMMMMMMMMo
:....MMM..............MMM..oMMMMMMM
M...MMM.............MMMMMMM
.............:MMMMMMMM
M..... MMM.....M
M M.............
................M
ooM.................MM MoMMMMMoooM
MMoooM......................MoooooooH..oMM
MHooooMoM.....................MMooooooM........M
oooooooMoooM......... o........MoooooooM............
Mooooooooooo.......M.........Moooooooo:..............M
MooMoooooooooM...M........:Mooooooooooo:..............M
M..oooooooooooo .........Mooooooooooooooo..............M
M...Mooo:oooooooo.M....ooooooooooooooooooo..M...........M
...oooooMoooooooM..Mooooooooooooo:oooooooM.M...........M.
M...ooooooMoo:ooooMoooooooooooooHoooooooooH:M. ...........:
M..MoooooooMoooooooooooooooooo:ooooooMooooMoM..............M
M..ooooooooooMooooooooooooooHoooooooMooHooooM...............M
...ooooooooooooooooooo:MooooooooooooooMoMoooM................
M...oooooooooooooooooooooooooooooooooooooMooMM................M
...MooooooooooooooooooooooooooooooooooooooooMo ................
...MooooooooooooooooooooooooooooooooooooooooM M................M
M...ooooooooooooooooooooooooooooooooooooooooM ................M
...MoooooooooooooooooooooooooooooooooooooooMM .:...............
.....MooooooooooooooooooooooooooooooooooooMoo .............M
M...... ooooooooooooooooooooooooooooooooooooM M..............M
M........MooooMMM MM MM MMMMMMMMMooooooooM M...............M
.........HM M: MM :MMMMMM M M...............
M..........M M MoM M M................M
M.........:M MoH M M M MooooHoooMM. M M...............M
M..........Moooo MMooM oooooMooooooooM M..............H
M.........MooooM Mooo : ooooooMooooMoooM M........ . .o.M
H.. .....ooooo oooo M MooooooooooooooM M... MMMMMMMMMMM
MMMMMMMMMMooooM M oooo . ooooooMooooooooM .MMMMMMMMMMMMMMM
MMMMMMMMMMooooH : ooooH oooooooooooooooo MMMMMMMMMMMMMMM
MMMMMMMMMMoooo ooooM Moooooooooooooooo .MMMMMMMMMMMMMMM
MMMMMMMMMMoooo ooooM MooooooooooooooooM MMMMMMMMMMMMMMM
MMMMMMMMMMoooM ooooM ooooooooooooooooo MMMMMMMMMMM:M
MMMMMMMMMMoooM MooooM oooooooooooMoooooo MH...........
. ......Mooo. MooooM oooooooooooooooooo M............M
M.M......oooo MooooM Moooooooooooooooooo: .........M.....
M.M.....Moooo MooooM ooooooooooooooooooM .M............
.......MooooH MooooM oooooooooMoooooooooo M..o...M..o....M
.o....HMooooM MooooH MooooooooMooooooooooM .:M...M.......M
M..M.....MoooM :oooo: .MooooooooHooMoooooooooM M M... ..oM.M
M...M.:.Mooo. MMMMooooo oooooooooooMoooooooooooooM ....M. M
M:M..o.Moooooooooooooo MooooooooooooooMooooooooooooM .Mo
MooooooooooooooMooooooooooooMoMoooooooooooooo
Mooooooooooooooo:ooooooooooooooooooooooooooooo
ooooooooooooooooMooooooooooMoooooooooooooooooo
ooooooooooooooooMoooooooooooMooooooooooooooooHo
ooMooooooooooooooMoooooooooooooooooooooooooooMoM
MooMoooooooooooooo.ooooooooooooooooooooooooooo:oM
MoooooooooooooooooooooooooooooooooooooooooooooooM
MoooMooooooooooooooMooooooooooooooooooooooooooooo.
MoooMooooooooooooooMoooooooooooooooooooooooooMooooM
MooooooooooooooooooMoooooooooooooooooooooooooMoooooM
MooooMoooooooooooooMoooooooooooooooooooooooooMoHooooM
ooooooMooooooooooooooooooooooooooooooooooooooooMoMoooM
MooooooooooooooooooooMooooooooooooooooooooooooooMoooooH:
MoooooooMooooooooooooMoooooooooooooooooooooooooooooHoooM
MooooooooMoooooooooooMoooooooooooooooooooooooooMoooMooooM
Moooooooooooooooooooooooooooooooooooooooooooooo.oooMooooo
MoooooooooooooooooooooooooooooooooooooooooooooMoooooooooM
MooooooooooooooooooooMoooooooooooooooooooooooooooooooooM
MooooooooooooooooooooMHooooooooooooooooooooMoooo:ooooo
MMooooooooooooooooooMoMHoooooooooooooooooooooooMooooo
MMoooooooooooooooMMooo MMooooooooooooooooooooooooooM
MMMoooooooooooooMooooo oooooooooooooooooooooMooooo
MooMMoooooooooMoooMMoM ooooHooooooooooooooooMooooM
MooooMooooooMooooMoooM MoooooMoooooooooooooMooooo
ooooooMMooooooooMooooM MoooooooooMooooooooooooooM
HooooooMoooooooMooooM HoooooooHooMooooooooooooo
oooMoooooooooHoooM MoooooooooMoooooooooM
HooooooooooooHM MooooooooMMoooooooM
MMMMMMMMMMMMMM Moooooo:MooooHMM
MMMMMMM: ... MMMMMMMMMMMMMM
M............M MMMMMMMMM ....
M.MM.......... M.............M
M ..............MM M..............
MMMMM............MMMM ..MMMMMMMM ....M
MMMMMMMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMM...M
.MMMMMMMMMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMMM
:MMMMMMMMMMMMMMMMMMH MMMMMMMMMMMMMMMMMMM
By EBEN Jér?me MMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMM
HMMMMMM */

三色灯渐变DIY制作的相关教程结束。

《三色灯渐变DIY制作.doc》

下载本文的Word格式文档,以方便收藏与打印。