Philips 87LPC768红外解码程序

发布者:火星叔叔最新更新时间:2018-01-09 来源: eefocus关键字:Philips  87LPC768  红外解码 手机看文章 扫描二维码
随时随地手机看文章

#include              /*Philips 87LPC768 寄存器定义头文件*/ 
#define REDINT 0x06             /*红外线间隔*/ 


/*存放消息标志的可位寻址字节Message,Message=NULL时无任消息*/ 
unsigned char bdata Message; 

/*在接收过程中置位,检测标置位Get可以有效防止其它进程干扰接收,防止数据丢失*/ 
sbit RedMsg=Message^0;             /*红外遥控消息*/ 
sbit RedRead=Message^1;             /*位接收过程标志*/ 
sbit RedBit =Message^2;             /*接收到的位值*/ 
sbit RSend =Message^3;             /*红外接收中重新发送标志*/ 

/*存放遥控的字数据,低4位存放接收到的bit的位移,高12位从低到高存放接收到的bit*/ 
unsigned char bdata RedDataL,RedDataH; 

/*RedDataH字节低6位代表指令,只有一个1,C1~C3是用户码,H表示连续,S1、S2分别表示第 
一、二组单发*/ 
sbit RedData0=RedDataL^4;         /*C1*/ 
sbit RedData1=RedDataL^5;         /*C2*/ 
sbit RedData2=RedDataL^6;         /*C3*/ 
sbit RedData3=RedDataL^7;         /*H*/ 
sbit RedData11=RedDataH^0;         /*D6*/ 
sbit RedData10=RedDataH^1;         /*D5*/ 
sbit RedData9=RedDataH^2;         /*D4*/ 
sbit RedData8=RedDataH^3;         /*D3*/ 
sbit RedData7=RedDataH^4;         /*D2*/ 
sbit RedData6=RedDataH^5;         /*D1*/ 
sbit RedData5=RedDataH^6;         /*S2*/ 
sbit RedData4=RedDataH^7;         /*S1*/ 
unsigned char bdata State;             /*状态字节*/ 
sbit RedControl=State^6;             /*遥控状态*/ 

/*定时器T00 的高位定时参数为Timer,定时256*Timer+(80--336)个周期,共139Timer+(43~ 
182)us<37ms。定时器T01的高位定时节参数为nTimer,定时256*nTimer+(24~280)个周期, 
139nTimer+(13~152)us<9.1s。RedCon存放红外接收时的载波计数*/ 
unsigned char data RedCon,Timer; 
unsigned int nTimer;                 /*定时整型参数*/ 

void main() 

IEN0=0x14;                     /*只打开INT1中断*/ 
WDRST=0x1E;                 /*看门狗清0*/ 
WDRST=0xE1; 
WDCON=0x12;                 /*40-90ms看门狗(>最大延时37ms)*/ 
TCON=0x40;                     /*定时器1开始工作, INT1低电平触发*/ 
TMOD=0x23;                 /*定时器0扩展成两个8位定时器T00和T01用于同步控制*/ 
if((WDCON&0x30)!=0x30)         /*看门狗陷阱复位时无需初始化*/ 

Message=0;                     /*无消息*/ 
State=0;                     /*正常复位无任何状态*/ 

while(1)                     /*消息循环*/ 

WDRST=0x1E;                 /*看门狗清0*/ 
WDRST=0xE1; 
EX1= RedControl;             /*设置遥控中断INT1 */ 
if(RedMsg)                 /*执行遥控指令*/ 

EX1=0;                     /*在指令没有处理完之前不能重复中断*/ 
switch(RedDataH)             /*这里加入红外指令的控制过程*/ 

case 0x82:                 /*Channel 1*/ 
break; 
case 0xA0:                 /*Channel 2*/ 
break; 
      } 
EX1=1; 
RedDataL=0;                 /*复位红外数据*/ 
RedDataH=0;                 /*复位红外数据*/ 
RedMsg=0;                 /*复位红外遥控消息*/ 




void Count0(void) interrupt 1 using 3      /*定时器T00中断,最大定时37ms*/ 

if(Timer!=0)                     /*检测定时器T00的扩展高位*/ 

Timer--; 
return; 




/*INT1用于红外解码状态遥控解码数据处理,nTimer=1定时152~291us*/ 
void Inte1() interrupt 2 using 2 

