久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4647|回復: 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;
}
}   

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲免费三区 | 国产在线高清 | 亚洲成人免费视频在线 | 亚洲国产成人精品一区二区 | 国产精品入口久久 | 国产精品一区一区 | 亚洲日本欧美日韩高观看 | 久久久久久国产精品 | 中文字幕成人在线 | 亚洲视频在线观看 | 午夜精品久久久久久久99黑人 | 中文字幕免费在线 | 九色在线视频 | 青青草久久| 亚洲一区视频在线 | 国产精品久久av | 久久国产一区 | 日韩中文字幕 | 夜夜草 | 日韩成人在线观看 | 久草青青| h片在线免费观看 | 亚洲国产精品99久久久久久久久 | 成人免费观看男女羞羞视频 | 久久激情五月丁香伊人 | 91在线看 | 日本不卡一区二区三区 | 日韩欧美一区二区在线播放 | 免费一看一级毛片 | 久久999 | 午夜电影福利 | av黄色在线播放 | 日韩在线观看一区二区三区 | 黄网站免费在线看 | 国产精品综合色区在线观看 | 久久久做 | 视频二区在线观看 | 日韩在线免费视频 | 久久久久久久久国产成人免费 | 91精品国产91久久综合桃花 | 国产福利91精品 |