找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9075|回复: 11
打印 上一主题 下一主题
收起左侧

STM8单片机RGB三基色LED灯带控制程序测试成功

  [复制链接]
跳转到指定楼层
楼主
正常情况下红黄蓝三原色,用水粉很难调出标准的其他的颜色...
+=橙色
+=紫色
+=绿色
++=黑色.

粉柠檬黄 = 柠檬黄 + 纯白色
= 柠檬黄 + 玫瑰红
= 柠檬黄 + 玫瑰红
= 柠檬黄 + 纯黑色 + 玫瑰红
= 柠檬黄 + 纯黑色 + 玫瑰红
粉玫瑰红 = 纯白色 + 玫瑰红
= 柠檬黄 + 玫瑰红
= 玫瑰红 + 纯黑色
= 纯紫色 + 玫瑰红
= 玫瑰红 + 柠檬黄 + 纯黑色
= 纯白色 + 天蓝色
绿 = 草绿色 + 天蓝色
= 天蓝色 + 纯黑色
= 天蓝色 + 纯黑色 + 纯紫色
绿 = 纯白色 + 草绿色
绿 = 柠檬黄 + 草绿色
绿 = 草绿色 + 纯黑色
= 纯白色 + 纯紫色
= 玫瑰红 + 纯黑色

大红+柠檬黄+湖蓝——熟褐(其实几乎可以是黑色)
大红+柠檬黄——桔黄
柠檬黄+湖蓝——草绿,加多了湖蓝就是粉绿
大红+湖蓝——紫罗兰,加多了大红就是玫瑰红
大红+桔黄——中黄
大红+草绿——熟褐
大红+紫罗兰——玫瑰红
柠檬黄+紫罗兰——熟褐
柠檬黄+草绿——浅绿
湖蓝+紫罗兰——青莲

要注意调色的比例.很难的。.我画画的时候最少要10来种颜色....

颜色的品种变化无尽、绚丽多彩,但各种颜色之间存在一定的内在联系,每一种
颜色都可用3个参数来确定,即色调、明度和饱和度。色调是彩色彼此相互区别的特
征,决定于光源的色谱组成和物体表面所发射的各波长对人眼产生的感觉,可区别
红、黄、绿、蓝、紫等特征。明度,也称为亮度,是表示物体表面明暗程度变化的特
征值;通过比较各种颜色的明度,颜色就有了明这和深暗之分。饱和度,也称为彩
度,是表示物体表面颜色浓淡的特征值,使色彩有了鲜艳与阴晦之别。色调、明度和
饱和度构成了一个立体,用这三者建立标度,我们就能用数字来测量颜色。
自然界的颜色千变万化,但最基本的是红、黄、、蓝三种,称为原色。以这三种
原色按不同比例调配混合而成的另一种颜色,称为复色,从图4-1中可知颜色的拼色
关系。例如红+=橙;蓝+=绿;橙色和绿色称为复色。图4-2显示了色彩拼色的颜
色圈,三原色拼成的复色,其在颜色圈中与其对应的另一个色为补色。例如,黄与蓝
拼成绿色,对应的红色是绿色的补色。

在配色中,加入白色将原色或复色冲淡,就可得到饱和度不同的颜色;加入
不同分量的黑色,可得到明度不同的各种色彩。补色加入复色中会使颜色变暗、
甚至变为灰色或黑色。调色、成色与补色的关系,见表4-10
4-10 调色、成色与其补色关系
调色 成色补色
红与黄
蓝与黄
黄与红
紫与绿
绿与橙
橙与紫
绿

橄榄
柠檬
赤褐



紫、红
绿
1 柠檬黄-柠檬黄-淡黄-中黄-土黄-桔黄-桔红-赭石-熟褐
-肉色-朱红玫瑰红-大红--深红-紫罗兰-青莲
-粉绿-淡绿-浅绿-草绿-翠绿-橄榄绿-墨绿
-天蓝-钴蓝-群青-蓝莲-湖蓝-普蓝-
按调色盒相近的颜色排列(可以减轻颜色相混时对色纯度的影响)
2 白、柠檬黄(冷调黄)
淡黄(暖调黄)、中黄(暖调黄)、土黄(暗调黄)
桔黄(或桔红)、朱红(暖调红)、曙红(冷调红)
深红(用来压暗红系的重色)、褚石(很常用的哦)、熟褐(脏脏的重色,不敢多用,但很好用)
玫瑰红(美丽透明的颜色,爆炸力强,干后反色,少用效果极好)、紫罗兰(美丽的冷调色)、群青(偏暖的蓝)
钴蓝(挺正的蓝)、湖蓝(冷艳的蓝)、普蓝(除黑之外最重的色,用来加重画面的重色)
淡绿(偏暖的绿)、中绿(用得较多的绿,比较正)、深绿(或橄榄绿,用来压暗绿色系)
粉绿(偏冷,画苹果的时候挺好用的)、草绿(不用说了,画草的时候得劲)、黑(很少用到,但需要备着点)
3 蓝色+黄色=白色(其实是带有点肉色的颜色,因为调色调的很淡,所以说是白色)
其实纯白色是调不出来的
蓝色+黄色=绿看是什么黄
如果是柠檬黄那就是草绿
土黄是深绿
淡黄或中黄是浅绿
看自己加蓝多还是黄多
美术有3原色:
+=
+=
+=绿
朱红+谱蓝=黑色
不想要黑色太黑,可以多加点蓝或红。当然在画大面积的空间时比如大快布,背景等可以添加其他颜色,使黑色变的亮些,透出其色彩丰富
红色+绿色=黄色
绿色+蓝色=青色
红色+蓝色=品红
4 原色 原色是指不能用其他色混合而成的颜色。而原色则可以混合出许许多多其他的色彩。在依顿色相环中红、黄、蓝为三原色,他把这三种原色的标准定为:
红:不带蓝也不带黄味的红色。
黄:不带绿也不带红味的黄色。
蓝:不带绿也不带红味的蓝色。
间色 由任意两个原色混合后的色被称为间色。那么,三原色就可以调出三个间色来。它们的配合如下:
+=
+=绿
+=
以上原色色像混合所得的橙、绿、紫既是我们所说的间色。
复色 由一种间色和另一种原色混合而成的色,被称为复色。复色的配合如下:
+=黄橙
+=红橙
+=红紫
+=蓝紫
+绿=蓝绿
+绿=黄绿
所得得六种复色为:黄橙、红橙、红紫、蓝紫、蓝绿、黄绿


玫红色 + 黄色 = 大红 ( 朱红、桔黄、藤黄)  
朱红色 + 黑色少量 = 啡色
天蓝色 + 黄色 = 草绿、嫩绿  
天蓝色 + 黑色 + = 浅蓝紫
草绿色 + 少量黑色 = 墨绿
天蓝色 + 黑色 = 浅灰蓝
天蓝色 + 草绿色 = 蓝绿  
白色 + 红色 + 黑色少量 = 禇石红
天蓝色 + 黑色(少量) = 墨蓝
白色 + 黄色 + 黑色 = 熟褐
玫红色 + 黑色(少量) = 暗红
红色 + + = 人物的皮肤颜色
玫红色 + 白色 = 粉玫红   
蓝色 + 白色 = 粉蓝
黄色 + 白色 = 米黄
玫红色 + 黄色 = 大红 ( 朱红、桔黄、藤黄 )
朱红色 + 黑色少量 = 啡色
天蓝色 + 黄色 = 草绿、嫩绿
天蓝色 + 黑色 + = 浅蓝紫
草绿色 + 少量黑色 = 墨绿
天蓝色 + 黑色 = 浅灰蓝
天蓝色 + 草绿色 = 蓝绿
白色 + 红色 + 黑色少量 = 禇石红
天蓝色 + 黑色(少量) = 墨蓝
白色 + 黄色 + 黑色 = 熟褐
玫红色 + 黑色(少量) = 暗红
红色 + + = 人物的皮肤颜色
玫红色 + 白色 = 粉玫红
蓝色 + 白色 = 粉蓝
黄色 + 白色 = 米黄
粉柠檬黄 = 柠檬黄 + 纯白色
= 柠檬黄 + 玫瑰红
= 柠檬黄 + 玫瑰红
= 柠檬黄 + 纯黑色 + 玫瑰红
= 柠檬黄 + 纯黑色 + 玫瑰红
粉玫瑰红 = 纯白色 + 玫瑰红
= 柠檬黄 + 玫瑰红
= 玫瑰红 + 纯黑色
= 纯紫色 + 玫瑰红
= 玫瑰红 + 柠檬黄 + 纯黑色
= 纯白色 + 天蓝色
绿 = 草绿色 + 天蓝色
= 天蓝色 + 纯黑色
= 天蓝色 + 纯黑色 + 纯紫色
绿 = 纯白色 + 草绿色
绿 = 柠檬黄 + 草绿色
绿 = 草绿色 + 纯黑色
= 纯白色 + 纯紫色
    = 玫瑰红 + 纯黑色