for(nTimer=8;nTimer>1;nTimer--);    /*使处理周期达到51机器周期=27.7us使得 
RedCon<32*/ 
if(RedRead)                     /*0信号宽度a=420us,1信号宽度a=1260us,周期4a=1680us*/ 
RedCon++; 
else                        /*开始计数或者重新发送时开始计数*/ 

RedBit=0;                     /*复位接收位*/ 
RedCon=0;                 /*复位载波计数*/ 
RedRead=1;                 /*置位位接收标志*/ 
if(!ET1)                     /*首次接收时没有启动定时器T01接收第一个位*/ 

TF1=0;                     /*复位定时器T01溢出标志*/ 
ET1=1;                     /*启动T01 定时*/ 
RedDataL=0;                 /*复位红外数据*/ 
RedDataH=0;                 /*复位红外数据*/ 
RSend=0;                 /*复位重新发送标志*/ 




void Count1(void) interrupt 3 using 3    /*定时器T01中断,最大定时9.1s*/ 

if(nTimer!=0)                 /*检测定时器T01 的扩展高位*/ 

nTimer--; 
return; 

ET1=0;                         /*关闭T01 定时*/ 
if(RedRead)                     /*红外接收状态*/ 

if((RedDataL&0xF)==12)         /*第一阶段接收已经结束*/ 

RSend=1;                 /*置位重新发送标志以便校验*/ 
RedDataL&=0xF0;             /*复位位指针以便校验*/ 

if(RedCon>27-REDINT&&RedCon<27+REDINT)  
RedBit=1; 
else                        /*低电平计数9 表示0 27 表示1*/ 
RedBit=0; 
if(RSend)                     /*检验重复发送的数据是否与第一次符合*/ 

switch(RedDataL&0xF) 

case 0:                 /*检验重复发送的第1 位数据*/ 
if(RedBit!=RedData0)  goto RClear; 
break; 
case 1:                 /*检验重复发送的第2 位数据*/ 
if(RedBit!=RedData1)  goto RClear; 
break; 
case 2:                 /*检验重复发送的第3 位数据*/ 
if(RedBit!=RedData2)  goto RClear; 
break; 
case 3:                 /*检验重复发送的第4 位数据*/ 
if(RedBit!=RedData3)  goto RClear; 
break; 
case 4:                 /*检验重复发送的第5 位数据*/ 
if(RedBit!=RedData4)  goto RClear; 
break; 
case 5:                 /*检验重复发送的第6 位数据*/ 
if(RedBit!=RedData5) goto RClear; 
break; 
case 6:                 /*检验重复发送的第7 位数据*/ 
if(RedBit!=RedData6) goto RClear; 
break; 
case 7:                 /*检验重复发送的第8 位数据*/ 
if(RedBit!=RedData7)  goto RClear; 
break; 
case 8:                 /*检验重复发送的第9 位数据*/ 
if(RedBit!=RedData8)  goto RClear; 
break; 
case 9:                 /*检验重复发送的第10 位数据*/ 
if(RedBit!=RedData9)  goto RClear; 
break; 
case 10:                 /*检验重复发送的第11 位数据*/ 
if(RedBit!=RedData10) goto RClear; 
break; 
case 11:                 /*检验重复发送的第12 位数据*/ 
if(RedBit!=RedData11)  goto RClear; 
RedMsg=1;                 /*接受到经过检验正确的编码后置位遥控消息*/ 
RedBit=0;                 /*复位接收位*/ 
RSend=0;                 /*复位重新发送标志*/ 
RedRead=0;             /*复位接收过程标志*/ 
RedCon=0;                 /*复位载波计数*/ 
return; 
default:                 /*重复发送的数据多于12 位时判断为错误*/ 
goto RClear; 


else 

switch(RedDataL&0xF) 

case 0:                 /*保存首次发送的第1 位数据*/ 
RedData0=RedBit; 
break; 
case 1:                 /*保存首次发送的第2 位数据*/ 
RedData1=RedBit; 
break; 
case 2:                 /*保存首次发送的第3 位数据*/ 
RedData2=RedBit; 
break; 
case 3:                 /*保存首次发送的第4 位数据*/ 
RedData3=RedBit; 
break; 
case 4:                 /*保存首次发送的第5 位数据*/ 
RedData4=RedBit; 
break; 
case 5:                 /*保存首次发送的第6 位数据*/ 
RedData5=RedBit; 
break; 
case 6:                 /*保存首次发送的第7 位数据*/ 
RedData6=RedBit; 
break; 
case 7:                 /*保存首次发送的第8 位数据*/ 
RedData7=RedBit; 
break; 
case 8:                 /*保存首次发送的第9 位数据*/ 
RedData8=RedBit; 
break; 
case 9:                 /*保存首次发送的第10 位数据*/ 
RedData9=RedBit; 
break; 
case 10:                 /*保存首次发送的第11 位数据*/ 
RedData10=RedBit; 
break; 
case 11:                 /*保存首次发送的第12 位数据*/ 
RedData11=RedBit; 
break; 
default:                 /*首次发送的数据多于12 位时判断为错误*/ 
goto RClear; 


RedDataL++;                 /*位位移加1*/ 
RedBit=0;                     /*复位接收位*/ 
RedRead=0;                 /*复位接收过程标志*/ 
RedCon=0;                 /*复位载波计数*/ 
nTimer=423;                 /*用定时140a 检测同步信号208a*/ 
TF1=0;                     /*复位定时器T01 益出标志*/ 
ET1=1;                     /*启动定时器*/ 

else if(RSend)                 /*在位接收没有结束时发生定时中断需要复位接收信息(同步)*/ 

RClear: 
RedDataL=0;                 /*复位红外数据*/ 
RedDataH=0;                 /*复位红外数据*/ 
RedBit=0;                 /*复位接收位*/ 
RedRead=0;                 /*复位接收过程标志*/ 
RSend=0;                 /*复位重新发送标志*/ 
RedCon=0;                 /*复位载波计数*/ 
ET1=0;                     /*关闭T01 定时*/ 


关键字:Philips  87LPC768  红外解码 引用地址:Philips 87LPC768红外解码程序

上一篇:ADS7804 AD转换程序
下一篇:SPI串行接口AD转换器TLC2543的驱动程序

推荐阅读最新更新时间:2024-03-16 15:52

