最牛的LED遥控控制器---调整无闪烁

发布者:乐呵的挑最新更新时间:2015-07-20 来源: 51hei关键字:LED  遥控控制器  无闪烁 手机看文章 扫描二维码
随时随地手机看文章
/*一款遥控LED控制器,所有功能均由遥控器控制,

它主要有如下功能:1、遥控调光2、旋钮调光 3、
开关机功能 4、渐变 5、跳变 6、循环变化(渐
变、跳变等)7、变化速度可调整,并断电能记忆*/

一、原理图:

二、参考图片:

三、参考程序:下载地址:http://www.51hei.com/f/ledtt.rar
#include
#include
/*********定义EEPROM寄存器地址*********/
sfr DATA=0xC2;//数据寄存器
sfr ADDRH=0xC3;//地址寄存器高八位
sfr ADDRL=0xC4;//地址寄存器低八位
sfr CMD=0xC5;//命令模式寄存器
sfr TRIG=0xC6;//命令触发寄存器
sfr CONTR=0xC7;//控制寄存器
/*********定义AD转换寄存器地址*********/
sfr ADC_RES=0xbd;//AD转换结果寄存器
sfr ADC_C=0xbc;//AD转换控制寄存器
sfr P1ASF=0x9d;
#define c(x) (x*120000/120000)
#define uchar unsigned char
#define uint unsigned int
#define dengji 2//手动调光等级定义

sbit IR=P3^3;
sbit LED=P3^0;

uint temp;//红外线解码变量
uchar i;
uchar j;

char dat=0;//PWM变量
uchar num;//PWM定时器变量
 
uint flashnum;//渐变跳变定时器变量
uchar IRBUF[4]; //用于保存解码结果
uchar shudu=1;

bit power=1;//电位器调光与遥控调光切换标志位
bit flag;//遥控开关机切换标志位
bit flash;//跳变切换标志位
bit jian;//渐变切换标志位
bit zeng;//综合变化变量

/***************************************************************/
/****************************EEPROM子函数***********************/
/***************************************************************/
/****************************************/
/**********EEPROM读数据子函数************/
/****************************************/
uchar read(uint add)
{
 CONTR=0x82;
 CMD=0x01;
 ADDRH=(add>>=8);
 ADDRL=add&(0x00ff);
 TRIG=0x5a;
 TRIG=0xa5;
  _nop_();
 CONTR=0x00;
 TRIG=0X00;
 return DATA;
}
/****************************************/
/**********EEPROM写数据子函数************/
/****************************************/
void write(uint add,uchar vale)
{
 CONTR=0x82;
 CMD=0X02;
 ADDRH=(add>>=8);
 ADDRL=add&(0x00ff);
 DATA=vale;
 TRIG=0x5a;
 TRIG=0xa5;
  _nop_();
 CONTR=0x00;
 TRIG=0X00;
}
/****************************************/
/**********EEPROM擦除数据子函数**********/
/****************************************/
void sector(uint add)
{
 CONTR=0x82;
 CMD=0x03;
 ADDRH=(add>>=8);
 ADDRL=add&(0x00ff);
 TRIG=0x5a;
 TRIG=0xa5;
  _nop_();
 CONTR=0x00;
 TRIG=0X00;
}

/****************************************/
/***************AD转换部分***************/
/****************************************/
uint adzhang1()
{
 uint zona;
 zona=0;
 ADC_C=0;//控制寄存器清0
 P1ASF=0;//IO口控制寄存器清0
 ADC_C|=0x80;//打开控制寄存器电源
 P1ASF|=0x80;//设置P1.7为AD输入口
 ADC_C|=0xe7;//打开控制寄存器电源,并选择P1.7为AD输入端
 //以上是初始化程序
 ADC_RES=0;//转换结果寄存器清0
 ADC_C|=0x08;//开始转换
 //delay1(2);
 while((ADC_C&0x10)==0);//判断结束标志位是否为不为1?若不为1则等待
 ADC_C&=0xe7;//清除等待标志位
 zona=ADC_RES*0.392156;//将255个等级变为100个等级 等级=100/255=0.392156
 if(zona<1)
 zona=0;
 return zona;  
}

