由16个引脚的STC8芯片为主。采用SOP封装 小巧玲珑。用定时器模拟PWM输出控制RGB。整个电路简单,所用元器件很少,但是看起来非常漂亮。而且程序写的很简洁,还附带了127种颜色的RGB代码,各种颜色都能显示。还有PCB图哦
制作出来的实物图如下:
电路原理图如下:
单片机源程序如下:
- #include "RGB.h"
- #include "RGBcode.h"
- u8 count=0;
- u16 n1=0;
- u8 QC=0;
- bit n2=0;
- u8 XS=0;
- #define N 3000000L/255/39
- #define N1 8000000L/255/39
- #define MAX 255
- #define MAX1 180
- #define MIN1 110
- void timeinit()
- {
- AUXR=0x80; //1T模式
- TMOD=0x01; //定时器0方式1,16位不自动重装载
- TH0 = (65536-39*12)/256;
- TL0 = (65536-39*12)%256;
- ET0=1; //开放定时器0中断
- TR0=1; //启动定时器0,开始计时
- }
- void tm0_isr() interrupt 1 using 1
- {
-
- if(QC==0){
- TH0 =(65536-39*12)/256;
- TL0 = (65536-39*12)%256;
- count++; //频率为100HZ
- n1++;
- if(n1>=N){n2=1;n1=0;}
- }
-
- if(QC==1){
- TH0 = (65536-10*12)/256;
- TL0 = (65536-10*12)%256;
- count++;
- n2=1;
- }
-
- if(QC==2){
- TH0 = (65536-39*12)/256;
- TL0 = (65536-39*12)%256;
- count++; //频率为100HZ
- n1++;
- if(n1>=N1){n2=1;n1=0;}
- }
-
- if(QC==3){
- TH0 = (65536-39*12)/256;
- TL0 = (65536-39*12)%256;
- count++;
- n1++;
- if(n1>=1000000/39){n2=1;n1=0;}
- }
-
-
- }
- void RGB()
- { static u8 i=0;
- QC=3;
- RGB_(yanse[i*3+0],yanse[i*3+1],yanse[i*3+2]);
- if(n2==1){i++;n2=0;}
- if(i==127){i=0;XS=0;}
- }
- void RGB_(u8 Rdelay,u8 Gdelay,u8 Bdelay)
- {
- if(count < Rdelay)RED=1;
- else RED=0;
- if(count < Gdelay)GREEN=1;
- else GREEN=0;
- if(count < Bdelay)BULE=1;
- else BULE=0;
- if(count==255){count=0;}
- }
- void qicai()
- {
- static u8 i=0,j=0;
- static bit ZJ=1,JS=0;
- QC=0;
- if(n2==1 && ZJ){i++;n2=0;}
- if(n2==1 && JS){i--;n2=0;}
- switch(j)
- {
- case 0:RGB_(i,0,0);if(i==MAX){ZJ=0;JS=1;j++;}break; //红色呼吸灯
- case 1:RGB_(i,0,0);if(i==0){ZJ=1;JS=0;j++;} break;
-
- case 2:RGB_(i,i,0);if(i==MAX){ZJ=0;JS=1;j++;}break; //黄色呼吸灯
- case 3:RGB_(i,i,0);if(i==0){ZJ=1;JS=0;j++;} break;
-
- case 4:RGB_(0,i,0);if(i==MAX){ZJ=0;JS=1;j++;}break; //绿色呼吸灯
- case 5:RGB_(0,i,0);if(i==0){ZJ=1;JS=0;j++;} break;
-
- case 6:RGB_(0,i,i);if(i==MAX){ZJ=0;JS=1;j++;}break; //青色呼吸灯
- case 7:RGB_(0,i,i);if(i==0){ZJ=1;JS=0;j++;} break;
-
- case 8:RGB_(0,0,i);if(i==MAX){ZJ=0;JS=1;j++;}break; //蓝色呼吸灯
- case 9:RGB_(0,0,i);if(i==0){ZJ=1;JS=0;j++;} break;
-
- case 10:RGB_(i,0,i);if(i==MAX){ZJ=0;JS=1;j++;}break; //紫色呼吸灯
- case 11:RGB_(i,0,i);if(i==0){ZJ=1;JS=0;j++;} break;
-
- case 12:RGB_(i,i,i);if(i==MAX){ZJ=0;JS=1;j++;}break; //白色呼吸灯
- case 13:RGB_(i,i,i);if(i==0){ZJ=1;JS=0;j++;} break;
-
- default : j=0;XS=1;break;
-
- }
- }
-
- //void quancai() //绿灯太亮 ,导致其他颜色显示不出来 所以屏蔽
- //{
- // static u8 i=0,j=0,k=0;
- // QC=1;
- // if(n2==1) {i++;n2=0;}
- //
- // RGB_(i,j,k);
- // if(i==255){i=0;j++;if(j==255){j=0;k++;if(i==255 && j==255 && k==255 ){i=0;j=0;k=0;}}}
- //
- //}
- void duocai()
- {
- static u8 i=0,j=0;
- static bit ZJ=1,JS=0;
- QC=2;
- if(n2==1 && ZJ){i++;n2=0;}
- if(n2==1 && JS){i--;n2=0;}
- switch(j)
- {
- case 0:RGB_(i,0,MAX);if(i==MAX){ZJ=0;JS=1;j++;}break; //单升单降 MAX
- case 1:RGB_(MAX,0,i);if(i==0){ZJ=1;JS=0;j++;} break;
-
- case 2:RGB_(MAX,i,0);if(i==MAX){ZJ=0;JS=1;j++;}break;
- case 3:RGB_(i,MAX,0);if(i==0){ZJ=1;JS=0;j++;} break;
-
- case 4:RGB_(0,MAX,i);if(i==MAX){ZJ=0;JS=1;j++;}break;
- case 5:RGB_(0,i,MAX);if(i==0){ZJ=1;JS=0;j++;} break;
-
- case 6:RGB_(i,i,MAX);if(i==MAX){ZJ=0;JS=1;j++;}break; //双升双降 MAX
- case 7:RGB_(i,MAX,i);if(i==0){ZJ=1;JS=0;j++;} break;
-
- case 8:RGB_(i,MAX,i);if(i==MAX){ZJ=0;JS=1;j++;}break;
- case 9:RGB_(MAX,i,i);if(i==0){ZJ=1;JS=0;j++;} break;
-
- case 10:RGB_(MAX,i,i);if(i==MAX){ZJ=0;JS=1;j++;}break;
- case 11:RGB_(i,i,MAX);if(i==0){ZJ=1;JS=0;j++;} break;
-
-
-
- case 12:RGB_(i,MIN1,MAX1);if(i==MAX){ZJ=0;JS=1;j++;}break;
- case 13:RGB_(MAX1,MIN1,i);if(i==0){ZJ=1;JS=0;j++;} break;
-
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
STC8F2K08S2.zip
(187.26 KB, 下载次数: 400)
|