找回密码
 立即注册

QQ登录

只需一步,快速开始

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

红外遥控RGB LED跳变渐变定色 单片机源码与原理图

[复制链接]
跳转到指定楼层
楼主
ID:403439 发表于 2018-10-14 15:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

单片机源程序如下:
  1. //============================================================================
  2. //================翼芯科技 红外遥控LED========================================
  3. //============================================================================   
  4. //  此源码版权属 翼芯科技 全权享有,如欲引用,敬请署名并告知
  5. //          严禁随意用于商业目的,违者必究,后果自负
  6. //程序说明:本程序用于实现红外遥控LED,IC插到U9位置.      
  7. //文件名称:main.C
  8. //版本:    1.0  
  9. //C编译器:  keil 8.05
  10. //   FFH    FEH   FDH   FCH                           
  11. //   FBH    FAH   F9H   F8H                 
  12. //   F7H    F6H   F5H   F4H        
  13. //   F3H    F2H   F1H   F0H                                                            
  14. //   EFH    EEH   EDH   ECH                              
  15. //   EBH    EAH   E9H   E8H  
  16. //=============================================================================                    
  17. #include <STC12C5AXX.H>

  18. #define uchar unsigned char
  19. #define uint unsigned int
  20. #define BIT_32   32

  21. sbit  RED1   = P0^0;               //红色IO口定义
  22. sbit  GREEN1 = P0^1;               //绿色IO口定义  
  23. sbit  BLUE1  = P0^2;               //蓝色IO口定义


  24. sbit  IRIN   = P3^7;



  25. bit   SYNOK,ADDROK,FLAGERR,LOK;
  26. bit   FLAG_MODE;
  27. bit   FLAG_ON;
  28. unsigned long int   BYTE1;
  29. uchar  LCOUNT,HCOUNT,HLCOUNT,BITCOUNT;

  30. uchar code TAB1[7]={1,2,4,3,6,5,7};                       //跳变数据
  31. uchar code TAB_RGB[3]={200,150,100};                      //单色红绿蓝白数据

  32. uchar code TAB_DAT1[3][4]={{184,154,124, 94},
  33.                                                    {138,118, 98, 78},
  34.                                                    { 88, 74, 60, 46}};
  35. uchar code TAB_DAT2[3][4]={{ 26, 50, 74, 98},
  36.                                                    { 18, 36, 54, 72},
  37.                                                    { 12, 24, 36, 48}};



  38. uchar DPTR;   
  39. uchar PWM_HL;
  40. uchar REPEAT;
  41. uchar MODE;
  42. uchar IR_CODE;
  43. uint  T_DELAY;
  44. uchar DIM1,DIM2;
  45. uchar COL1;
  46. uchar R_DAT,G_DAT;B_DAT;
  47. uchar R_BUF,G_BUF,B_BUF;


  48. /******************************************************************
  49. - 功能描述:红外按键函数
  50. - 隶属模块:无
  51. - 函数属性:无
  52. - 参数说明:无           
  53. - 返回说明:无
  54. - 注:.....
  55. ******************************************************************/
  56. KEY_SET()
  57.    {
  58.    IR_CODE=(BYTE1>>24);
  59.    if(IR_CODE==0xF4)             // 跳变1
  60.       {
  61.            FLAG_MODE=1;
  62.        MODE=0;
  63.            T_DELAY=1000;
  64.            return;  
  65.              }
  66.    if(IR_CODE==0xF0)             // 跳变2
  67.       {
  68.            FLAG_MODE=1;
  69.        MODE=0;
  70.            T_DELAY=3000;
  71.            return;  
  72.              }
  73.    if(IR_CODE==0xEC)             // 渐变1
  74.       {
  75.            FLAG_MODE=1;
  76.        MODE=1;
  77.            REPEAT=4;
  78.            return;  
  79.              }          
  80.    if(IR_CODE==0xE8)             // 渐变2
  81.       {
  82.            FLAG_MODE=1;
  83.        MODE=1;
  84.            REPEAT=12;
  85.            return;  
  86.              }          
  87.    if(IR_CODE==0xFD)             //OFF
  88.       {
  89.            FLAG_ON=0;
  90.            return;  
  91.              }         
  92.    if(IR_CODE==0xFC)             //ON
  93.       {
  94.            FLAG_ON=1;
  95.              }       
  96.           
  97.           
  98.           
  99.                      
  100.    if(IR_CODE==0xFB)             //红色
  101.       {
  102.            MODE=2;
  103.            FLAG_MODE=1;
  104.        R_DAT=250;G_DAT=0;B_DAT=0;         
  105.              }                  
  106.    if(IR_CODE==0xFA)             //绿色
  107.       {
  108.            MODE=2;
  109.            FLAG_MODE=1;
  110.        R_DAT=0;G_DAT=250;B_DAT=0;         
  111.              }       
  112.    if(IR_CODE==0xF9)             //蓝色
  113.       {
  114.            MODE=2;
  115.            FLAG_MODE=1;
  116.        R_DAT=0;G_DAT=0;B_DAT=250;                              
  117.              }                  
  118.    if(IR_CODE==0xF8)             //白色
  119.       {
  120.            MODE=2;
  121.            FLAG_MODE=1;
  122.        R_DAT=250;G_DAT=250;B_DAT=250;                              
  123.              }       
  124.    if(IR_CODE==0xF7)             //黄1
  125.       {
  126.            MODE=2;
  127.            FLAG_MODE=1;
  128.        R_DAT=200;G_DAT=200;B_DAT=0;                              
  129.              }                  
  130.    if(IR_CODE==0xF3)             //黄2
  131.       {
  132.            MODE=2;
  133.            FLAG_MODE=1;
  134.        R_DAT=200;G_DAT=100;B_DAT=0;                              
  135.              }                    
  136.    if(IR_CODE==0xEF)             //黄3
  137.       {
  138.            MODE=2;
  139.            FLAG_MODE=1;
  140.        R_DAT=200;G_DAT=150;B_DAT=0;                              
  141.              }       
  142.    if(IR_CODE==0xEB)             //黄4
  143.       {
  144.            MODE=2;
  145.            FLAG_MODE=1;
  146.        R_DAT=200;G_DAT=200;B_DAT=0;                              
  147.              }       
  148.           
  149.    if(IR_CODE==0xF6)             //青1
  150.       {
  151.            MODE=2;
  152.            FLAG_MODE=1;
  153.        R_DAT=0;G_DAT=200;B_DAT=200;                              
  154.              }                  
  155.    if(IR_CODE==0xF2)             //青2
  156.       {
  157.            MODE=2;
  158.            FLAG_MODE=1;
  159.        R_DAT=0;G_DAT=200;B_DAT=100;                              
  160.              }                    
  161.    if(IR_CODE==0xEE)             //青3
  162.       {
  163.            MODE=2;
  164.            FLAG_MODE=1;
  165.        R_DAT=0;G_DAT=200;B_DAT=150;                              
  166.              }       
  167.    if(IR_CODE==0xEA)             //青4
  168.       {
  169.            MODE=2;
  170.            FLAG_MODE=1;
  171.        R_DAT=0;G_DAT=200;B_DAT=200;                              
  172.              }                  
  173.           
  174.           
  175.    if(IR_CODE==0xF5)             //紫1
  176.       {
  177.            MODE=2;
  178.            FLAG_MODE=1;
  179.        R_DAT=200;G_DAT=0;B_DAT=200;                              
  180.              }                  
  181.    if(IR_CODE==0xF1)             //紫2
  182.       {
  183.            MODE=2;
  184.            FLAG_MODE=1;
  185.        R_DAT=100;G_DAT=0;B_DAT=200;                     
  186.              }                    
  187.    if(IR_CODE==0xED)             //紫3
  188.       {
  189.            MODE=2;
  190.            FLAG_MODE=1;
  191.        R_DAT=150;G_DAT=0;B_DAT=200;                              
  192.              }       
  193.    if(IR_CODE==0xE9)             //紫4
  194.       {
  195.            MODE=2;
  196.            FLAG_MODE=1;
  197.        R_DAT=200;G_DAT=0;B_DAT=200;                              
  198.              }                                                                     
  199.    }
  200. /******************************************************************
  201. - 功能描述:R G B输出
  202. - 隶属模块:无
  203. - 函数属性:无
  204. - 参数说明:无         
  205. - 返回说明:无
  206. - 注:.....
  207. ******************************************************************/
  208. SET_RGB(uchar LED_REG)
  209. {
  210.     uchar LEDDATA;
  211.         LEDDATA=LED_REG;
  212.         if(LEDDATA&0X01)                                  //输出红色
  213.             RED1=1;
  214.         else
  215.             RED1=0;
  216.         if(LEDDATA&0X02)                                  //输出绿色
  217.             GREEN1=1;
  218.         else
  219.             GREEN1=0;
  220.         if(LEDDATA&0X04)                                  //输出蓝色
  221.             BLUE1=1;
  222.         else
  223.             BLUE1=0;
  224. }

  225. /******************************************************************
  226. - 功能描述:延时函数
  227. - 隶属模块:无
  228. - 函数属性:无
  229. - 参数说明:无           
  230. - 返回说明:无
  231. - 注:.....
  232. ******************************************************************/
  233. delayms(uint x)
  234. {
  235.         uint t;
  236.         while(x--)
  237.         for(t=1500;t>0;t--)
  238.           {
  239.           while(FLAG_ON==0)
  240.                      {RED1=0;GREEN1=0;BLUE1=0;}
  241.            if(FLAG_MODE)return;
  242.           }
  243. }
  244. /******************************************************************
  245. - 功能描述:PWM_输出
  246. - 隶属模块:无
  247. - 函数属性:无
  248. - 参数说明:无         
  249. - 返回说明:无
  250. - 注:.....
  251. ******************************************************************/
  252. SHADE()
  253.     {
  254.       uchar i,CNT;
  255.       for(i=REPEAT;i>0;i--)
  256.         {
  257.                   while(FLAG_ON==0)
  258.                      {RED1=0;GREEN1=0;BLUE1=0;}
  259.           for(CNT=0;CNT<=PWM_HL;CNT++)
  260.             {
  261.              (R_DAT>CNT)? (RED1=1):  (RED1=0);
  262.              (G_DAT>CNT)? (GREEN1=1):(GREEN1=0);
  263.              (B_DAT>CNT)? (BLUE1=1):(BLUE1=0);
  264.                          if(FLAG_MODE)return;
  265.             }
  266.         }
  267.     }



  268. /******************************************************************
  269. - 功能描述:定时器0中断,中断时间为0.1MS,实现按键检测.
  270. - 隶属模块:无
  271. - 函数属性:无
  272. - 参数说明:无           
  273. - 返回说明:无
  274. - 注:.....
  275. ******************************************************************/
  276. void TIME0_INT() interrupt 1
  277. {
  278.         TH0  = (65535-200)/256;
  279.         TL0  = (65535-200)%256;
  280. //=====================检测高电平====================================================
  281.      if(FLAGERR==1)       //解码失败,初始化参数         
  282.        {
  283.          LCOUNT=0;
  284.          HCOUNT=0;
  285.              LOK=0;
  286.          FLAGERR=0;
  287.                  SYNOK=0;
  288.          BITCOUNT=BIT_32;
  289.        }
  290.      if(IRIN==0)
  291.         {
  292.            LCOUNT++;                                                //高电平计数器++
  293.            if(LOK==1)                                    //第一个高电平
  294.              {
  295.               LOK=0;
  296.               if(SYNOK==1)                            //同步码   Ok
  297.                 {     
  298.                  HLCOUNT=LCOUNT+HCOUNT;                    //检测高低计数值判定
  299.                  if((3<HLCOUNT)&&(HLCOUNT<40));   //高低电平小于2560,大于1152,ok;   18
  300.                  else  
  301.                                         {            
  302.                                         FLAGERR=1;                        //错误退出
  303.                     return;   
  304.                     }                                                              
  305.                  if(12<HCOUNT)
  306.                     BYTE1=(BYTE1>>1)|0x80000000;            //为1
  307.                  else
  308.                     BYTE1=(BYTE1>>1)|0x00000000;            //为0
  309.                  LCOUNT=0;                                  
  310.                  HCOUNT=0;
  311.                                  BITCOUNT--;                                    
  312.                  if(BITCOUNT==0)                             //解出了一次码
  313.                    {
  314.                     SYNOK=0;                                    //同步清零
  315.                                     BITCOUNT=BIT_32;                    //码的位数
  316.                                         KEY_SET();
  317.                    }            
  318.                  }     
  319.              else
  320.                {
  321.                 if((10<HCOUNT)&(HCOUNT<60))    //低电平大于6.4ms,小于12.8ms,同步码电平ok; 80-100,OK   
  322.                  {
  323.                    SYNOK=1;
  324.                    LCOUNT=0;
  325.                    HCOUNT=0;                          
  326.                  }
  327.                else
  328.                  {
  329.                    FLAGERR=1;
  330.                  }
  331.               }
  332.            }//end LOK
  333.        }//END IRIN==0;
  334.     else                                                     //检测高电平的宽度==低电平计数
  335.      {                                            
  336.        HCOUNT++;
  337.        if(LOK==1)
  338.           return;
  339.            if(SYNOK)
  340.              {
  341.              if((1<LCOUNT)&(LCOUNT<25))               //低电平大于256us,小于2048,高电平ok;       
  342.            {
  343.             LOK=1;                       
  344.            }
  345.                  else
  346.                    {
  347.                     FLAGERR=1;
  348.                    }  
  349.                   }
  350.                 else
  351.                    {
  352.            if((60<LCOUNT)&(LCOUNT<120))           //低电平大于6MS,小于9MS,        同步低电平ok;         
  353.             {
  354.                          LOK=1;                       
  355.             }
  356.                    else
  357.                         {
  358.                          FLAGERR=1;
  359.                         }
  360.                    }   //END ELSE
  361.                  } //EDN ELSE                          
  362. }
  363. /******************************************************************
  364. - 功能描述:主函数
  365. - 隶属模块:无
  366. - 函数属性:无
  367. - 参数说明:无      
  368. - 返回说明:无
  369. - 注:.....
  370. ******************************************************************/
  371. void  main()
  372.     {
  373.              TMOD = 0x01;                          //定时器0工作在16位的定时模式.
  374.             TH0  = (65535-200)/256;   //定时器0高位设定
  375.             TL0  = (65535-200)%256;   //定时器0低位设定
  376.             IE   = 0x82;                          //开总中断和定时器0中断
  377.         TR0  = 1;                                  //开定时器0
  378.                    P0M1=0x00;                      //设置P2输出口为推挽输出
  379.         P0M0=0x07;
  380.                 P3M1=0X80;                                  //P3.7为输入
  381.                 P3M0=0X00;



  382.         P0=0;
  383.             PWM_HL=200;
  384.         REPEAT=8;
  385.                 T_DELAY=2000;
  386.                 FLAG_ON=1;
  387.                 DIM1=1;
  388.         while(1)
  389.           {
  390.                   switch  (MODE)
  391.            {
  392.                         case 0:
  393.               for(DPTR=0;DPTR<7;DPTR++)            //跳变
  394.                   {
  395.                    SET_RGB(TAB1[DPTR]);         
  396.                    delayms(T_DELAY);                //延时1秒
  397.                                    if(FLAG_MODE)
  398.                      {
  399.                       FLAG_MODE=0;
  400.                       break;
  401.                      }
  402.                    }break;         
  403.                     case 1:
  404.               R_DAT=PWM_HL;G_DAT=0;B_DAT=0;
  405.               for(G_DAT=0;G_DAT<=PWM_HL;G_DAT++)         //红变黄
  406.                   {
  407.                     SHADE();
  408.                   }if(FLAG_MODE){FLAG_MODE=0;break;}
  409.               for(R_DAT=PWM_HL;R_DAT>0;R_DAT--)          //黄变绿
  410.                   {
  411.                     SHADE();
  412.                   }if(FLAG_MODE){FLAG_MODE=0;break;}
  413.               for(B_DAT=0;B_DAT<=PWM_HL;B_DAT++)          //绿变青
  414.                   {
  415.                     SHADE();
  416.                   }if(FLAG_MODE){FLAG_MODE=0;break;}
  417.               for(G_DAT=PWM_HL;G_DAT>0;G_DAT--)          //青变蓝
  418.                   {
  419.                     SHADE();
  420.                   }if(FLAG_MODE){FLAG_MODE=0;break;}  
  421.               for(R_DAT=0;R_DAT<=PWM_HL;R_DAT++)          //蓝变紫
  422.                   {
  423.                     SHADE();
  424.                   }if(FLAG_MODE){FLAG_MODE=0;break;}
  425.               for(G_DAT=0;G_DAT<=PWM_HL;G_DAT++)          //紫变白
  426.                   {
  427.                     SHADE();
  428.                   }if(FLAG_MODE){FLAG_MODE=0;break;}
  429.               for(G_DAT=PWM_HL;G_DAT>0;G_DAT--)          //白变红
  430.                   {
  431.                     B_DAT--;
  432.                     SHADE();
  433.                   }if(FLAG_MODE){FLAG_MODE=0;break;}
  434.                         case 2:
  435.                            SHADE();if(FLAG_MODE){FLAG_MODE=0;break;}
  436.                         default:break;
  437.                         }//mode          
  438.                                   
  439.             }
  440.         }
复制代码

所有资料51hei提供下载(含原理图):
http://www.51hei.com/bbs/dpj-137471-1.html


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

使用道具 举报

沙发
ID:3802 发表于 2019-1-8 18:29 | 只看该作者
好资料,51黑有你更精彩!!!
回复

使用道具 举报

板凳
ID:485018 发表于 2019-9-3 10:38 | 只看该作者
少SFR位定义及亮度加,亮度减程序
回复

使用道具 举报

地板
ID:607043 发表于 2019-9-3 18:54 来自手机 | 只看该作者
请问51单片机IO口怎样连接WS2811灯条
回复

使用道具 举报

5#
ID:485018 发表于 2019-9-5 15:23 | 只看该作者
lidie 发表于 2019-9-3 18:54
请问51单片机IO口怎样连接WS2811灯条

单片机频率需大于27MHZ及以上,定义好单片机IO口,编好程序并下载,5V供电单片机及WS2811,直接接WS2811信号输入口就可控制。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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