[page]
/****************************************/ 
/***********遥控解码低电平检测***********/
/****************************************/
uint Low()
{
 TL0=0;
 TH0=0;
 TR0=1;
 while(!IR&&(TH0&0x80)==0);               
 TR0=0;          
 return TH0*256+TL0;
}
/****************************************/ 
/***********遥控解码高电平检测***********/
/****************************************/
uint High()
{
 TL0=0;
 TH0=0;
 TR0=1;
 while(IR&&(TH0&0x80)==0);
 TR0=0;
 return TH0*256+TL0;
}
/****************************************/ 
/************AD转换处理子函数************/
/****************************************/
void ADzhuan()
{
 if(!power)//如果此标志位为1,则执行AD转换
 dat = adzhang1();
}
/****************************************/ 
/**************LED闪烁子函数*************/
/****************************************/
void LEDflash()
{
 if(flash==1)//如果此标志位为1,则执行闪烁程序
 {
  if(flashnum>=(shudu*800))//定时器时间到了吗?
  {
   bit kl;//定义一个标志位
   flashnum=0;//到了就清0
   kl=~kl;//将它取反,以便形成亮灭变化
   if(kl==0)//如果为1,就让LED亮
   dat=100;//等级为100,就最亮
   else//否则灭
   dat=0;//等级为0就为熄灭
  }
 }
}
/****************************************/ 
/**************LED渐变子函数*************/
/****************************************/
void LEDjian()
{
 if(jian==1)//如果此标志位为1,则执行渐变程序
 {
  bit a;//定义一个标志位
  if(flashnum>=(shudu*100))//定时器时间到了吗?
  {
   flashnum=0;//到了就清0
   if(a==0)//如果为0就执行渐亮子函数
   {
    dat++;//时间到了就自动加1
    if(dat>100)//如果加到大于100
    {
     a=1;//将标志位变为1
     dat=100;//将变量变为最亮状态
    }
   }
   else//如果a为1就执行渐暗子函数
   {
    dat--;//时间到了就自动减1 
    if(dat<(0-1))//如果减到小于0了,就将它变为0
    {
     a=0;//标志位变为0,以便执行渐亮子函数
     dat=0;
    } 
   } 
  }
 } 
}

