欢迎来到天天文库
浏览记录
ID:13650794
大小:316.50 KB
页数:21页
时间:2018-07-23
《红外遥控解码资料》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
51单片机红外解码程序http://www.hificat.com/dpj_step/compositive_7.htmlhttp://www.ceet.hbnu.edu.cn/bbs/viewthread.php?tid=1021、红外遥控系统2、org000h3、ljmpmain4、org0003h5、ljmpin0zd;外部中断0入口6、org000Bh7、ljmpt0zd;定时器T08、org0100h9、;主程序10、main:clrp2.0;选择数码管第一位(共阴)11、setbIT0;定时器T0设置12、setbEX013、setbea14、movTMOD,#02h;T0工作在方式215、movTH0,#00h;16、movTL0,#00h;T0赋予初值17、setbET0;打开中断18、setbp3.2;置位3.219、setbtr0;tr0置位20、main1:acallyyi;寄存器际初始化21、pp:jnb20h.0,pp;判断有无信号22、clr20h.0;有则清零20H.023、acalljy;接受到的数据是否正确,并显示24、sjmpmain1;跳转到MAIN125、;int0中断处理126、in0zd:jb20h.1,js;判断20H.1是1还是0.是1跳转JS(进入数据处理)是0说明接收的是引导码27、cjner7,#33h,next;为0,判断引导码是否正确(33h8);TR1=1;while(!TF1);TF1=0;TR1=0;}/***延时9ms*/voidDelay_9000us(void){TL1=153.6;TH1=223.6;TR1=1;while(!TF1);TF1=0;TR1=0;}/***延时4.5ms*/voidDelay_4500us(void){TH1=239.8;TL1=204.8; TR1=1;while(!TF1);TF1=0;TR1=0;}/***系统初始化*/voidSystemInit(void){IRIN=1;//外断0请求中断输入脚IT0=1;//INT0负跳变触发TMOD=0x10;//定时器1工作在方式1,16位定时计数器。EA=1;//允许中断EX0=1;//允许外断0允许位}/***读码*/unsignedcharGetCode(){unsignedcharn;statictemp=0;for(n=0;n<8;n++){while(!IRIN);//等待高电平,开始解码。IRIN=1退出循环 Delay_840us();//延时0.84msif(IRIN)//若仍然为高电平,则为1,否则为0{temp=(0x80|(temp>>1));//1while(IRIN);//等待跳变成低电平}else{temp=(0x00|(temp>>1));//0}}returntemp;}/***数码管显示*/voidLedDisp(){unsignedchari;for(i=0;i<4;i++){P0=table[disbuf[i]];P2=scan[i];delay(50);P0=0x00;}} voidmain(void){SystemInit();while(1){//以下是查表显示disbuf[0]=(((KeyValue&0xf0)>>4)&0x0f);disbuf[1]=KeyValue&0x0f;disbuf[2]=(((MaValue&0xf0)>>4)&0x0f);disbuf[3]=MaValue&0x0f;LedDisp();}}voidinterr_ir(void)interrupt0{/***用户码和机器码*/unsignedcharaddrl,addrh,num1,num2;EA=0;//先关闭外部中断0Delay_9000us();//检测9ms开始码if(IRIN){//检测是否为干扰信号EA=1;//重新开启外部中断0 return;//退出解码}while(!IRIN);//等待跳为高电平Delay_4500us();//检测4.5ms结果码if(IRIN){//检测是否为干扰信号EA=1;//重新开启外部中断0return;//退出解码}//读码addrl=GetCode();//用户编码高位addrh=GetCode();//用户编码低位num1=GetCode();//机器码num2=GetCode();//机器码反码//校验是否为错码if(num1!=~num2){KeyValue=14;EA=1;return;}KeyValue=num2;MaValue=addrh;EA=1; }代码分析(只分析关键部位):1.系统初始化SystemInit()系统初始化时,我们设置IRIN为高电平,同时把IT0设置成1,即下降沿(负跳变)触发中断。这是用于接收波形的引导码是从低电平开始的(如上面接收波形所示)。这样,当按下按键时,红外接收到信号,IRIN则发生从预先设置的高电平跳为低电平,从而产生中断。2.解码--中断程序 interr_ir(void)首先,第一步把EX0关中断,这步至关重要,因为一个接收波形许多的下降沿,这样会产生干扰中断。接下来,使用定期时0延时9ms,跳过开始码。注意,延时后,需要检测一下干扰信号。下一步,while(!IRIN);等待4.5ms高电平的到来,再延时4.5ms,跳过结果。引导码过后, 开始读码,执行GetCode():32位数据码,分4次读取,所以执行4次GetCode(),读取一个字节数据过程如下:unsignedcharGetCode(){unsignedcharn;statictemp=0;for(n=0;n<8;n++){while(!IRIN);//等待高电平,开始解码 Delay_840us();//延时0.84msif(IRIN)//若仍然为高电平,则为1,否则为0{temp=(0x80|(temp>>1));//1while(IRIN);//等待跳变成低电平}else{temp=(0x00|(temp>>1));//0}}returntemp;}1.从上述位定义看,位0和位1都是0.56ms的低电平过后,高电平开始延时。所以,读码的第一步while(!IRIN);是等待这个0.56ms的低电平之后的高电平。2.从高定平到后开始延时0.84ms3.判断0.84ms的波形高电平还是低电平。若仍然是高电平证明,该位为“1”,否则为“0”。到这里读码结束。3.校验 由于32位数据码中,后两个字节是键数据码和健数据反码。可以通过这两个字节数来实行校验。即,把前一个字节去反判读是否等于后一字节。
此文档下载收益归作者所有
举报原因
联系方式
详细说明
内容无法转码请点击此处