/*一款遥控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;

}

/****************************************/

/***********遥控解码低电平检测***********/

/****************************************/

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

{

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

{

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调光原理c语言,最牛的LED遥控控制器---调整无闪烁(C语言)相关推荐

  1. 灯三段调光原理_球泡灯中国能效标识怎么做,GB30255中国能效报告办理要求

    LED路灯,LED隧道灯,LED投光灯,LED庭院灯等室外照明灯具以及LED室内灯具和LED面板灯做中国能效认证标准:GB30255-2019,GB37478-2019,GB38450-2019 GB ...

  2. LED调光,PFM即pulse frequence modulation

    PWM不是唯一的调制方式,可以PWM,也可以PFM,也可以混合调制. PWM即pulse width modulation的缩写,脉冲宽度调制,保持开关周期不变,调节开关导通时间. PFM即pulse ...

  3. 《LED调光-DMX512灯光协义接收控制》转

    源:http://blog.163.com/zhaojun_xf/blog/static/30050580200951023046891 来自: 作者:龙图开发网 文章来源:龙图开发网 时间:2009 ...

  4. SGL系列 LED调光电路设计 ANBOZ

    一.SGL8022W-单路LED调光触控芯片: 提供三段式触控调光和无级触控调光两种调光方式.在无级触控调光方式中,又有不带亮度记忆不带亮度缓冲.带亮度记忆不带亮度缓冲.带亮度记忆带亮度缓冲等三个不同 ...

  5. LED调光闪烁的原因

    转载--电源研发精英圈 2016-09-07 21:09 大家是不是在设计led调光电源的时候,电源会出现频闪的现象呢?通常人眼能够感知到频率达70Hz的光闪烁,高于这个频率则不会感知.故在LED照明 ...

  6. 舞台灯光控制系统c语言,很郁闷~再开源一个对数,线性,指数LED调光曲线获取算法...

    //对数调光光曲线生成START// //对数调光光曲线生成START// procedure TForm1.LightWave(a,b:string; color:byte; style:strin ...

  7. 灯三段调光原理_各种筒灯、射灯、斗胆灯最全的解释?用对地方,效果加倍

    提到筒灯和射灯,在现代家装的灯光设计里,这些都是打造家居氛围的一把手,尤其是射灯,经常在博物馆.展厅等场所见到.对于新手来说,它们外形相似很容易被混淆一起,这两者间有什么区别呢?而且筒灯分有灯珠.无灯 ...

  8. pmw.php,加速调光频率 PWM实现精准LED调光

    无论是经由降压.升压.降压/升压或线性稳压器驱动,连接每一个驱动电路最常见的线程就是须要控制光的输出.现今仅有很少数的应用只需要开和关的简单功能,绝大多数都需要从0-100%去微调光度.目前,针对光度 ...

  9. VK3601SS单键触摸LED调光IC 无极三段亮度调节芯片资料分享

    概述 VK3601SS 是一款集成了触摸按键.开关以及LED灯光开关和亮度调节的单通道触摸芯片.该芯片具有较高的集成度,仅需极少的外部器件便可以实现功能.提供了单路触摸按键与单路触摸开关功能,以及LE ...

最新文章

  1. python语言怎么用-在python语言中,如何使用注释
  2. java程序编译_Java程序的编译过程
  3. Xcode自带工具symbolicatecrash解析Crash文件
  4. CentOS转的服务器磁盘规划
  5. lodash源码分析之Hash缓存
  6. cvtcolor python opencv_二值分析 | OpenCV + skimage如何提取中心线
  7. Jury Compromise POJ - 1015
  8. vscode 智能打印_vscode智能提示
  9. 收藏网站制作常用经典css.div.布局.设计实例打包下载(下方有其他链接)
  10. BioPython-1
  11. 基于JAVA+SpringBoot+Mybatis+MYSQL的医药进销存管理系统
  12. 字符串处理_5个JavaScript的字符串处理库,不再996
  13. VBS操作XML文档,拷贝结点 (转)
  14. [转载] python中的bin()方法
  15. AngularJS自定义指令–隔离范围教程
  16. python 个人项目_软工个人项目WC(Python实现)
  17. 征集国内操作系统项目列表 zz
  18. ssm基于微信小程序的学习资料销售平台+ssm+uinapp+Mysql+计算机毕业设计
  19. [imx6 VPU]硬解码+示例[ffmpeg获取海康rtsp h264流 QT显示]
  20. java实现基本的购物车功能案例

热门文章

  1. 跟着大神练VIM--------二级
  2. 好玩的塔防益智游戏 Kingdom Rush HD (王国保卫战) for Mac 2.1
  3. nginx php配置重写,nginx 配置 php url 重写
  4. c语言文件写入函数有哪些,c语言文件读写函数有哪些?
  5. Docker: 小白之路一(Ubuntu16.04安装篇)
  6. 耳机不分主从是什么意思_真无线蓝牙耳机为什么可以不分主副?哪款蓝牙耳机性价比高?...
  7. 双目三维重建_对话 | 港科大教授权龙:为什么三维重建才是计算机视觉的灵魂?...
  8. oracle行转列、列转行总结
  9. c语言怎么比较两个字母大小,C语言strcmp()函数:比较两个字符串的大小
  10. ios 绕过mfi_如何让联系人绕过iOS的免打扰模式