找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 15177|回复: 10
收起左侧

STC8F2K08S2单片机RGB变色呼吸灯程序+电路设计

  [复制链接]
ID:404207 发表于 2018-12-28 19:51 | 显示全部楼层 |阅读模式
由16个引脚的STC8芯片为主。采用SOP封装 小巧玲珑。用定时器模拟PWM输出控制RGB。整个电路简单,所用元器件很少,但是看起来非常漂亮。而且程序写的很简洁,还附带了127种颜色的RGB代码,各种颜色都能显示。还有PCB图哦

制作出来的实物图如下:
IMG_20181228_193710.jpg IMG_20181228_193704.jpg IMG_20181228_193531.jpg IMG_20181228_193658.jpg IMG_20181228_193716.jpg IMG_20181228_193728.jpg

电路原理图如下:
PCB原理图.png PCB图.png

单片机源程序如下:
  1. #include "RGB.h"
  2. #include "RGBcode.h"
  3. u8 count=0;
  4. u16 n1=0;
  5. u8 QC=0;
  6. bit  n2=0;
  7. u8 XS=0;
  8. #define N  3000000L/255/39
  9. #define N1 8000000L/255/39
  10. #define MAX   255
  11. #define MAX1  180
  12. #define MIN1  110

  13. void timeinit()
  14. {
  15.         AUXR=0x80;                  //1T模式        
  16.         TMOD=0x01;                //定时器0方式1,16位不自动重装载
  17.         TH0 = (65536-39*12)/256;
  18.         TL0 = (65536-39*12)%256;
  19.         ET0=1;                                //开放定时器0中断
  20.         TR0=1;                                //启动定时器0,开始计时
  21. }

  22. void tm0_isr() interrupt 1 using 1
  23. {
  24.          
  25.           if(QC==0){
  26.                 TH0 =(65536-39*12)/256;
  27.     TL0 = (65536-39*12)%256;                  
  28.                 count++;                       //频率为100HZ
  29.           n1++;
  30.           if(n1>=N){n2=1;n1=0;}
  31.           }
  32.                
  33.                 if(QC==1){
  34.                  TH0 = (65536-10*12)/256;
  35.      TL0 = (65536-10*12)%256;
  36.                 count++;
  37.     n2=1;                        
  38.                 }
  39.                
  40.           if(QC==2){
  41.                 TH0 = (65536-39*12)/256;
  42.     TL0 = (65536-39*12)%256;                  
  43.                 count++;                       //频率为100HZ
  44.           n1++;
  45.           if(n1>=N1){n2=1;n1=0;}
  46.           }
  47.                
  48.                 if(QC==3){
  49.                 TH0 = (65536-39*12)/256;
  50.     TL0 = (65536-39*12)%256;                  
  51.                 count++;        
  52.           n1++;
  53.           if(n1>=1000000/39){n2=1;n1=0;}
  54.           }                        
  55.          

  56.                

  57. }

  58. void RGB()
  59. {                static u8 i=0;
  60.           QC=3;                  
  61.                 RGB_(yanse[i*3+0],yanse[i*3+1],yanse[i*3+2]);        
  62.                 if(n2==1){i++;n2=0;}
  63.                 if(i==127){i=0;XS=0;}
  64. }

  65. void RGB_(u8 Rdelay,u8 Gdelay,u8 Bdelay)
  66. {
  67.    if(count < Rdelay)RED=1;            
  68.       else RED=0;
  69.          if(count < Gdelay)GREEN=1;
  70.                         else GREEN=0;
  71.          if(count < Bdelay)BULE=1;
  72.                         else BULE=0;
  73.          if(count==255){count=0;}

  74. }
  75. void qicai()
  76. {
  77.          static u8 i=0,j=0;
  78.          static bit ZJ=1,JS=0;
  79.          QC=0;
  80.   if(n2==1 && ZJ){i++;n2=0;}
  81.         if(n2==1 && JS){i--;n2=0;}
  82.          switch(j)
  83.          {
  84.                  case 0:RGB_(i,0,0);if(i==MAX){ZJ=0;JS=1;j++;}break;                     //红色呼吸灯
  85.            case 1:RGB_(i,0,0);if(i==0){ZJ=1;JS=0;j++;}        break;  
  86.                  
  87.                  case 2:RGB_(i,i,0);if(i==MAX){ZJ=0;JS=1;j++;}break;                //黄色呼吸灯
  88.            case 3:RGB_(i,i,0);if(i==0){ZJ=1;JS=0;j++;}        break;  
  89.                  
  90.                  case 4:RGB_(0,i,0);if(i==MAX){ZJ=0;JS=1;j++;}break;                     //绿色呼吸灯
  91.            case 5:RGB_(0,i,0);if(i==0){ZJ=1;JS=0;j++;}        break;  
  92.                                    
  93.                  case 6:RGB_(0,i,i);if(i==MAX){ZJ=0;JS=1;j++;}break;         //青色呼吸灯
  94.            case 7:RGB_(0,i,i);if(i==0){ZJ=1;JS=0;j++;}        break;  
  95.                   
  96.                  case 8:RGB_(0,0,i);if(i==MAX){ZJ=0;JS=1;j++;}break;                //蓝色呼吸灯
  97.            case 9:RGB_(0,0,i);if(i==0){ZJ=1;JS=0;j++;}        break;  
  98.                                  
  99.                  case 10:RGB_(i,0,i);if(i==MAX){ZJ=0;JS=1;j++;}break;        //紫色呼吸灯
  100.            case 11:RGB_(i,0,i);if(i==0){ZJ=1;JS=0;j++;}         break;  
  101.                  
  102.                  case 12:RGB_(i,i,i);if(i==MAX){ZJ=0;JS=1;j++;}break;        //白色呼吸灯
  103.            case 13:RGB_(i,i,i);if(i==0){ZJ=1;JS=0;j++;}         break;      
  104.                  
  105.                  default : j=0;XS=1;break;
  106.                         
  107.          }
  108. }

  109. //void quancai()       //绿灯太亮 ,导致其他颜色显示不出来  所以屏蔽
  110. //{
  111. //         static u8 i=0,j=0,k=0;
  112. //         QC=1;
  113. //   if(n2==1) {i++;n2=0;}
  114. //         
  115. //         RGB_(i,j,k);
  116. //         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;}}}
  117. //                     
  118. //}

  119. void duocai()
  120. {
  121.          static u8 i=0,j=0;
  122.          static bit ZJ=1,JS=0;
  123.                 QC=2;
  124.                 if(n2==1 && ZJ){i++;n2=0;}
  125.                 if(n2==1 && JS){i--;n2=0;}
  126.          switch(j)
  127.          {
  128.                  case 0:RGB_(i,0,MAX);if(i==MAX){ZJ=0;JS=1;j++;}break;                    //单升单降  MAX
  129.            case 1:RGB_(MAX,0,i);if(i==0){ZJ=1;JS=0;j++;}        break;  
  130.                                  
  131.                  case 2:RGB_(MAX,i,0);if(i==MAX){ZJ=0;JS=1;j++;}break;               
  132.            case 3:RGB_(i,MAX,0);if(i==0){ZJ=1;JS=0;j++;}        break;  
  133.                  
  134.                  case 4:RGB_(0,MAX,i);if(i==MAX){ZJ=0;JS=1;j++;}break;                    
  135.            case 5:RGB_(0,i,MAX);if(i==0){ZJ=1;JS=0;j++;}        break;                  
  136.                                    
  137.                  case 6:RGB_(i,i,MAX);if(i==MAX){ZJ=0;JS=1;j++;}break;         //双升双降   MAX
  138.            case 7:RGB_(i,MAX,i);if(i==0){ZJ=1;JS=0;j++;}        break;  
  139.                   
  140.                  case 8:RGB_(i,MAX,i);if(i==MAX){ZJ=0;JS=1;j++;}break;               
  141.            case 9:RGB_(MAX,i,i);if(i==0){ZJ=1;JS=0;j++;}        break;  
  142.                                  
  143.                  case 10:RGB_(MAX,i,i);if(i==MAX){ZJ=0;JS=1;j++;}break;        
  144.            case 11:RGB_(i,i,MAX);if(i==0){ZJ=1;JS=0;j++;}         break;  
  145.                  
  146.                  
  147.                  
  148.                  case 12:RGB_(i,MIN1,MAX1);if(i==MAX){ZJ=0;JS=1;j++;}break;                    
  149.            case 13:RGB_(MAX1,MIN1,i);if(i==0){ZJ=1;JS=0;j++;}        break;  
  150.                                  
  151. ……………………

  152. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
51hei.png
所有资料51hei提供下载:
STC8F2K08S2.zip (187.26 KB, 下载次数: 391)

评分

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

查看全部评分

回复

使用道具 举报

ID:234836 发表于 2019-1-24 15:09 | 显示全部楼层
有没有触控MCU,可以唤醒的
回复

使用道具 举报

ID:477932 发表于 2019-3-10 17:19 | 显示全部楼层
本帖最后由 static 于 2019-3-22 10:03 编辑
江边鸟 发表于 2019-1-24 15:09
有没有触控MCU,可以唤醒的
你做事时声音很小也能唤醒的

评分

参与人数 2黑币 +18 收起 理由
zhengchong60 + 8
嘉立创AAA + 10

查看全部评分

回复

使用道具 举报

ID:156220 发表于 2019-3-11 10:34 | 显示全部楼层
谢谢楼主的资料分享,学习了
回复

使用道具 举报

ID:501609 发表于 2019-3-31 11:13 | 显示全部楼层
多谢,学习下先
回复

使用道具 举报

ID:471632 发表于 2019-3-31 18:56 | 显示全部楼层
5个发光二极管并联的是增加亮度吗?我以为是几个发光管发不同的光混在一起
回复

使用道具 举报

ID:472844 发表于 2019-6-5 23:11 | 显示全部楼层
谢谢楼主的资料分享,学习了
回复

使用道具 举报

ID:56665 发表于 2019-8-5 11:36 | 显示全部楼层
这个灯的功率应该不大,100W功率是不是修改驱动三极管为大功率MOS管就行,还是要专用驱动芯片。
回复

使用道具 举报

ID:894943 发表于 2021-3-26 09:30 | 显示全部楼层
设计很优秀!
回复

使用道具 举报

ID:310993 发表于 2021-3-30 01:18 | 显示全部楼层
很好,给三色灯增加了多色彩,真是好东西!
回复

使用道具 举报

ID:921561 发表于 2021-5-15 10:14 | 显示全部楼层
楼主可以指导我做个可控制亮光的触控灯吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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