找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3817|回复: 3
收起左侧

AT89C2051红外遥控解码(C语言)程序文件 Main.C IR.h

[复制链接]
ID:70416 发表于 2014-12-13 22:42 | 显示全部楼层 |阅读模式
#include <reg52.h>
#include "IR.h"

sbit led = P3^7;

void main(void){   
    cpu_init();
led=1;   
    while(1){
  P1=~IRdata;
  isirinit=1;
  switch (IRdata){
   case 0x45:{     //在这里添加代码
     led=~led;
    break;
   }
   default:{
    isirinit=0;
    break;
   }
  }
  if (isirinit==1) IRdata=0xff;
}
}   

回复

使用道具 举报

ID:70416 发表于 2014-12-13 22:42 | 显示全部楼层
IR.h 文件:

#include <reg52.h>
#define msec_12p5  0x2d00  //Fosc=11.0592MHz   
#define msec_15  0x3600   
#define msec_9  0x2066   
#define msec_2p5  0x900    //#define msec_9  0x1066
#define msec_0p9  0x33d   
#define msec_1p68  0x610

typedef enum{   
             IR_idle,   
             IR_waitstart,            
             IR_getaddr,            
             IR_getaddrinv,            
             IR_getdata,            
             IR_getdatainv            
            }_IRstate;                  
  
_IRstate IRstate = IR_idle;   
  
unsigned char IRaddr=0xff;   
unsigned char _IRaddr=0xff;   
unsigned char IRdata=0xff;   
unsigned char _IRdata=0xff;   
unsigned char IR_repeat=0;   
unsigned char IR_ready=0;   
unsigned char  IR_poweron=0;

bit isirinit=0;  //是否刷新,即接到正确码
  
//bit ir_done=0;   
// time constants   
unsigned int IRtimer=0; // IR timeout   

//cpu初始化   
void cpu_init(void){     
    TMOD=0X11; // T0 and T1 十六位定时                  
    TH0=0xee;  //fosc=11.0592M,timer=5ms   
    TL0=0x00;   
    TR0=1; // run timer 0;   
    TF0=0;   
  
    ET0=1;  // enable tmr 0 overflow interrupt   
    IT0=1; // int0 edge sensitive   
    EX0=1; //  enable "int0"   
    EA=1;   // global interupt enable   
}
void tmrint() interrupt 1{ //T0中断      
    TH0=0xee;   
    TL0=0x00;   
    if (IRtimer)     //IR接收超时   
        --IRtimer; //   
    else  
    {   
        IRstate=IR_idle;   
//        IR_poweron=0;   
    }   
}     
//void IRint() interrupt 0(void)   
  
//When the IR receive pin goes low and interrupt is generated   
// IR is collected by starting timer 2 in the first falling edge of the in  
// then on every other falling edge, the timer value is saved and the timer restarted .     
// the captured time is then used to get the IR data   
// a "start of data" is 13.5Msec,a "1" is 2.25Msec,a "0" is 1.12 msec and a "repeat" is 11.25msec.   
// the counter increments at 1.085 Usec   
// I allow a fairly large tolerance to time jitter but there are no false triggers seen.   
  
void IRint() interrupt 0{   
    static unsigned char bits;   
    unsigned short time;

    switch(IRstate)   
    {   
        case IR_idle:   
            TL1=0;   
            TH1=0;   
            TR1=1;   
            IRstate=IR_waitstart;   
            IRtimer=26;   
            break;   
        case IR_waitstart: //P2_4=!P2_4;   
            TR1=0;   
            time=TH1;   
            time =(time <<8)+TL1;;   
            TL1=0;   
            TH1=0;   
            TR1=1;   
            if ((time > msec_12p5)&&(time < msec_15)) // greater than 12.5Msec & less than 15 msec = start code   
            {      
                IRaddr=0;   
                _IRaddr=0;   
                IRdata=0;   
                _IRdata=0;   
                bits=1;   
                IRstate=IR_getaddr;   
            }   
            else if ((time > msec_9)&&(time <  msec_12p5))// less than 12.5Msec  and greater than 9 msec =Repeat code   
            {        
                IR_repeat=2;   
                IRstate=IR_idle;   
            }   
            else   
            {           // to short, bad data just go to idle   
                IRstate=IR_idle;                  
            }                  
            break;   
        case IR_getaddr:    // P2_4=!P2_4;   
            TR1=0;   
            time=TH1;   
            time =(time <<8)+TL1;;   
            TL1=0;   
            TH1=0;   
            TR1=1;   
            if ((time>msec_2p5)||(time<msec_0p9))// if  > 2.5msec or shorter than .9Msec bad data , go to idle   
            {      
                IRstate=IR_idle;   
                break;   
            }   
            if (time>msec_1p68)// greater than 1.68Msec is a 1   
            {         
                IRaddr|= bits;   
            }   
            bits=bits<<1;   
            if (!bits)   
            {   
                IRstate=IR_getaddrinv;                  
                bits=1;   
            }   
            break;                 
        case IR_getaddrinv:  //P2_4=!P2_4;   
            TR1=0;   
            time=TH1;   
            time =(time <<8)+TL1;;   
            TL1=0;   
            TH1=0;   
            TR1=1;   
            if ((time>msec_2p5)||(time<msec_0p9))// if  > 2.5msec or shorter than .9Msec bad data , go to idle   
            {      
                IRstate=IR_idle;   
                break;   
            }   
            if (time>msec_1p68)// greater than 1.68Msec is a 1   
            {        
                _IRaddr|= bits;   
            }   
            bits=bits<<1;   
            if (!bits)   
            {   
                IRstate=IR_getdata;;                  
                bits=1;   
            }   
            break;                 
        case IR_getdata:   
            TR1=0;   
            time=TH1;   
            time =(time <<8)+TL1;;   
            TL1=0;   
            TH1=0;   
            TR1=1;   
            if ((time>msec_2p5)||(time<msec_0p9))// if  > 2.5msec or shorter than .9Msec bad data , go to idle   
            {      
                IRstate=IR_idle;   
                break;   
            }   
            if (time>msec_1p68)// greater than 1.68Msec is a 1   
            {         
                IRdata|= bits;   
            }   
            bits=bits<<1;   
            if (!bits)   
            {   
                IRstate=IR_getdatainv;                  
                bits=1;   
            }   
            break;                 
        case IR_getdatainv:   
            TR1=0;   
            time=TH1;   
            time =(time <<8)+TL1;;   
            TL1=0;   
            TH1=0;   
            TR1=1;   
            if ((time>msec_2p5)||(time<msec_0p9)) // if  > 2.5msec or shorter than .9Msec bad data , go to idle   
            {      
                IRstate=IR_idle;   
                break;   
            }   
            if (time>msec_1p68)// greater than 1.68Msec is a 1   
            {        
                _IRdata|= bits;   
            }   
            bits=bits<<1;   
            if (!bits)         // we have it all , now we make sure it is a NEC code from the CHS IR transmitter   
            {                   // make sure address,~address are correct , data ,~data are correct and address is 0.   
                IR_ready=((IRaddr^_IRaddr)==0xff)&&((IRdata^_IRdata)==0xff)&&(IRaddr==0);   
                if(IR_ready)   
                {   
                    IRstate=IR_idle;   
                }      
            }   
            break;                 
        default:   
            IRstate=IR_idle;   
            break;   
    }   
}   
回复

使用道具 举报

ID:70769 发表于 2014-12-21 04:35 | 显示全部楼层
很好,正需要
回复

使用道具 举报

ID:66287 发表于 2015-6-2 10:03 | 显示全部楼层
真不错的东东,顶一个
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表