微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 只用一个for循环就能解码出红外遥控全码 历史上最简单的NEC红外遥控解码程序 被俺编出来啦 哇哈哈!

只用一个for循环就能解码出红外遥控全码 历史上最简单的NEC红外遥控解码程序 被俺编出来啦 哇哈哈!

时间:10-02 整理:3721RD 点击:
/***无敌呆呆猫---2015/6/25晚16:00编写完成#51单片机NEC格式红外遥控码解码程序#
                                               留此纪念###                                                                                 ***/
#include<reg51.h>
#define wei P0
#define duan P1
sbit ird=P3^2;
unsigned int timelong;                //timelong T/C定时器计数值
unsigned char quke,a,b,yonghuma_l,yonghuma_h,anjianma_z,anjianma_f;                 //quke=躯壳 用户码低8位 高8位 按键码正8位 反8位
unsigned char code zifuku[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,         //3641BG:4位共阳极数码管字符表
                             0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};
void delay (unsigned int a){                                 //用于保持数码管显示稳定
                        unsigned int i;
                        while(--a !=0){          
                                        for(i=0;i<600;i++);}
                                               }
void main(){
                        EA=1;
                        EX0=1;
                        IT0=1;                                               
                        TR0=0;
                        TMOD=1;
                        TH0=0;
                        TL0=0;
                                               
                        while(1){                                                                                  
                                         while((timelong<13000)^(timelong>14000));         //NEC引导码检测 引导码错误时 会一直处于检测状态 不向下走
                                         while(!ird);                                                                 //等待中断
                                         while(ird);                                                                 //等待中断
                                         while(!ird);                                                                 //防止第二个中断到来时 b的值误抢在中断前代入for循环                                         
                                         for(a=32;a>0;a--){                                                         //这个for循环高端大气上档次 一气呵成取出4个字节解码值 是这个程序的精髓
                                                        switch(a){       
                                                                                case 24:yonghuma_l=quke; //整个程序真正用于解码的就其实是这个短短的for循环
                                                                                                break;
                                                                                case 16:yonghuma_h=quke;
                                                                                                break;
                                                                                case 8:anjianma_z=quke;
                                                                                            break;
                                                                                case 0:anjianma_f=quke;
                                                                                            break;
                                                                                }
                                                                                while(b);                 
                                                                                                 quke=quke>>1;
                                                                                                 if((timelong>2000)&&(timelong<2500)){
                                                                                                                    quke=quke|0x80;
                                                                                                                                                  }
                                                                                                 if((timelong<875)&&(timelong>1375)){
                                                                                                                    quke=quke|0x00;              
                                                                                                                                                                  }                                                                                                                                                                                                                                                                                                   
                                                                                    b=1;
                                                                                                                                                                
                                                                                }
                                                                                         EX0=0;
                                                                                         delay(80);
                                                                                         EX0=1;
                       
                           while((timelong<13300)^(timelong>13700)){   //如果没有正确的新引导码出现 将一直显示解码值 不被没有引导码的红外输入干扰 新的按键被按下还能回到程序的开头重新解码                                                                                           
                                                                                                                   wei=0x80;                           //没找到正确的连续码资料 解码结尾还不够完善 待研究
                                                                                                                   duan=zifuku[yonghuma_l/16];           //3641BG:4位共阳极数码管
                                                                                                                   delay(1);                                           //4个8位解码值的段和位如果也建数组用for循环
                                                                                                                   duan=0xff;                                           //多级嵌套的话 这个程序本身就够精简了
                                                                                                                   wei=0x40;                                           //好像也省不了什么事......
                                                                                                                   duan=zifuku[yonghuma_l%16];
                                                                                                                   delay(1);
                                                                                                                   duan=0xff;                  
                                                                                                             
                                                                                                                   wei=0x20;
                                                                                                                   duan=zifuku[yonghuma_h/16];
                                                                                                                   delay(1);
                                                                                                                   duan=0xff;
                                                                                                                   wei=0x10;
                                                                                                                   duan=zifuku[yonghuma_h%16];
                                                                                                                   delay(1);
                                                                                                                   duan=0xff;
                                                                                                                  
                                                                                                                   wei=0x8;
                                                                                                                   duan=zifuku[anjianma_z/16];
                                                                                                                   delay(1);
                                                                                                                   duan=0xff;
                                                                                                                   wei=0x4;
                                                                                                                   duan=zifuku[anjianma_z%16];
                                                                                                                   delay(1);
                                                                                                                   duan=0xff;
                                                                                                                   wei=0x2;
                                                                                                                   duan=zifuku[anjianma_f/16];
                                                                                                                   delay(1);
                                                                                                                   duan=0xff;
                                                                                                                   wei=0x1;
                                                                                                                   duan=zifuku[anjianma_f%16];
                                                                                                                   delay(1);
                                                                                                                   duan=0xff;
                                                                                                                        }
                     }                                                                 
             }
void zdext ()interrupt 0{
                                          TR0=0;
                                          timelong=TH0*256+TL0;                                                                             
                                           TH0=0;
                                          TL0=0;
                                          TR0=1;
                                          b=0;                                   //b值用于 for循环与中断的有序同步  一中断一for循环
                                         }
                                                                /***如果感兴趣的想试一试这个解码程序的发烧友  移植的时候后面的
                                                                        动态数码管显示得自己修改一下哦  我的板子被我改过了  不一样
                                                                                         照搬的话可能显示不了哦                           ***/
                                                 

这个程序可以以解码,但是实用性很差,程序里用的while()语句太多了,很容易很程序死在某个地方,比如做个遥控器控制几个灯什么的,实现起来都有困难因为你的程序时间全花在等待上面,没有时间做其他事情。

额。我也不想啊  但我就会c语言的这5大循环语句  搞几晚上  做出来能解码  我还是有点小小的激动的

慢慢来,至少时序是看懂了。

谢谢分享谢谢分享

听了你的建议我又改进了下  做了个没有while  不浪费时间  能控制东西的解码   你给看看有啥毛病么
http://bbs.elecfans.com/jishu_490951_1_1.html

优化代码,学习无止境啊

小编,quke 是怎么获得值得?

他们说我这个while太多   你还是看看我改进过的另一个吧  解码都在中断里面完成 http://bbs.elecfans.com/jishu_490951_1_1.html

学习了,谢谢啊!

可以放一个break

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top