/**********************************************/ 
/**************LED综合子函数*************/
/**********************************************/
void zonghe()
{
 uchar ci,ii;
 bit a,fla;//定义一个标志位
 bit kl;//定义一个标志位
 if(zeng==1)
 {
  if(flashnum>=(shudu*100))//定时器时间到了吗?
  {
   flashnum=0;
   ii++;
   if(ii>7)
   {
    ii=0;
    if(fla==1)
    {
  
     kl=~kl;//将它取反,以便形成亮灭变化
     if(kl==0)//如果为1,就让LED亮
     dat=100;//等级为100,就最亮
     else//否则灭
     dat=0;//等级为0就为熄灭
     ci++;
     if(ci>=30)
     {
      ci=0;
      fla=0; 
     } 
    }
   }
   if(fla==0)
   {
    if(a==0)//如果为0就执行渐亮子函数
    {
     dat++;//时间到了就自动加1
     if(dat>100)//如果加到大于100
     {
      a=1;//将标志位变为1
      dat=100;//将变量变为最亮状态
     }
    }
    else//如果a为1就执行渐暗子函数
    {
     dat--;//时间到了就自动减1 
     if(dat<(0-1))//如果减到小于0了,就将它变为0
     {
      a=0;//标志位变为0,以便执行渐亮子函数
      dat=0;
      ci++;
      if(ci>=4)
      {
       fla=1;
       ci=0;
      }
     } 
    }
   }
  }
 }    
}
/****************************************/ 
/************遥控解码核心部分************/
/****************************************/
void decode()
{
 while(1)
 {
  restart:
  while(IR)/******空闲时处理其它的事情,即当遥控没有按下时,处理其它事情******/ 
  { 
   ADzhuan();
   LEDflash();
   LEDjian();
   zonghe();
  }/******空闲时处理其它的事情,即当遥控没有按下时,处理其它事情******/
  temp=Low();
  if(tempc(9500)) continue;//引导脉冲低电平9000
  temp=High();
  if(tempc(5000)) continue;//引导脉冲高电平4500
  for(i=0;i<4;i++) //4个字节
  {
   for(j=0;j<8;j++) //每个字节8位
   {
    temp=Low();
    if(tempc(800)) goto restart;
    temp=High();
    if(tempc(2000)) goto restart;
    IRBUF[i]>>=1;
    if(temp>c(1120))
    {
     IRBUF[i]|=0x80;
     
    }
   }
  }
  return;
 }

}
/****************************************/ 
/*********遥控解码键值处理子函数********/
/****************************************/
void numzhi()
{
 switch(IRBUF[2])//判断数组2键值注:因为只有第2组才是按键码,所以判断数组2

 {
/****************如果此键按下了,则遥控开关机****************11111**/
  case 0x58:
  flag=~flag;
  if(flag==0)
  dat=100;//dat为100时最亮
  else
  dat=0;//为0时熄灭
  jian=0;//将渐变变量置0,以防止渐变子程序动作
  flash=0;//将闪烁变量置0,以防止跳变子程序动作
  zeng=0;//将综合程序变量置0,以防止综合子程序动作
  break;

/***如果此键按下了,每按一次亮度会增加1个等级 共为100等级**22222**/
  case 0x1b:if(flag==0)
  {
   
   dat+=dengji;
   if(dat>=100)
   dat=100;
   jian=0;//将渐变变量置0,以防止渐变子程序动作
   flash=0;//将闪烁变量置0,以防止跳变子程序动作
   zeng=0;//将综合程序变量置0,以防止综合子程序动作
  }
  break;

/***如果此键按下了,每按一次亮度会减小1个等级 共为100等级**33333**/
  case 0x1f:if(flag==0)
  {
   dat-=dengji;
   if(dat<=(0-1))
   dat=0;
   jian=0;//将渐变变量置0,以防止渐变子程序动作
   flash=0;//将闪烁变量置0,以防止跳变子程序动作
   zeng=0;//将综合程序变量置0,以防止综合子程序动作

  }
  break;

/***每按一次跳变和渐变速度会减小1个等级 共为60等级,并写入改变的数值,以便开机记忆**44444**/
  case 0x0f:if(flag==0)
  {
   shudu-=1;
   if(shudu<=1)
   shudu=1;
   sector(0x0200);//擦除EEPROM,擦除地址为0X200
   write(0x0200,shudu);//写入EEPROM,写入地址为0X200
  }
  break;

/***每按一次跳变和渐变速度会增加1个等级 共为60等级,并写入改变的数值,以便开机记忆**55555**/
  case 0x1a:if(flag==0)
  {
   shudu+=1;
   if(shudu>=30)
   shudu=30;
   sector(0x0200);//擦除EEPROM,擦除地址为0X200
   write(0x0200,shudu);//写入EEPROM,写入地址为0X200
  }
  break;

/*********如果此键按下了,则执行手动调光与遥控切换,两者不能同时工作***********66666**/ 
  case 0x1e:if(flag==0)
  {
   flash=1;//进入遥控后,让它先进入关机状态
   dat=0;
   power=~power;//手动调光与遥控切换标志位
   jian=0;//将渐变变量置0,以防止渐变子程序动作
   flash=0;//将闪烁变量置0,以防止跳变子程序动作
   zeng=0;//将综合程序变量置0,以防止综合子程序动作
  }
  break;

/***********************如果此键按下了,则执行渐变子函数*******************77777**/ 
  case 0x0e:if(flag==0)
  {
   jian=~jian;
   dat=0;
   flash=0;//将闪烁变量置0,以防止跳变子程序动作
   zeng=0;//将综合程序变量置0,以防止综合子程序动作
  }
  break;
/***********************如果此键按下了,则执行跳变子函数*******************88888**/ 
  case 0x19:if(flag==0)
  {
   flash=~flash;
   dat=0;
   jian=0;//将渐变变量置0,以防止渐变子程序动作
   zeng=0;//将综合程序变量置0,以防止综合子程序动作
  }
  break;
  case 0x1d:if(flag==0)
  {
   zeng=~zeng;
   dat=0;
  }
  break;
   
 }
}
/****************************************/ 
/***************主程序部分***************/
/****************************************/
main()
{
 TMOD=0x11;//设置定时器0定时器1工作方式为1的状态下工作
 EA=1;

 TR0=1;//设置定时器0
 ET0=1;
 TL0=0;
 TH0=0;

 TR1=1;//设置定时器1
 ET1=1;
 TH1=(65536-20)/256; //定时器初值
 TL1=(65536-20)%256;
 shudu=read(0x0200);//开机读取EEPROM里面的速度变量shudu,从而形成断电记忆功能
 while(1)
 {
  decode();//调用解码子函数
  numzhi();//调用遥控键值子函数
 }
}
/****************************************/ 
/***************定时器1部分**************/
/****************************************/
void zhong3() interrupt 3 //利用PWM来改变亮度
{

 TH1=(65536-20)/256; //定时器0设定约1000us中断一次
 TL1=(65536-20)%256;
 num++;//PWM定时器
 flashnum++;//闪烁渐变变量
 if(num>=100)//此PWM等级为100,它由变量num与dat完成
 num=0;
 if(num  LED=0;//如果计数器变量小于PWM时,LED亮 
 else
 LED=1;
 
}
/****************************************/ 
/***************定时器0部分**************/
/****************************************/
void zhong1() interrupt 1//用来产生遥控解码计时
{
 TL0=0;
 TH0=0;

 

关键字:LED  遥控控制器  无闪烁 引用地址:最牛的LED遥控控制器---调整无闪烁

上一篇:8*8LED点阵显示0-9
下一篇:LED彩色护栏管程序---1个IO口搞定!

推荐阅读最新更新时间:2024-03-16 14:25

SupertexHV9861A21W通用AC输入高亮LED驱动方案
LED驱动器,从而大大地改善了LED电流的精度,线路和负载调整精度而不需要回路补偿或高边电流检测,LED输出电流精度±3%.主要用在DC/DC或AC/DC LED驱动器,LCD屏的LED背光驱动,通用恒流源,LED显示屏,建筑和装饰照明以及LED街道照明.本文介绍了HV9861A主要特性,方框图,典型应用电路以及21W通用AC输入电压LED驱动器演示板主要指标,电路图,材料清单和PCB布局图. The HV9861A is a patented, average-mode, constant current control LED driver IC operating in a constant off-time mode. Un
[电源管理]
SupertexHV9861A21W通用AC输入高亮<font color='red'>LED</font>驱动方案
分析师称中国半数LED芯片厂商将破产
北京时间5月28日早间消息,随着电视机价格的下降,中国大批为三星和夏普生产LED芯片的公司面临困境。分析师指出,这一供大于求的问题将导致半数企业走向破产,而只有规模较大的、得到政府支持的公司能继续生存。    小公司或走向破产   全球电视机和电脑销售的滑坡有可能进一步影响LED芯片的价格,这类芯片将最多降价20%。对于中国的小型LED芯片公司来说,被整合或破产将是唯一选择。   不过分析师指出,市值达28亿美元的三安光电以及广东德豪润达将是少数几家能继续生存的公司,因为这些公司获得了中国政府的补贴或奖励。野村证券分析师安尼·李(Anne Lee)表示:“这是中国的策略。他们希望最大的公司在行业重组中存活下来。”  
[电源管理]
LED发光二极管焊接技术要求
白光(蓝光、绿光同白光)LED二极管在焊接的过程中请严格遵守以下要求操作:   1.工人生产时一定要戴防静电手套,防静电手腕,电烙铁一定要接地,严禁徒手触摸白光LED的两只引线脚。因为白光LED的防静电为100V,而人在工作台上工作湿度为60%-90%时人体的静电会损坏发光二极管的结晶层,工作一段时间后(如10小时)二极管就会失效(不亮)。严重时会立即失效。   2.焊接温度为260℃,3秒。温度过高,时间过长会烧坏芯片。为了更好地保护LED,LED胶体与PC板应保持2mm以上的间距,以使焊接热量在引脚中散除。   3.LED的正常工作电流为20mA,电压的微小波动(如0.1V)都将引起电流的大幅度波动(10%-15%)。因此
[电源管理]
温故知新:LED灯具关键设计问题
  要设计产品,首先要确定用谁的 LED封装 结构;接下来考虑怎样适应这些封装形式;由我们选择的机会不多,光学结构是建立在这些封装之上的;我们很多创意不能很好的发挥。    一、 半导体照明 应用中存在的问题   1、散热   2、缺乏标准,产品良莠不齐   3、存在价格与设计品质问题,最终消费者选择 LED照明 ,缺乏信心   4、半导体 照明 在电气设计方面与传统照明有很大差别,传统灯具企业需要经验/技能积累过程   5、大家都看好该市场,但是还没有规模上量   特点:   1、通过调整高精度恒流芯片,保证 LED 亮度、色度的一致性,在模块一级为下游客户提供标准的、定制的、可靠的高品质产品;   2、新
[电源管理]
LED显示屏报价及预算评估14招
  想购买 LED显示屏 的朋友,一定会要求 LED 显示屏报价方案来作为参考,预算方面是否超支。凭多年经验,下面我们将为您详细介绍LED显示屏报价包含的各项费用,以助您在选购LED彩屏时有一个直观清晰的认识。    1.显示屏屏体费用: 一般是按每平方米多少钱来算的,即常见的LED显示屏报价xxx元/m2,其中显示屏型号、所用材料不同,报价也会有区别。屏体报价中包括了全套的LED彩屏所需:管芯、模组电路板、IC驱动芯片、模组电源、钢质箱体和塑胶面罩以及显示屏内部所有排线、连接线等等。一般是含税报价,这个可能有所不同,具体咨询时候问清楚。    2.控制系统费用: 即显示屏发送卡和接收卡的费用,一个屏一般只需1张发送卡,装在电脑主
[电源管理]
STM32总结一 STM32三种点亮LED灯方式的不同之处
STM32点亮LED灯有很多种方法。 第一种是操作寄存器来点亮LED灯,(以GPIOC的第一个LED为例)操作的方法是首先在中文手册,首先要声明的是,手册里面看到的地址,都是字节,表示第多少多少个字节,然后这个数字对应一个字节位,所以每一个32位的寄存器占四个字节,找到block2(这个是外设区,所有的外设地址都在这个区)的基地址,然后加上第一段偏移地址,就越过APB1总线的内存区,到达了APB2总线这个区的基地址。然后再加上相对于APB2的偏移地址就可以定位出某个特定外设的基地址,这里所指的是GPIOC端口的基地址,然后再在这个端口外设基地址的基础上,加上相应的偏移地址,就可以定义出这个端口的寄存器地址,这些寄存器是紧紧的挨
[单片机]
STM32总结一 STM32三种点亮<font color='red'>LED</font>灯方式的不同之处
高效LED背光照明在汽车显示器设计中的应用
中心议题: 高效LED背光照明在汽车显示器设计中的应用 汽车 LED 照明设计参数 解决方案: 采用 LT3760、效率为 90% 的 28W LED 背光照明电路 引言 根据 Strategies Unlimited 公司的数据 (参见图 1),到 2012 年,高亮度 (HB) LED 的市场规模预计将达到 120 亿美元,到 2015 年,该市场将增长到 202 亿美元,年复合增长率为 30.6%。目前,用来给显示器进行背光照明的 LED 是这种前所未有的增长的主要驱动力。应用包括高清电视机(HDTV)、汽车显示器和大量手持式设备。为了保持这种令人惊叹的增长率,LED 不仅必须提供增强的可靠性
[电源管理]
高效<font color='red'>LED</font>背光照明在汽车显示器设计中的应用
技术进步促使LED封装技术改变之分析
一、LED芯片效率的提升与led应用技术的扩展必将会改变现有的LED封装技术 LED LAMP现有的封装形式为:DIP、SMD、TOP、SUPERFLUX、HIGHT POWER 目前各种封装形式的不足(热阻高、出光利用率低、最终应用结构匹配难) 未来芯片技术将会以提高效率降低成本、莹光粉技术以提高效率稳定性与演色指数为进步方向 LED芯片效率的提升将以阶段性成长为主,从10lm/w~80lm/w、80lm/w~100lm /w、100lm/w~150lm/w、150lm/w~200lm/w…… 当技术进步到200lm/w时对比现有的芯片效率提升了4.5倍,芯片的发热量将大幅度减少(指同体积同面积
[电源管理]
技术进步促使<font color='red'>LED</font>封装技术改变之分析
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved