微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 发个刚完成的使用的红外解码控制程序 本人初学 欢迎初学的发烧友点评交流 共同进步

发个刚完成的使用的红外解码控制程序 本人初学 欢迎初学的发烧友点评交流 共同进步

时间:10-02 整理:3721RD 点击:
/***无敌呆呆猫---2015/6/28晚21:18编写完成#51单片机NEC格式红外遥控码解码程序#
                                               留此纪念###                                                                                 ***/
#include<reg51.h>
#define wei P0
#define duan P1
sbit ird=P3^2;
unsigned int timelong;                //timelong T/C定时器计数值
unsigned char quke,timeok,a,b,yonghuma1_l,yonghuma1_h,yonghuma_l        //quke=躯壳 用户码低8位 高8位 按键码正8位 反8位
             ,yonghuma_h,anjianma1_z,anjianma1_f,anjianma_z,anjianma_f;                 
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){                                           //这个delay也可以去掉
                                        for(i=0;i<600;i++);}
                                               }
void main(){
                        EA=1;
                        EX0=1;
                        IT0=1;                                                
                        TR0=0;
                        TMOD=1;
                        TH0=0;
                        TL0=0;                        
                        b=0;
                        wei=0x00;
                        duan=0xff;               
                        while(1){                                                                                                                                                                                                                                                                                                                                                                     
                                           wei=0x80;                                      //如果不用数码管显示
                                           duan=zifuku[yonghuma_l/16];           //可以换成任何你想要
                                           delay(1);                                           //控制的器件 所以呢
                                           duan=0xff;                                           //这个红外解码程序
                                           wei=0x40;                                           //还是相当实用的
                                           duan=zifuku[yonghuma_l%16];           //控制LED灯什么的
                                           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;
                                if((timelong>13300)&&(timelong<13700)){timeok=1;}  //引导检测
                                if((timelong>2000)&&(timelong<2500)) {timeok=2;}   //码流1检测
                                if((timelong>875)&&(timelong<1375))  {timeok=3;}   //码流0检测                                          
                            switch(timeok){
                                           case 1:b=1;          //找到引导码 为后面程序提供开启钥匙
                                                                  a=0;
                                                                          quke=0;
                                                                  break;
                                                           case 2:quke=quke>>1;          //1赋值
                                                                  quke=quke|0x80;
                                                                  a=a+1;
                                                                  break;
                                                           case 3:quke=quke>>1;           //0赋值
                                                                  quke=quke|0x00;
                                                                  a=a+1;
                                                                  break;
                                                                                  }                                                                          
                                if(b){                //这个b是找到引导的标志 主要是防止没找到引导码而导致后面程序赋值出错
                                          switch(a){        
                                                                case 8:yonghuma1_l=quke;
                                                                                break;
                                                                case 16:yonghuma1_h=quke;
                                                                                break;
                                                                case 24:anjianma1_z=quke;
                                                                            break;
                                                                case 32:anjianma1_f=quke;
                                                                            break;
                                                                                         }
                                         }
                                if(a==32){b=0;                                                 //加这一级if主要是为了在解码失败的时候不影响到
                                          yonghuma_l=yonghuma1_l;         //动态数码管原来的显示值 如果不用数码管而是换成
                                                  yonghuma_h=yonghuma1_h;         //要控制的其他器件的话 这一级if也可以在解码失败
                                                  anjianma_z=anjianma1_z;         //时不影响到器件原先的工作状态 这个很重要!
                                                  anjianma_f=anjianma1_f;
                                                          }                                                         
                                                                                                                        
}                                                                                                                                                                                                                                                                                
                                                                /***感谢小榄辉对之前程序while过多 实用性差点评 这个程序是之前程序的改进型
                                                                          如果感兴趣的想试一试这个解码程序的发烧友  移植的时候后面的
                                                                               动态数码管显示得自己修改一下哦  我的板子被我改过了  不一样
                                                                                             照搬的话可能显示不了哦                           ***/

有改进,但是实际上做项目的时候,是不需要做解码显示的,红外线解码最简单的办法是用示波器,检测红外接收头信号波形。你可以试着实现下面功能,遥控器控制6-8个LED点亮与熄灭,同时,也要用轻触按键控制6-8GE LED,就好像一台风扇,既要用遥控器控制,当遥控丢失或者失效的情况下,就需要手动按键来控制你的风扇了,这样起码在遥控器丢失的情况下,不至于让风扇报废不能用。

猫有进步,按楼上说的继续改进

谢谢鼓励  我会加油的

抽空按你的建议改进了下 程序   还做成了实物电路板  改装了我的机械按键风扇  蛮好玩的  呵呵
                  http://bbs.elecfans.com/forum.ph ... d=496962&extra=

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

网站地图

Top