高瓴资本37亿欧元收购飞利浦家电业务
国际消费电子巨头飞利浦集团在3月25日宣布,已签署一项协议将其家用电器业务出售给高瓴资本,交易价值约为37亿欧元,交易预计将在2021年第三季度完成。据官网显示,飞利浦在家电业务的产品类型涵盖了:电饭煲、压力锅等厨房电器,智能门锁、电子保险柜等智能安防产品,空调、空气加湿器等空气处理产品,以及熨烫和清洁、水处理、饮品机等系列产品,2020年相关业务的销售额为22亿欧元(折合人民币169.6亿元)…… 此外,附加为期15年的品牌许可协议,按年支付,估计净现值约为7亿欧元,总交易额约为44亿欧元(折合人民币340亿元)。 资料显示,过去一年来,飞利浦一直谋求出售家电业务。
[家用电子]
高瓴资本37亿欧元收购<font color='red'>飞利浦</font>家电业务
两种红外解码方法(RC-5)
外部中断0服务程序内处理: /**************************************************************************** 函数功能: 外部中断0终端服务初始化函数 ****************************************************************************/ void ispInt0Init(void) { IT0 = 1; //低电平触发,INT0 (P3.2) EX0 = 1; //使能外部中断 EA = 1; //开总中断 } /***********************
[单片机]
红外解码数码管显示+串口接收
#include reg52.h #include intrins.h //*********************************************************** // TC9012 红外遥控接收数码管显示+串口接收-----成功! * //*********************************************************** #define uchar unsigned char //定义一下方便使用 #define uint unsigned int //unsigned char code dgw = {0xfe,0xfd,0xfb,0xf7};//数码
[单片机]
飞利浦心血管IT解决方案全新亮相2012长城国际心脏病学会
飞利浦医疗信息系统携其IntelliSpace心血管IT解决方案家族悉数亮相于北京举办的第二十三届长城国际心脏病学会议暨亚太心脏大会(GW-ICC & APHC)。    飞利浦医疗信息系统携其IntelliSpace心血管IT解决方案家族悉数亮相于北京举办的第二十三届长城国际心脏病学会议暨亚太心脏大会(GW-ICC & APHC)。    图1:飞利浦心血管IT解决方案亮相2012长城会   心血管是最为复杂的临床专业领域之一。作为全球知名的医疗保健集团,飞利浦凭借技术创新,在血管造影机、高端CT、心脏实时三维超声、重症监护及自动体外除颤器等领域构筑了绝对领先的技术及市场优势,成为心脏诊疗领域的领跑者。随着心血管疾病
[医疗电子]
<font color='red'>飞利浦</font>心血管IT解决方案全新亮相2012长城国际心脏病学会
PHILIPS公司32位FLASH MCU的优势
国际半导体贸易统计显示,8位芯片仍然占据着微处理器市场56%的销量和40%的销售额。最流行的8位INTEL架构的8051芯片平均每年销售33亿片-大约是32位PC微处理器销量的30倍。甚至最早于1971年面世的低端4位芯片的销量也只比它们的最高销量低15%。嵌入式系统开发者仍然在使用这些芯片,因为它们具有极低的价格、微功耗以及小的体积,可以为几乎任何应用增加智能化。 为了用功能更强大的器件取代8位和16位微控制器,PHILIPS半导体发布了基于ARM7的32位MCU的新产品线。PHILIPS知道以其自身的条件无法击败最小的MCU,但PHILIPS相信这样一个以较小尺寸制造的、具有额外性能的32位MCU可以使一些开发者抛弃他们节俭的
[嵌入式]
触摸点亮未来 飞利浦MUSE全屏触控技术
        好莱坞大片《少数派报告》中,有一个 镜头 令人印象深刻:汤姆克鲁斯在一个巨大的触控墙面前,用手指潇洒地指指点点,就完成了很多智能化的操作。在公众评选的“最有预见性的十部科幻片”中,《少数派报告》总是必选项。事实上,短短几年时间,电影中所演示的未来触控技术,现在已经走进了我们的生活,在数码领域得到了广泛应用。   最初,是让人适应机器,现在,是让机器来适应人。可以说,触控技术的产生为我们打开了一扇通往革命性人机互动的大门。在国内MP4领域,触摸屏革命其实早已开始,但由于成本、技术等原因没有形成气候。2010上半年, 飞利浦 配备触摸屏的MP4机型MUSE上市,不仅赢得了高涨的关注度,而且标志着MP4的人性化设
[电源管理]
触摸点亮未来 <font color='red'>飞利浦</font>MUSE全屏触控技术
33亿美元买下“飞利浦” 郑建明为何插手LED?
    在接下来的20年里,享誉全球的“飞利浦”商标将成为中国品牌。   荷兰当地时间3月31日,由“GO Scale Capital”(金沙江创业投资与橡树投资伙伴联合组成的基金)所牵头、亚太资源开发投资有限公司和南昌工业控股集团支持的并购基金,击败CVC资本、KKR资本、贝恩资本等国际私募巨头,以33亿美元的价格收购飞利浦旗下Lumileds 80.1%股权以及“飞利浦”商标20年使用权。   有业内人士向《华夏时报》记者表示,中国资本控股Lumileds以及持有“飞利浦”商标20年,除了资本运作之外,更大的意义在于打破了国际上对LED核心专利的垄断。   “冲着专利去的”   2015年2月12日,美国国际贸易
[手机便携]
加码遥控技术 飞利浦曲线布局智能电视
    2013年,随着一众互联网企业的加入,智能电视竞争渐趋激烈,价格下限也在不断刷新,而这个趋势在2014年将更加明显,据中怡康预计,2014年智能电视的销量将达3812万台,渗透率将达82.5%。可以说,智能电视的红海已经来临,不过,对于整个智能电视相关产业来说,蓝海才刚刚开始。     智能电视游戏市场就是蓝海之一,据市场研究咨询公司IHS的分析师预测,智能电视游戏市场将于2016年达到16亿美金,同时也有业内人士分析称,智能电视将会取代主机成为下一个最大的游戏平台。现有的电视遥控技术目前显然无法满足未来大型智能电视游戏的需求,在此情形下,智能电视的遥控技术就显的尤为重要,也吸引了一众厂商加码投入,而知名消费电子企业飞
[家用电子]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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