单片机源程序如下:
  1. /***********************************************/
  2. /*************电摩LED灯带控制,三基色5050LED灯带********/
  3. #include "reg52.h"
  4. /*************三个NMOS增强型,对地开关控制灯带RGB三根线********/
  5. /***********************************************/
  6. #define uchar unsigned char
  7. #define uint  unsigned int

  8. /***********************************************/
  9. sbit RedLed=P3^5;
  10. sbit GreenLed=P3^7;
  11. sbit BlueLed=P3^4;           
  12. /***********************************************/
  13. uint RedLedDuty;   //最大10000
  14. uint GreenLedDuty; //最大10ms
  15. uint BlueLedDuty;  //最大10ms
  16. uint T0InterCnt;  //定时器中断计数
  17. uint T0flag;
  18. bit  ShaCheFlag;
  19. uint ShaCheCnt;
  20. /***********************************************/
  21. void LiuShuiDeng();
  22. void DanSeJianAn();
  23. void DanSeJianLiang();
  24. void ShanShuo(uint R,uint G,uint B,uint DelayTime,uint Count);
  25. void LiangDuPeiZhi(uint R,uint G,uint B);
  26. void LedInit();
  27. void delayms(uint k);
  28. void delays(uint k);
  29. /***********************************************/
  30. void main()
  31. {
  32.         ShaCheCnt=0;
  33.         ShaCheFlag=0;
  34.         delayms(1000);
  35.         T0InterCnt=0;
  36.         RedLed=1;
  37.         GreenLed=1;
  38.         BlueLed=1;
  39.         delays(3);
  40.         T0InterCnt=0;
  41.         RedLed=0;
  42.         GreenLed=0;
  43.         BlueLed=0;
  44.         delays(3);
  45.         LedInit();
  46.         while(1)
  47.         {
  48.                 //外部中断里用了闪烁函数,函数里有延时函数,测试发现,会出现外部中断几次后,程序卡死。加入初始化后解决。
  49.                 LedInit();        //一个整循环完毕后,下次循环之前最好重新初始化一下,防止某些地方关闭中断后,不再开启,陷入死循环
  50.                 if(ShaCheCnt<3)
  51.                 LiuShuiDeng();
  52.                 if(ShaCheCnt<3)
  53.                 DanSeJianAn();        
  54.                 if(ShaCheCnt<3)        
  55.                 ShanShuo(1,0,0,100,30);
  56.                 if(ShaCheCnt<3)
  57.                 ShanShuo(0,1,0,100,30);
  58.                 if(ShaCheCnt<3)
  59.                 ShanShuo(0,0,1,100,30);
  60.                 if(ShaCheCnt<3)
  61.                 DanSeJianLiang();
  62.                 if(ShaCheCnt<3)
  63.                 {
  64.                         RedLed=1;
  65.                         GreenLed=1;
  66.                         BlueLed=1;
  67.                         delays(3);
  68.                 }
  69.                 if(ShaCheCnt<3)
  70.                 ShanShuo(1,1,1,100,50);
  71.                 delays(2);
  72.         }

  73. }

  74. /***********************************************/
  75. void LedInit()
  76. {
  77.         EA=0;                 //关闭EA
  78.         T0flag=0;
  79.         T0InterCnt=0;
  80.         TMOD=0x02;//T0方式2
  81.         TH0=100%256;
  82.         TL0=100%256;        
  83.         EX1=1;
  84.         IT1=0; //外部中断边沿触发
  85.         ET0=1; //开T0中断
  86.         TR0=1;
  87.         EA=1;
  88. }
  89. /***********************************************/
  90. // 外部按键中断 1
  91. void ExInt1()  interrupt 2 using 2        //外部中断1                  
  92. {
  93.         TR0=0; //关闭定时器,出了外部中断再继续计数。防止某些卡死现象
  94.         EA=0;
  95.         ShaCheFlag=!ShaCheFlag;
  96.         ShaCheCnt++;
  97.         if(ShaCheCnt>6)
  98.         ShaCheCnt=0;
  99.         if(ShaCheCnt==1)
  100.     ShanShuo(0,0,1,100,6);
  101.         if(ShaCheCnt==2)
  102.     ShanShuo(1,0,1,100,6);
  103.         if(ShaCheCnt==3)
  104.     ShanShuo(0,1,1,100,6);
  105.         if(ShaCheCnt==4)
  106.         ShanShuo(1,0,0,100,6);
  107.         if(ShaCheCnt==5)
  108.     ShanShuo(1,1,0,100,6);
  109.         TR0=1;
  110.         EA=1;
  111. }


  112. /***********************************************/
  113. void time0() interrupt 1 using 2//定时器0中断
  114. {   
  115.         T0InterCnt++;
  116.         if(T0InterCnt*100>=RedLedDuty)
  117.         {
  118.           RedLed=0;
  119.         }
  120.     if(T0InterCnt*100>=GreenLedDuty)
  121.         {
  122.           GreenLed=0;
  123.         }
  124.     if(T0InterCnt*100>=BlueLedDuty)
  125.         {
  126.           BlueLed=0;
  127.         }
  128.         if(T0InterCnt*100>10001)
  129.         {
  130.                 T0InterCnt=0;
  131.                 T0flag=1;
  132.                 EA=0;
  133.                 TR0=0;
  134.                 TF0=0;
  135.         }
  136. }

  137. /**************七彩流水灯***********************/
  138. void LiuShuiDeng()
  139. {
  140.         uint WaitCnt;
  141.         T0InterCnt=0;
  142.         RedLed=0;
  143.         GreenLed=0;
  144.         BlueLed=0;
  145.         WaitCnt=200;
  146.         while(WaitCnt--)
  147.         {
  148.                 LiangDuPeiZhi(10000,0,0);          //红
  149.                 while(!T0flag);
  150.         }
  151.         WaitCnt=200;
  152.         while(WaitCnt--)
  153.         {
  154.                 LiangDuPeiZhi(10000,1000,0); //橙
  155.                 while(!T0flag);
  156.         }
  157.         WaitCnt=200;
  158.         while(WaitCnt--)
  159.         {
  160.                 LiangDuPeiZhi(10000,3000,0); //黄
  161.                 while(!T0flag);
  162.         }
  163.         WaitCnt=200;
  164.         while(WaitCnt--)
  165.         {
  166.                 LiangDuPeiZhi(0,10000,0);          //绿
  167.                 while(!T0flag);
  168.         }
  169.         WaitCnt=200;
  170.         while(WaitCnt--)
  171.         {
  172.                 LiangDuPeiZhi(0,10000,5000);        //青
  173.                 while(!T0flag);
  174.         }
  175.         WaitCnt=200;
  176.         while(WaitCnt--)
  177.         {
  178.                 LiangDuPeiZhi(0,0,10000);          //蓝
  179.                 while(!T0flag);
  180.         }
  181.         WaitCnt=200;
  182.         while(WaitCnt--)
  183.         {
  184.                 LiangDuPeiZhi(10000,0,10000);  //紫
  185.                 while(!T0flag);
  186.         }

  187. }

  188. /***************单色渐暗***************************/
  189. void DanSeJianAn()
  190. {
  191.         uint DecTime,WaitTime,j;
  192.         T0InterCnt=0;
  193.         RedLed=0;
  194.         GreenLed=0;
  195.         BlueLed=0;
  196.         delays(2);
  197.         DecTime=10000;
  198.         WaitTime=100;
  199.         while(WaitTime)
  200.         {
  201.           for(j=0;j<15;j++)
  202.           {
  203.                 LiangDuPeiZhi(DecTime,0,0);          //红
  204.                 while(!T0flag);
  205.                 T0flag=0;
  206.           }
  207.           DecTime-=100;
  208.           WaitTime--;         
  209.         }

  210.         delays(2);
  211.         DecTime=10000;
  212.         WaitTime=100;
  213.         while(WaitTime)
  214.         {
  215.           for(j=0;j<15;j++)
  216.           {
  217.                 LiangDuPeiZhi(0,DecTime,0);          //绿
  218.                 while(!T0flag);
  219.                 T0flag=0;
  220.           }
  221.           DecTime-=100;
  222.           WaitTime--;  
  223.         }
  224.         delays(2);
  225.         DecTime=10000;
  226.         WaitTime=100;
  227.         while(WaitTime)
  228.         {
  229.           for(j=0;j<15;j++)
  230.           {
  231.                 LiangDuPeiZhi(0,0,DecTime);          //蓝
  232.                 while(!T0flag);
  233.                 T0flag=0;
  234.           }
  235.           DecTime-=100;
  236.           WaitTime--;
  237.         }

  238. }

  239. /**************单色渐亮*****************************/
  240. void DanSeJianLiang()
  241. {
  242.         uint AddTime,WaitTime,j;
  243.         T0InterCnt=0;
  244.         RedLed=0;
  245.         GreenLed=0;
  246.         BlueLed=0;
  247.         AddTime=0;
  248.         WaitTime=100;
  249.         while(WaitTime)
  250.         {
  251.           for(j=0;j<15;j++)
  252.           {
  253.                   LiangDuPeiZhi(AddTime,0,0);          //红
  254.                 while(!T0flag);
  255.                 T0flag=0;
  256.           }
  257.           AddTime+=100;
  258.           WaitTime--;
  259.         }
  260.         delays(2);
  261.         AddTime=0;
  262.         WaitTime=100;
  263.         while(WaitTime)
  264.         {
  265.           for(j=0;j<15;j++)
  266.           {
  267.                   LiangDuPeiZhi(0,AddTime,0);          //绿
  268.                 while(!T0flag);
  269.                 T0flag=0;
  270.           }
  271.           AddTime+=100;
  272.           WaitTime--;
  273.         }
  274.         delays(2);
  275.         AddTime=0;
  276.         WaitTime=100;
  277.         while(WaitTime)
  278.         {
  279.           for(j=0;j<15;j++)
  280.           {
  281.                   LiangDuPeiZhi(0,0,AddTime);          //蓝
  282.             while(!T0flag);
  283.                 T0flag=0;
  284.           }
  285.           AddTime+=100;
  286.           WaitTime--;
  287.         }

  288. }

  289. /***************单灯闪烁*****************************/
  290. void ShanShuo(uint R,uint G,uint B,uint DelayTime,uint Count)
  291. {
  292.         T0InterCnt=0;
  293.         RedLed=R;
  294.         GreenLed=G;
  295.         BlueLed=B;
  296.         
  297.         while(Count--)
  298.         {
  299.                 RedLed=R;
  300.                 GreenLed=G;
  301.                 BlueLed=B;
  302.                 delayms(DelayTime);
  303.                 if(R)
  304.                 {
  305.                         RedLed=!RedLed;                   //红        
  306.                 }
  307.                 if(G)
  308.                 {
  309.                         GreenLed=!GreenLed;          //绿        
  310.                 }
  311.             if(B)
  312.                 {
  313.                         BlueLed=!BlueLed;          //蓝        
  314.                 }
  315.                 delayms(DelayTime);
  316.         }

  317. }
  318. /***********************************************/

  319. void LiangDuPeiZhi(uint R,uint G,uint B)
  320. {
  321.         EA=0;                 //关闭EA
  322.         RedLed=0;
  323.         GreenLed=0;
  324.         BlueLed=0;
  325.         T0InterCnt=0;
  326.         RedLedDuty=R;//
  327.         if(RedLedDuty<1)
  328.         {
  329.                 RedLed=0;
  330.         }
  331.         else
  332.          RedLed=1;
  333.         
  334.         GreenLedDuty=G;
  335.         if(GreenLedDuty<1)
  336.         {
  337.                 GreenLed=0;
  338.         }
  339. ……………………

  340. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
RGB-三基色LED灯带控制-测试成功.rar (3.81 MB, 下载次数: 202)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏6 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:345562 发表于 2019-3-1 08:12 | 只看该作者
好平台,好资源。
回复

使用道具 举报

板凳
ID:285069 发表于 2019-3-1 11:08 | 只看该作者
看來樓主把色系攪混在一起了;發射光譜用的是RGB;吸收光譜用的是CMYK.
畫畫調水彩或油彩的顏料,本身不發光,是吸收掉其他光,再反射出剩餘光,才表現顏色;是吸收光譜所以用CMYK.
(洋紅,靛藍,黃,黑)看看噴墨印表機的墨色就知道了.特點是加越多色越黑.所以必須用純白底色紙.
至於會發光的發射光譜用的是RGB;如電腦採色螢幕LCD,用紅/黃/綠三種色光混色,特點是加越多色越白.
所以不發光時必須是純黑背景
回复

使用道具 举报

地板
ID:116773 发表于 2019-3-1 12:19 | 只看该作者
楼主及楼上的科普知识受教了,谢谢!
回复

使用道具 举报

5#
ID:303586 发表于 2019-4-16 10:46 | 只看该作者
正在研究这个,学习了。
回复

使用道具 举报

6#
ID:612579 发表于 2020-2-26 13:37 | 只看该作者
想做控制4020 串联灯。找不到例子。
回复

使用道具 举报

7#
ID:723587 发表于 2020-4-6 20:23 来自手机 | 只看该作者
怎么扣了15个黑币都没下载到程序
回复

使用道具 举报

8#
ID:335173 发表于 2020-7-2 16:29 | 只看该作者

好平台,好资源,谢谢
回复

使用道具 举报

9#
ID:803374 发表于 2020-7-18 14:14 | 只看该作者
找到了有参考意义的资料,请问大矩阵,比如RGB键盘怎么控制
回复

使用道具 举报

10#
ID:229641 发表于 2020-7-18 23:16 来自手机 | 只看该作者
stm8的头文件是Reg52?
回复

使用道具 举报

11#
ID:652804 发表于 2020-12-8 10:13 | 只看该作者
正在研究这个,学习了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表